一 理论背景
我们先考虑线性方程,线性方程组的解便不难得出了。
与线性方程相比,非线性方程问题无论是从理论上还是从计算公
式上,都要复杂得多。对于一般的非线性方程f ( x)0 ,计算方
程的根既无一定章程可寻也无直接法可言。例如,求解高次方程
组 7x6 x3 x 1.5 0 的根,求解含有指数和正弦函数的超越方程 ex cos( x) 0 的零点。解非线性方程或方程组也是计算方法中的一个主题。在解方程方面,牛顿( I . Newton )提出了方程求根的一种迭代方法,被后人称为牛顿算法。三百年来,人们一直用牛顿算法,改善牛顿算法,不断推广算法的应用范围。牛顿算法,可以说是数值计算方面的最有影响的计算方法。
对于言程式f ( x)0 , 如果 f ( x) 是线性函数,则它的求根
是容易的。牛顿法实质上是一种线性化方法,其基本思想是将非
线性方程式 f ( x) 逐步归结为某种线性方程来求解。解非线性方
程组只是非线性方程的一种延伸和扩展。
二 主要理论
考虑方程组
f1 (x1 ,...xn )
0,
.................
1
fn ( x1 ,...xn )
0.
其 中 f1 ,..., fn 均 为 ( x1 ,...xn ) 多 元 函 数 。 若 用 向 量 记 号 记
x( x1 ,... xn )TRn , F( f1 ,..., fn )T , 1就可写成
F ( x) 0.
(2)
当 n
2, , 且 fi (i 1,...,n)
中至少有一个是自变量
xi (i
1,...,n) 的非线性函数时,则称方程组 (1)为非线性方程
组。非线性方程组求根问题是前面介绍的方程即(n1) 求根的
直接推广,实际上只要把单变量函数f ( x) 看成向量函数 F ( x)
则可将单变量方程求根方法推广到方程组(2) 。若已给出方程组
(2) 的一个 近似 根x( k )( x1k ,..., xnk )T ,将函数 F ( x) 的分量
fi ( x)(i1,..., n) 在 x( k) 用多元函数泰勒展开, 并取其线性部分,
则可表示为
F ( x)F (x( k ) )F (x( k ) )( xx( k ) ).
令上式右端为零,得到线性方程组
F ( x( k ) )( x x( k ) )
F (x( k ) ),
(3)
其中
f1 ( x)
f1( x)
f1 ( x)
x1
x2
xn
f2 ( x)
f 2 ( x)
f2 ( x)
x1
x2
xn
F ( x)
(4)
fn ( x)
f n ( x)
fn ( x)
x
x
2
xn
1
称为 F (x) 为雅可比( Jacobi )矩阵。求解线性方程组
(3) ,并
记解为 x(k 1) ,则得
x( k 1)x( k )F ( x( k ) ) 1 F (x(k ) )(k0,1,...).(5)
这就是解非线性方程组(2) 的牛顿法。
三.算法
牛 顿 法 主 要 思 想 是 用 x(k 1)
x(k )
F (x( k ) ) 1 F (x( k ) )
(k 0,1,...). 进行迭代 。因此首先需要算出
F ( x) 的雅可比矩阵
( x) ,再求过 F ( x) 求出它的逆 F ( x) 1 ,当它达到某个精度
(x_k) 时即停止迭代。
具体算法如下:
1.
首先宏定义方程组 F ( x)
,确定步长 x _ 和精度 (x_k) ;
2.
求 F ( x) 的雅可比矩阵 F
( x) ;
可用
fi ( x1 ,..., xj ,..., xn )
f i ( x1,..., x j
x _,..., xn ) f i ( x1,..., x j ,..., xn )
x j
x _
求出雅可比矩阵;
3.
求雅可比矩阵 F ( x) 的逆 F ( x)
1 ;
1
0
将 F ( x) 右乘一个单位矩阵
,通过单位矩阵变
0
1
换实现求 F ( x) 的逆,用指针来存贮。
4.
雅可比矩阵 F ( x) 与其逆 F ( x)
1 的相乘;
5.
用 (5) 来迭代;
6.
当精度 x_k i 大于 x_k 时,重复执行
2—— 5 步,直到精度
小于或等于 x_k 停止迭代, x_ki
就是最后的迭代结果。
其中 x_k
i
( x( i 1)
x(i ) ) 2 ,...,( x( i
1)
x(i ) )2
1
1
n
n
四.代码
#include
#include
#include
#include
#de