呵呵,做了一回标题党,可能说得夸张了一点。说是“终极算法”,主要是因为它可以任意提高精度、而且几乎可以应付任何非线性方程(至少理论上是这样),提高精度是已知的迭代式上添加一些项,而不是完全改变迭代式的形式,当然在提高精度的同时,计算量也会随之增大。其理论基础依旧是泰勒级数。

我们考虑方程$x=f(y)$,已知y求x是很容易的,但是已知x求y并不容易。我们考虑把y在$(x_0,y_0)$处展开成x的的泰勒级数。关键是求出y的n阶导数$\frac{d^n y}{dx^n}$。我们记$f^{(n)}(y)=\frac{d^n x}{dy^n}$,并且有
$\frac{dy}{dx}=\frac{1}{(\frac{dx}{dy})}=f'(y)^{-1}$

并且根据公式:$y^{(n)}=y'\frac{dy^{(n-1)}}{dy}$,可以继续求出二阶导数、三阶导数:
$\frac{d^2 y}{dx^2}=\frac{d(f'(y)^{-1})}{dy}*\frac{dy}{dx}=\frac{-f''(y)}{f'(y)^3}$
$\frac{d^3 y}{dx^3}=\frac{d(\frac{-f''(y)}{f'(y)^3})}{dy}*\frac{dy}{dx}=\frac{3f''(y)^2}{f'(y)^5}-\frac{f'''(y)}{f'(y)^4}$
......

那么我们可以写出
$y=y_0+\frac{x-x_0}{f'(y_0)}-\frac{f''(y_0)}{f'(y_0)^3}\frac{(x-x_0)^2}{2!}+(\frac{3f''(y_0)^2}{f'(y_0)^5}-\frac{f'''(y_0)}{f'(y_0)^4})\frac{(x-x_0)^3}{3!}+...$

并注意到$x_0=f(y_0)$,那么我们实则就写出了方程根的递推公式
$y_{n+1}=y_n+\frac{x-f(y_n)}{f'(y_n)}-\frac{f''(y_n)}{f'(y_n)^3}\frac{(x-f(y_n))^2}{2!}+$
$(\frac{3f''(y_n)^2}{f'(y_n)^5}-\frac{f'''(y_n)}{f'(y_n)^4})\frac{(x-f(y_n))^3}{3!}+...$

在应用中不用求太多项,只需要用到前几项即可(多了计算量会暴增)。如果只取前面两项,就成为了我们应用广泛的“牛顿法”。而我们多取几项,则可以加快收敛,并且提高稳定性。

好了,对此,科学空间已经介绍了两种“新”的方程数值算法(前面一种是“切抛物线法”),以后基本上不会再去研究代数方程的数值解法了。BoJone觉得,要求解方程,本帖的“终极算法”已经足够了,这里引用一下阿基米德的语气:“给我一道方程,我可以撬出方程的根!”......


转载到请包括本文地址:http://spaces.ac.cn/archives/590/

如果您觉得本文还不错,欢迎点击下面的按钮对博主进行打赏。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!