微积分 · 牛顿法

牛顿法

牛顿法用来逼近f的根,做法是反复同一步:从猜测值xₙ出发,作曲线在(xₙ, f(xₙ))处的切线,把它与x轴的交点当作下一个猜测值。拖动起点,看它怎样快速收敛、陷进循环或越跳越远。

牛顿法与本页画面

牛顿法用来逼近f的根,也就是满足f(r)=0f(r) = 0的数r,做法是反复同一步。在当前的猜测值xnx_n处,作图像在(xn,f(xn))(x_n, f(x_n))的切线L(x)=f(xn)+f′(xn)(x−xn)L(x) = f(x_n) + f'(x_n)(x - x_n)。在xnx_n附近切线贴着曲线,所以切线和x轴的交点,比xnx_n更接近曲线和x轴的交点。解L(x)=0L(x) = 0就得到下一个猜测值。图上的每一步,先沿淡虚线从xnx_n走到曲线上,再沿切线走到x轴。

牛顿法的一步,要求f′(xₙ) ≠ 0
xn+1=xn−f(xn)f′(xn)x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}

记误差en=xn−re_n = x_n - r。若r是单根(f′(r)≠0f'(r) \ne 0),f的二阶导数连续,把这一步做泰勒展开,在xnx_n已经靠近r时得到en+1≈f′′(r)2f′(r) en2e_{n+1} \approx \frac{f''(r)}{2f'(r)}\,e_n^2。误差平方一次,正确的位数大约翻一倍。x² − 2从x₀ = 1出发,误差依次是0.086、0.0025、2.1 × 10⁻⁶、1.6 × 10⁻¹²,读数条上的en/en−12e_n/e_{n-1}^2稳定在1/(22)≈0.3541/(2\sqrt2) \approx 0.354附近。离根远时没有这样的保证。若f′′(r)=0f''(r) = 0,平方项消失,收敛还要更快:arctan x的误差约为−23en3-\tfrac23 e_n^3,每步立方一次。

这一步要求f′(xn)≠0f'(x_n) \ne 0。水平的切线和x轴不相交,几乎水平的切线交得很远:x² − 2从0.1出发,第一步落在10.05。牛顿法失败时也不一定越跳越远。x³ − 2x + 2在0处的切线落在1,在1处的切线又落回0,0附近的起点会被拉进这个循环:数列有界,却没有极限。arctan x有一个分界α ≈ 1.3917,满足2α=(1+α2)arctan⁡α2\alpha = (1 + \alpha^2)\arctan\alpha。|x₀| < α的起点会收敛,超过它的起点每一步都落到另一边更远处。“所有起点”按每个起点的去向给x轴上色。x³ − 2x + 2在[−3, 3]里约有五分之一最后陷进循环,其中有许多窄段,越靠近两个水平切点±2/3\pm\sqrt{2/3}越密。把起点换成复数,这些窄段就成了牛顿分形。

在重根处f′(r)f'(r)也等于0,平方的效果没有了。(x−1)2(x - 1)^2的一步恰好是xn+1=(xn+1)/2x_{n+1} = (x_n + 1)/2,误差每步减半。这是线性收敛,大约3.3步才多一位小数。在m重根附近,比值en+1/ene_{n+1}/e_n趋于(m−1)/m(m - 1)/m。

值得注意

  • 牛顿在1669年讨论过方程x3−2x−5=0x^3 - 2x - 5 = 0。用今天的牛顿法从2出发,依次得到2.1、2.0945681、2.0945514817,三步后小数点后九位已经正确。
  • 对f(x)=x2−af(x) = x^2 - a,一步是xn+1=12(xn+a/xn)x_{n+1} = \tfrac12\left(x_n + a/x_n\right):这就是古老的开平方法,把猜测值和a除以它的商取平均。

操作

  • 沿x轴拖动蓝色的点x₀,或在x轴上按一下把它放到那里。它会吸住0.5的整数倍。
  • 设定n,图上就画出前n步;按n → ∞则一步一步走到n = 10。记录屏留下每一步的xₙ和误差,到根、碰到水平切线或超过10⁶时提前停下。
  • 打开“所有起点”,按每个起点的去向给x轴上色。

相关概念