前言
本文中使用的是C++代码,本专题的其他数值方法是Matlab代码。
Newton - Raphson方法求解非线性方程组
迭代格式
已知如下方程组:
f
0
=
x
0
+
2
x
1
−
5
=
0
,
f
1
=
x
0
⋅
x
1
−
2
=
0.
\begin{array}{l} {f_0} = {x_0} + 2{x_1} - 5 = 0,\\ {f_1} = {x_0} \cdot {x_1} - 2 = 0. \end{array}
f0=x0+2x1−5=0,f1=x0⋅x1−2=0.
迭代格式为:
J
d
=
−
F
{\bf{Jd = - F}}
Jd=−F
X
1
=
X
0
+
d
0
X
2
=
X
1
+
d
1
⋯
\begin{array}{l} {{\bf{X}}_1} = {{\bf{X}}_0} + {{\bf{d}}_0}\\ {{\bf{X}}_2} = {{\bf{X}}_1} + {{\bf{d}}_1}\\ \cdots \end{array}
X1=X0+d0X2=X1+d1⋯
其中:
J
=
[
∂
f
0
∂
x
0
∂
f
0
∂
x
1
∂
f
1
∂
x
0
∂
f
1
∂
x
1
]
{\bf{J}} = \begin{bmatrix} \frac{{\partial {f_0}}}{{\partial {x_0}}}&\frac{{\partial {f_0}}}{{\partial {x_1}}}\\ \frac{{\partial {f_1}}}{{\partial {x_0}}}&\frac{{\partial {f_1}}}{{\partial {x_1}}}\\ \end{bmatrix}
J=[∂x0∂f0∂x0∂f1∂x1∂f0∂x1∂f1]
d
=
[
Δ
x
0
Δ
x
1
]
{\bf{d}} = \begin{bmatrix} {\Delta {x_0}}&{\Delta {x_1}} \end{bmatrix}
d=[Δx0Δx1]
T
^{\rm{T}}
T
F
=
[
f
0
f
1
]
{\bf{F}} = \begin{bmatrix} {{f_0}}&{{f_1}} \end{bmatrix}
F=[f0f1]
T
^{\rm{T}}
T
C++代码如下
Tip:代码使用了Eigen库
#include <iostream>
#include "..//eigen/Eigen/Eigen"
using namespace std;
using namespace Eigen;
int main()
{
double x01 = 0.5, x02 = 1.0; // 迭代初值
cout << "x1 = " << x01 << endl
<< "x2 = " << x02 << endl
<< "Newton Raphson Method taking!" << endl;
double epsilon = 1.0; // ε表征误差容错
VectorXd x0(2),x1(2),f(2);
x0 << x01, x02;
MatrixXd J(2, 2);
while (epsilon > 1.0e-5) {
f << x0(0) + 2 * x0(1) - 5.0, // f0
x0(0)* x0(1) - 2.0; // f1
J << 1.0, 1.0,
x0(1), x0(0);
x1 = J.lu().solve(-1.0 * f); // 此时x1的含义为Δx
epsilon = x1.norm();
x0 += x1;
}
cout << x0 <<endl;
system("pause");
return 0;
}
输出结果:
x1 = 0.5
x2 = 1
Newton Raphson Method taking!
Vector x0:
4 0.5