带有代码的微积分历史发展





5.00/5 (15投票s)
展示微积分及其前身发展的主要里程碑
引言
我敢肯定,大多数读者和专业开发人员在使用微积分的简单公式时,或多或少都经历过,因为几乎任何现实的物理引擎在某种程度上都需要微积分来正常运行。但你知道它错综复杂的故事吗?除了它是牛顿和莱布尼茨发明的这个概念之外?我将展示,这项发明几乎花了 100 年的时间在数学上分享不同的发展,并且也许是所有数学中最有用、最通用、最重要的工具,在开始思考微积分之前就已经需要了。我知道阿基米德在 2000 多年前就使用了他的穷竭法,该方法发表在他的著作《方法》中。但直到 19 世纪,那本书才被广泛阅读,因此对现代微积分的发展几乎没有影响。(好吧,我刚意识到我把大约 1600 年到今天称为现代。)本文的核心思想也是展示数值方法的发展实际上是这些性质最初被发现的方式,所以让我们开始这段旅程。
对“零”的数学追寻
发展始于法国南部和今天的意大利北部地区。然而,由于缺乏公开的期刊,事物经常并行发生,通常发生在贸易城市,似乎是因为人们开始提出正确的数学问题,并分享或炫耀自己能解决这个问题。随着这些问题和答案的出现,又有了进一步的发展;新的工具来简化旧问题,这有助于解决新的更难的问题。
在意大利,试图求解三次和四次多项式方程的竞赛带来了一些重要的额外发现,例如从其解中出现了复数。而这里对一个用于书写和求解这些方程的有效工具的需求,导致了代数的早期发展,我认为这可能是代数史上最重要的数学发展。而最显著的发展发生在 1550 年到 1650 年之间,当时代数语言开始呈现现代形态,并引入了现代数学的符号 +, -, *, / 和 =。这一发展中的一个主要人物是法国数学家(或者我应该说律师,因为那是他的职业,而且在这个时期,法国的顶尖数学家似乎都是律师。)维埃特(Viete)1540 - 1603(有时拼写为 Vieta 或 Vietæ。都是同一个人)出版了他那个时期的代数领域的一本里程碑式的著作。他还拥有一个早期更粗糙版本的牛顿-拉夫逊求根方法(牛顿在发现自己的方法之前就知道它),并广泛研究了分圆方程的根。他还担任过密码破译员,并因破解敌人的密码而被敌人指控为巫术。
那么,代数为什么如此重要?现代代数工具使得扩展解、连接数学领域和通过简化证明来组织结果成为可能。至少,它是函数论发展的一个必要工具。简而言之,它是最基本的数学工具。近年来,在开发需要代数的编程语言时,许多设计编程语言的人最初都是受过代数教育的。简而言之:没有代数,这个世界将会不同。
这段旅程始于几何学和对特定函数下方的面积的寻找。很快就发现,他们都需要一个几乎为零的数,你可以用它来除法和乘法。一个数字或一个函数,它近似于一个非常小的数,用现代形式表示为:\(\lim\limits_{\epsilon \to 0} \frac{f(x)}{\epsilon}\)。16 世纪和 17 世纪,在地中海西北部地区,各种形式的关于这个主题的想法层出不穷。
积分公式
以以下形式的积分公式:
首先由意大利的卡瓦列里(Cavalieri)开发。然而,它并不是一个直接给出公式的方法,他为 n 从 1 到 9 的公式提供了几何证据。并据此推断,这对所有幂都成立。
第一个给出通用证明的是费马(Fermat),他采用了一种更具几何性的方法,结合了代数,并得到了所有 n 的通用公式。费马找到的公式非常通用,甚至对分数幂也成立。
但是,展示起来有点复杂,所以在这里我将先向您展示一种方法,该方法以一种绝对巧妙的方式开发整数幂的求和,最终会得到积分公式。这是由一位与费马一生都有通信往来的人,帕斯卡(Pascal)开发的,这次通信揭示了由这两位男士开创的许多新的数学发展。我们从帕斯卡(Pascal)杰出的著作(书籍)《算术三角形》(Arithmetical triangle)及其精彩的求和公式发展开始。您会惊讶地发现它易于理解且写得非常好。与现代教科书相比,这本书会向您展示大量的计算示例。回到当前的问题;帕斯卡(Pascal)开始想要找到这个和:
他使用了二项式定理,我相信大家以前都见过这种形式:
现在帕斯卡(Pascal)令 b = -1,并令 a 从 1 到 m。不可否认,帕斯卡(Pascal)并没有完全按照这个来做,所以为了简化,我们只使用一个简单的捷径。写出来是:
帕斯卡(Pascal)还将方程的第一项移到左边,重新排列方程得到 $m^k - (m-1)^k$。
如果我们分别对每一列进行求和,我们就会得到以下和:
这个设置揭示的是,你可以将下一个幂级数和写成前一个低阶和的组合。帕斯卡(Pascal)并没有止步于此,他在《算术三角形》一书中继续阐述,接下来给出了不同等差数列的求和公式,例如 $4+ 8+ \cdots + n*4$/,这通常被认为高斯(Gauss)年轻时使用过类似的公式来解决老师给他的问题。证据是轶事,所以我们不知道确切发生了什么,但高斯(Gauss)(或者你自己)真正需要做的就是阅读帕斯卡(Pascal)的书!但我们寻求的是相反的关系,从幂和范围,我们想要求和公式。我们得到了一个方程组,其中 k 个未知数需要从 k 个方程中解出。帕斯卡(Pascal)手动处理了几个求和,但我们将使用矩阵和现代理论来求解该系统。我们写出任意幂级数和的方程:
这里用现代矩阵和向量写成方程要简单得多:
变量为:
所有幂的未知求和公式(最多到 n)表示为一个向量:
上限的幂也表示为一个向量:
我们如何求解这个方程组,以便将求和公式放在左侧,而所有已知系数放在右侧?现在,这里有一个疯狂的想法。让我们用一个方程组除以另一个方程组。我们就是这么做的。但总的来说,方程的求逆需要被正确理解,这实际上只是另一种描述除法的方式。矩阵表示法被解释为与普通数字相同。然而,与普通数字运算不同的是,我们假设 a 和 b 只是普通的数字:a = 1 会得到 $a^{-1} = \frac{1}{a}$,因为 $\frac{a}{a} = 1$。矩阵有一个更大的问题。问题在于 $a \cdot b$ 可能不等于 $b \cdot a$。
我记得年轻时在解方程组时很懒。我厌倦了在数字后面写 x、y 和 z。
我在那里做了一件非常老的习惯,你很可能在不经意间也在这样做。我将我要解的未知量命名为 x、y 和 z,而计算时已知的常数则从 a、b 和 c 等开始。
这实际上是 1650 年左右,由笛卡尔(Descartes)引入的想法。维埃特(Viete)曾提出使用元音和辅音来区分它们,但我很高兴这没有被保留下来。我对需要进行计算的数字比变量更感兴趣,所以出于方便,我只在顶部写了一次未知数。
更常见的是将其写在矩阵的侧面:
继续关于将两个矩阵相乘会发生什么的思路。这很容易证明。我们从假设第一个矩阵给出 A1 和 B1 与 A2 和 B2 之间的关系开始:
我们有另一个矩阵,它表示 A2、B2 与 A3 和 B3 之间的关系:
第二个方程是:
我们可以用最后一个方程组替换 A2 和 B2:
现在我们写出输出 A1 和 B1 与输入 A3 和 B3 之间的关系:
将 A2 和 B2 的值代入后,完整的方程为:
完整的矩阵为:
两个矩阵相乘的通用公式可以通过归纳法证明,最终结果为:
有了所有必要的工具,我们回到寻找求和公式的问题,现在可以这样解决:
我们得到解的形式为:
矩阵的求逆可以通过求解简单的线性方程组来完成。我们简单地设置:
通过在等号两边进行相同的行运算来求解,以得到最初在右侧的单位矩阵,并在左侧产生单位矩阵。完成之后,您将在右侧获得逆矩阵。
然而,通过使用我向您展示的普通高斯消元法等标准分析技术,数值误差可能非常高。甚至很容易构造出在数值方法中会爆炸的矩阵。但仍然,高斯消元法被广泛使用,原因是目前还没有现实世界的问题表现出使高斯算法在计算机上数值不稳定的那种矩阵结构。这个论点可以通过使用随机矩阵来说明,并且出现这种矩阵的可能性极小。实际上,在尝试在计算机上求解一般方程组时,低截断误差很难实现。
要解决一个通用的未知矩阵,推荐的技术是使用 Householder 变换。如果有一个带有标准函数的矩阵库,那么生成(此处给出的代码并非最优,为简化起见)Householder 方法的 QR 变换的代码:
/// <summary>
/// Householder QR method
/// </summary>
/// <param name="A">QR transformation will be done on the A matrix </param>
/// <returns>A touple with the orthogonal matrix Q and the triangular matrix R</returns>
public static (MathMatrix Q, MathMatrix R) QR(this MathMatrix A)
{
MathMatrix R = A.Clone();
MathMatrix Q = new MathMatrix(A.Rows, A.Columns);
Q = Q.Eye();
for (int k = 0; k < A.Columns - 1; k++)
{
// Get the column part that is going to change
MathMatrix v = R.GetColumn(k);
//TODO: Optimize the code
// Optimalization to the code can be done here. set items above diagonal in matrix vector to zero
// this is normally not done since the zero elements are not really needed
// it just simplifies the general code used at a later stage (as I have implemented it).
for (int i = 0; i < k; i++)
v[i] = 0;
// Size and direction of the reflection
v[k] += sgn(v[k]) * v.Norm();
// Making v a unit vector
v /= v.Norm();
//TODO: Optimize these op+erations too
// v is a vector but also matrix (the full matrix is used here, and that is really not needed)
R -= 2 * v * (v.Transpose() * R);
Q -= 2 * v * (v.Transpose() * Q);
}
return (Q, R);
}
它的强大之处在于 Q 的逆是其转置,因为它是正交的。R 的逆通过回代法找到,因为它是下三角矩阵。就帕斯卡的公式而言,我只需要回代法。但是,在不解释基本原理的情况下提供代码可能会让你对如何处理矩阵产生错误的认识。此外,我想以后扩展这篇文章以对矩阵进行更通用的处理,所以这一节到时候会派上用场。
最终结果是代码将返回所有幂(最多到 k)的求和公式:
然而,我们还没有完成求和公式的发展,因为这是关于积分的。我相信大家都很熟悉柯西和(Cauchy sum)的概念,即使你们从未听过这个名字,它对一个函数进行积分时会累加有限数量的矩形。柯西和与黎曼和(Riemann sum)之间的唯一区别是,黎曼使用无限多个切片来定义积分,而柯西使用有限个。这在最终结果上造成了巨大的差异,但通常只对理论函数有意义。在实践中,对于正常且足够光滑的函数,柯西和就足够了。这是数学家用来描述函数“看起来不错”的一种方式。
我们现在将求和改为对 dx 求和,或者更确切地说是 $\delta x$。帕斯卡(Pascal)也注意到求和与积分公式之间存在清晰明显的联系,但并未扩展到简短提及。接着,我们计算有限的相似区间,实际上我们得到了一个关于积分误差的不错公式:
让我们开始使用结果来做一些事情。假设通过以下方式来处理积分更有趣:
将 0 替换为 1 并不会改变任何事情,因为右侧的 f(0) = 0。因此,dx = C/n 被代入函数 f(dx k),其中 k 属于 [0, n]。我们需要用 C 替换 n 值,从而确保 C 除以 dx 是一个整数 n。将其代入二项式定理,对 a 和 b 进行代入,可以证明它确实是公式。将 n = C/dx 代入找到的公式,也可以在没有 for 循环的情况下进行求和。
int ModifiedUpperBound = (int)((double)UpperBound / dx);
ManualSum = 0;
for (int i = 1; i <= ModifiedUpperBound; i++)
{
ManualSum += Math.Pow(i*dx, (double)Power);
}
ManualSum *= dx;
DoubleTable = MatrixExtentions.PascalTriangle(Power+1, 1, 0).ChessPattern();
SolvedDoubleTable = DoubleTable.InvertMatrix_LowerTriangular(DoubleTable);
int n = SolvedDoubleTable.Columns;
MathMatrix mm = new MathMatrix(n, 1);
for (int i = 0; i < n; i++)
{
mm[i] = Math.Pow(ModifiedUpperBound, i + 1);
}
SumSolution = SolvedDoubleTable * mm;
FormulaSum = Math.Pow(dx, Power+1) * SumSolution[SumSolution.Rows-1, SumSolution.Columns-1];
这是欧拉-麦克劳林求和公式(Euler-Maclaurin summation formula)的离散类比,费马(Fermat)也知道这个公式的一个版本。他使用几何论证来推导和证明它,而我使用了帕斯卡(Pascal)推导的二项式求和公式来证明它。好吧,证明有点强。我向您展示了一条可以用来证明它的途径。
差分公式
我们经常使用但乍一看很少解释其来源的公式:
这里关于微分符号的一个快速说明。d 代表差分,并首次由莱布尼茨(Leibnitz)使用。顺便说一句,积分的相同符号也来自莱布尼茨(Leibnitz)在同一篇论文中提出的。
我们代入值 x 和任意小的偏移量 dx。通常,我们保留 dx 来表示一个无穷小的数。在数学上,我们经常写成 $ dx = \lim\limits_{\Delta x \to 0} \Delta x $。这个符号来自伯努利(Bernoulli),他于 1706 年首次使用,并被广泛采用。情况是,我们寻求一个非常小的实数,它不为零,因为我们不能除以零。Delta 和 d 之间的区别在于,一个给定距离是小的,而另一个是一个无穷小的距离,它是在没有极限的情况下定义的。
我们只包含前几项:
减去并除以:
我们得到导数的通用表达式:
用现代术语(即欧拉之后)表示:
开发的二项式公式可用于理解微分规则。取标准公式:
在二项式展开方面,我们可以写一个类似的公式:
我们发现,与仅包含 x 值的函数的结果相同,只是这次我们分别得到了 x 和 y 导数的和。这有点复杂,但本质上,一旦你明白了它是如何完成的,就很容易普遍推导出来。使用符号包,这相当直接。
var x = Expr.Variable("x");
var y = Expr.Variable("y");
var dx = Expr.Variable("dx");
var dy = Expr.Variable("dy");
ExpandedDx = ((x + dx).Pow(2).Expand().Subtract(x.Pow(2))).Divide(dx).Expand().Substitute(dx, 0).ToString();
ExpandedDy = ((y + dy).Pow(2).Expand().Subtract(y.Pow(2))).Divide(dy).Expand().Substitute(dy, 0).ToString();
许多人认为分数二项式公式促进了微积分的进一步发展,最终导致了泰勒(Taylor)和麦克劳林(MacLaurin)公式。但有充分的证据表明,苏格兰数学家詹姆斯·格雷戈里(James Gregory)早在 17 世纪 70 年代就开发了泰勒级数。泰勒(Taylor)和麦克劳林(MacLaurin)直到 1700 年后才发表他们的发现。而格雷戈里(Gregory)来自苏格兰,一生大部分时间都在那里工作,他出国学习了微积分的“基本”构成模块,他去了意大利学习那里的数学发展,其中看到了卡瓦列里(Cavalieri)的公式。在回程途中,他出版了一本书,系统地整理了他在意大利学到的东西,这本书使他被皇家学会接纳。回到苏格兰后,他也独立于牛顿(Newton)开发了二项式公式。实际上,他在很多方面都比牛顿(Newton)更胜一筹,他似乎更像一个现代数学家,并且能更好地把握全局。尽管牛顿(Newton)在理解物理学和让事物(如望远镜)正常工作方面似乎比格雷戈里(Gregory)好得多,而他们两人都做了这些。不幸的是,格雷戈里(Gregory)年仅 38 岁就死于可能是心脏病。
至于牛顿(Newton)发现微积分,20 世纪 20 年代出现了一篇文本(参考:Simmons),其中牛顿(Newton)承认他从费马(Fermat)那里借鉴了大部分关于微积分构件的想法。事实上,费马(Fermat)在牛顿(Newton)写他的论文之前就已经发展了使用导数寻找曲线的最大值和最小值点的思想。因此也最小化了到达折射定律(Snell's law of refraction)的时间。尽管斯涅尔(Snell)并不是第一个注意到这个公式的人,而且它似乎首先出现在托马斯·哈里奥特(Thomas Harriot)的一篇文本中。至于莱布尼茨(Leibniz),到 1673 年,他已经进展到阅读帕斯卡的《圆的弦》(Traité des Sinus du Quarte Cercle),正是在他大部分自学研究的过程中,莱布尼茨(Leibniz)说:“一道光闪现了”。在许多方面,牛顿(Newton)和莱布尼茨(Leibnitz)之间唯一的区别似乎是牛顿(Newton)从费马(Fermat)那里获得了启发,而莱布尼茨(Leibnitz)从帕斯卡(Pascal)那里获得了启发,以进一步发展微积分。
参考文献
这里有怀尔德伯格教授(Prof. Wildburger)关于数学史的完整系列讲座: Youtube 讲座播放列表
讲座通常遵循约翰·斯蒂尔韦尔(John Stillwell)的《数学及其历史》(Mathematics and Its History)一书。
其他优秀的数学和历史书籍包括维克多·J·卡茨(Victor J. Katz)的《数学史》(History of Mathematics)以及一本我认为可能是我读过的最好的数学教科书之一:《微分方程及其应用和历史笔记》(Differential equations with applications and historical notes),作者是乔治·F·西蒙斯(George F. Simmons)。为了求解一般方程组,本文使用了特雷费森(Trefethen)和鲍(Bau)合著的《数值线性代数》(Numerical linear algebra)一书。
另一本伟大的数学史经典著作是赫尔曼·H·戈德斯坦(Herman H. Goldstine)的《数值分析史——从 16 世纪到 19 世纪》(A History o fnumerical analysis - From the 16th through the 19th century)。尽管其范围比之前的教科书要窄得多。