第二十一篇 非线性方程组的迭代替换求解
非线性方程组
为了简单起见,我们到目前为止只关注了一个非线性方程。在实际中,我们可能有一个联立形式的非线性方程。

这种系统的解或根将由一组形式为(x1,x2,xn)的变量组成,并且通常会有多个满足方程的解。
在已经描述的方法中,即迭代替换和牛顿迭代法,都可以扩展到解决非线性方程组
方程组的迭代替换
标准方程能重新排列成下面的形式

该方法继续对所有变量(x1, x2,···,xn)0进行初始猜测。将这些值代入方程(3.25)的右侧,得到变量(x1, x2,···,xn)1等的更新值。迭代将继续进行,直到所有变量的更改都不超过指定的公差。这种方法的一个缺点是,对于大多数非线性方程组,可能会出现上面显示的几种重排。有些重排具有收敛的性质,有些则没有。对于单个方程,收敛取决于函数F(x)在根附近的梯度大小。同样,对于两个非线性方程,只有当

时才收敛,随着方程数目的增加,对收敛性的限制也越来越搞,因此限制了该方法在实践中的应用。
计算实例:
使用迭代替换的方法去发现下面函数在x1=1,x2=1附近的根

方程首先被重新排列成一个右手边为0的‘标准形式’

现在重新排列方程,使每个变量都出现在左边。有几种方法可以做到这一点,一种可能的排列如下

当初始猜测值为x1==x2=1.0时,迭代的解展现在下面的表中

很显然,解应该在x1=x2=1.2的时候收敛。在高斯迭代方法中,只要更新的值可用,就可以提高收敛性。
程序如下:
其中有一个主程序和一个对多个数判断收敛的子程序checkit,和一个函数程序
#对于一个方程组的迭代替换
import numpy as np
import B
n=2;tol=1.0e-5;limit=100
x=np.ones((2,1),dtype=np.float)
print('开始的猜测值',x[:,0])
print('前几次迭代值')
iters=0
def f36(x):
f36=np.zeros((2,1),dtype=np.float)
f36[0,0]=(2.16-0.5*x[1,0]**2)**0.5
f36[1,0]=x[0,0]
return f36
while(True):
iters=iters+1
if B.checkit(f36(x),x,tol)==True or iters==limit:
break
x=f36(x)
if iters<5:
print(x[:,0])
print('迭代到收敛的次数',iters)
print('解',x[:,0])
checkit
def checkit(loads,oldlds,tol):
#检查多个未知数的收敛
neq=loads.shape[0]
big=0.0
converged=True
for i in range(1,neq+1):
if abs(loads[i-1])>big:
big=abs(loads[i-1])
for i in range(1,neq+1):
if abs(loads[i-1]-oldlds[i-1])/big>tol:
converged=False
checkit=converged
return checkit
终端输出结果如下

程序结果与计算结果一致
本文介绍了非线性方程组的迭代替换求解方法,通过重排方程并迭代更新变量值,直至满足预设公差。虽然这种方法在某些情况下可能不收敛,但通过实例展示了如何用 Python 实现这一过程,并得到了预期的解。

2137

被折叠的 条评论
为什么被折叠?



