|||
作者:蒋迅
在科学网上看到有人谈Newton Raphson算法。想借此机会也来说一句。
牛顿-拉弗森方法 (Newton's method) 是一种在实数域和复数域上近似求解方程的方法。假定函数f(x)可导。我们要求它的零点。选择一个接近函数f(x)零点的x0,利用下式进行迭代。
在实际应用中,我们最可能面临的是,我们无法得到函数f(x) 的导数 f '(x),从而使得这个方法失效。笔者在计算中遇到的就是要用软件来得到f(x) 的值,而软件本身并不计算导数。这时候最常见的办法就是用差分代替导数:
下面用一段FORTRAN程序说明在实际应有中如何使用Newton Raphson算法。假定有一个计算软件能近似计算所需y值。这个软件的输出文件是“output.txt”。先写一个shell script,叫“myscript.sh”。然后在FORTRAN里做一个system call去调动“myscript.sh”。程序如下:
上述程序中有些简化,比如没有检查分母为零的情况。还有就是Newton-Raphson算法是在第二步以后才有效。第一步的初始猜测值和第二步的算法都很重要。通常第二步可以取 x = 0.95*x_old (或 x = 1.05*x_old), 或者更精确的工程数学公式。很多经验丰富的工作者都有这些公式,是我们应该注意的财富。上面还有一个新的参数“relax”(0 < relax ≤ 1)。一般有 relax = 1.0。但我们调用的软件不一定很理想,所以可能不能过于依赖。这个时候就可以取一个稍小一点的“relax”值。
有时函数变化过于迅速,可以先用速度比较慢的二分法迭代数次,再换成Newton- Raphson法。下面是我遇到的一个问题。要找的零点在1490 - 1500 之间。我从 1425 开始计算。如果直接用Newton-Raphson算法的话就会将迭代的点落在 1500 之外,而从物理上我知道必须在 1500 之内。所以我决定先用二分法,到一定的精度后才换成Newton-Raphson算法。其它的注意事项不一一叙述。
非线性系统常常用迭代方法来解决,而Newton Raphson算法往往简单有效。笔者屡试不爽。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-23 21:28
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社