数值分析(Matlab): Newton - Raphson方法求解非线性方程组

前言

  本文中使用的是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+2x15=0,f1=x0x12=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=[x0f0x0f1x1f0x1f1]
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
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值