第二十篇 修正牛顿拉普森法求单根
对于大型方程组,按照上篇的方法需要一直计算导数的值,这可能会使迭代过程变得费时费力。可以使用一种改进的方法(还有许多其他的“改进的”方法),其中第一次评估的f‘(x0)的值用于整个迭代过程的外推。按下图所示,可以看到外推线现在与初始猜测值x0对应的导数一直平行。
计算实例:
使用修正牛顿拉普森求下面函数在x=2附近的根
修正牛顿拉普森公式为
因此这个例子可以变化成
迭代结果可以展示在下面这个表格中
这种情况下的收敛速度相当慢,因为一直保持x=2时的梯度值,但这个梯度值实际上与根植x≈1.32472的“正确”梯度相差很多。
程序如下:
其中分为一个主程序和一个检查是否收敛的子程序check,和求解的非线性方程f35,和这个方程的导数f35’。
#对于一个单根的修正牛顿拉普森法
import B
x0=1.0;tol=1e-5;limit=100
print('开始的猜测值',x0)
print('前几次迭代值')
iters=0
def f35(x):f35=x**3-x-1.0return f35
def f35dash(x):f35dash=3.0*x**2-1.0return f35dash
fd=f35dash(x0)
while(True):iters=iters+1x1=x0-f35(x0)/fdif B.check(x1,x0,tol)==True or iters==limit:breakx0=x1if iters<5:print(x1)
print('迭代到收敛的次数',iters)
print('解',x1)
check
def check(x1,x0,tol):check=not abs(x1-x0)/abs(x0)>tolreturn check
终端输出结果如下
程序结果与计算结果一致。