Python基础数学

1 投票
3 回答
3797 浏览
提问于 2025-04-18 03:42

在你们开始给这个问题点踩之前,我想先解释一下,我还很年轻,正在努力学习Python。学校里根本没有资源让我学习这种数学。

我正在做一个练习,内容是这样的:

写一个叫做myPi的函数,它会返回一个对PI的近似值(3.14159...)。使用莱布尼茨的近似方法。具体内容可以在这里找到:http://en.wikipedia.org/wiki/Leibniz_formula_for_%CF%80

他们展示了如何计算,像这样:http://upload.wikimedia.org/math/9/e/8/9e804b8a1a11e442be93fed1d52205a9.png

我完全不知道怎么在Python里计算这个。我是说,我连怎么正常计算都不知道,因为这东西是无限的,我该怎么计算呢?

还有一个问题。我真的需要这么高级的数学才能以后写程序吗?我很多朋友在12、13岁的时候就学会编程了,他们没有遇到什么问题。那么高级数学真的那么重要吗?我怀疑我的朋友们在学习的时候甚至都不知道怎么计算圆的面积。

3 个回答

1

要解决这个问题,我们可以考虑以下几点:

这个和的分数部分是:

-1/3+1/5-1/7+1/9 ...

这里有什么规律呢?首先,符号显然是每个数字交替变化的。接下来,分母从 3 开始,每次迭代加 2。这和初始值 1 结合起来,就形成了维基百科页面上表示的数学和。

Sum(-1^n/(2n+1))

那么,如何用代码来表示呢?

在99%的编程语言中,如果你想表示一个和,也就是基于某个输入数字(n)的公式,然后再加上(n+1)计算的值,你应该考虑使用 for loop。在Python中,我们可以这样表示这个和:

def approximate_pi(iterations):
    sum = 0
    for n in range(iterations):
        sum += (-1)**n/(2*n+1)
    return sum*4

这样的话,给定一个有限的迭代次数,就可以计算出π的一个近似值。迭代次数越大,结果就会越准确,但运行时间也会增加。

不过,Python有一些快捷方式,让这变得更简单。第一个是内置函数 sum,它可以返回一个列表中所有数字相加的结果。接下来是 list comprehension,它可以根据一些输入参数生成一个列表。这让我们原来的函数简化成了以下形式:

approximate_pi(iterations):
    return 4*sum([(-1)**n/(2*n+1) for n in range(iterations)])

这基本上做了同样的操作,只是用一种对Python来说更高效的方式(因为在Python中,for循环的开销比较大),而且看起来更接近原始的数学表示。

3

鉴于@jonrsharpe已经对具体问题给出了很好的回答,我想补充一些关于学习Python或任何编程语言的一般信息,以及需要多少数学知识。

很多教程通过重现已经有解决方案的问题来教编程,这种方法常被称为“重新发明轮子”。这种策略可以教会你如何解决特定问题,以及如何处理类似的问题。

不过,为了让学习过程更有效,你应该专注于那些你能理解或能想象出解决办法的问题。否则,你会在需要学习的两个方面迷失:工具(编程语言)和策略(在这种情况下,就是使用数学)。

我的建议是,想想你想做的事情。可以从简单的任务开始,比如读取文本文件、解析和转换文本,或者做一些小游戏,比如井字棋、猜单词、记忆游戏等。然后把问题拆分成更小的部分,逐个解决。例如,你可能不知道怎么画一个井字棋的棋盘,那么首先你可以学习如何画一条线和一个圆。接着,你可能不知道怎么让电脑聪明起来和你对战,那就先做成你和另一个人对战的游戏,依此类推。

如果你刚开始学习编程,可以看看Code Club的练习。这些练习虽然比较基础,但仍然具有挑战性。

一旦你对Python语言感到熟悉,可以开始看看其他人写的代码。由于Python模块通常是开源的,你可以在PyPi上搜索任何你感兴趣的话题,学习别人是如何解决问题的。

如果在某个时候你感到迷茫,也可以加入#Python频道,这是在Freenode IRC网络上的一个社区,耐心一点,你会找到愿意帮助你并给你一些指导的人。

5

针对你的第一个问题,“如何计算一个无限级数”,答案是要对它进行近似,通常有两种方法:

  1. 设定一个具体的步骤数“我希望它花费这么长时间”);或者
  2. 直到每一步的变化量低于一个指定的容忍度“我希望它这么准确”)。

为了说明这两种方法(这里有一些相对高级的Python代码 - leibniz_series是一个生成器,用来减少两个实现之间的重复代码,它只要你继续请求,就会不断输出级数中的项):

def leibniz_series():
    """Generator producing the Leibniz series (1, -1/3, 1/5, -1/7, ...)."""
    numerator = denominator = 1.0
    while True:
        yield (numerator / denominator)
        numerator *= -1
        denominator += 2

def pi_steps(steps=100):
    """Calculates pi from the Leibniz series with a defined number of steps."""
    values = leibniz_series()
    output = 0
    for _ in range(steps):
        value = 4 * next(values)
        output += value
    return output

def pi_tolerance(tolerance=0.0001):
    """Calculates pi from the Leibniz series with a defined output tolerance."""
    values = leibniz_series()
    output = 0
    value = 4 * next(values)
    while abs(value) > tolerance:
        output += value
        value = 4 * next(values)
    return output

至于第二个问题,“编程需要知道(高级)数学吗”,答案其实是“这要看你在做什么”。你想写一个有物理引擎的游戏吗?如果没有运动方程,那会非常困难!但也有其他事情,你只需要简单的加减法,比如处理列表的索引等。

这个具体的练习更多的是使用软件来完成一个重复的任务,而不是实际计算π(反正math.pi已经可以直接用!)如果你在这个阶段对数学不完全理解也没关系;重要的是能够理解任务(对一些莱布尼茨级数求和,然后把结果乘以4),以及如何把这个任务分解成可以用代码表示的步骤。

撰写回答