牛顿迭代法解非线性方程组(附C++代码)

目录

一、公式介绍

二、应用环境

三、C++代码

实例说明

C++编译环境

C++代码

运行结果 

特别注意

解决方法


一、公式介绍

牛顿迭代法基本公式,迭代出{x^{(k + 1)}}

{x^{(k + 1)}} = {x^{(k)}} - \frac{​{f({x^{(k)}})}}{​{f'({x^{(k)}})}}

面对非线性方程组问题,将上式变形

{x^{(k + 1)}} = {x^{(k)}} - F'{(x)^{ - 1}}F(x)

其中F'(x)为:

F'(x) = \left| {\begin{array}{*{20}{c}} {\frac{​{\partial f}}{​{\partial x}}}&{\frac{​{\partial f}}{​{\partial y}}}\\ {\frac{​{\partial g}}{​{\partial x}}}&{\frac{​{\partial g}}{​{\partial y}}} \end{array}} \right|

注:这里面的{x^{(k + 1)}}不再时代表一个值,而是代表关于(x,y)变量的一个矩阵,F(x)同理,代表着关于x,y的一个公式矩阵F(x) = \left| {\begin{array}{*{20}{c}} {f(x,y)}\\ {g(x,y)} \end{array}} \right|,(F(x)内x,与{f(x,y)}{g(x,y)}内x不同!)

二、应用环境

       牛顿迭代法主要用于求解在面对未知变量,计算困难,我们无法求出精确解时,使用的方法。可以利用特殊迭代的方式进行求解近似解。

三、C++代码

实例说明

\left\{ {\begin{array}{*{20}{c}} {​{x^2} - 2x - y + 0.5}\\ {​{x^2} + 4{y^2} - 4} \end{array}} \right.

C++编译环境

程序编译环境:vs 2013

C++代码

#include<iostream>
#include<armadillo>
using namespace std;
using namespace arma;

//牛顿迭代法解非线性方程组
//例题:x^2-2x-y+0.5
//      x^2+4y^2-4
double f(double x0,double y0)
{
	return pow(x0, 2) - 2 * x0 - y0 + 0.5;
}
double g(double x0, double y0)
{
	return pow(x0, 2) + 4 * pow(y0, 2) - 4;
}
double fx(double x, double y)    //记录f求x偏导值
{
	double w=2 * x - 2;
	return w;
}

double fy(double x, double y)    //记录f求x偏导值
{
	double w = -1;
	return w;
}

double gx(double x, double y)    //记录f求x偏导值
{
	double w = 2 * x;
	return w;
}

double gy(double x, double y)    //记录f求x偏导值
{
	double w = 8 * y;
	return w;
}

void join(mat A)      //输入矩阵.x系数
{
	cout << "请输入未知数x个数" << endl;
	int n;
	cin >> n;
	for (int w = 1; w <= n; w++)
	{
		cout << "请输入第" << w << "行的值" << endl;
		for (int i = 0; i < n; i++)
		{
			cout << "请输入第" << i + 1 << "个数据的值" << endl;
			double temp;
			cin >> temp;
			A << temp;
		}
		A << endr;
	}
	
}

void ND(double x0,double y0)   //牛顿迭代法实现,x0,y0为初始值
{
	int n=0;
	double y1;
	mat T1;
	mat T;
	double x1;
	do
	{
		n++;
		y1 = y0;
		x1 = x0;
		mat temp;
		temp << fx(x0, y0) << fy(x0, y0) << endr
			<< gx(x0, y0) << gy(x0, y0) << endr;
		mat b;
		b << f(x0, y0) << endr
			<< g(x0, y0) << endr;

		T << x0 << endr
			<< y0 << endr;
		//mat r = inv(temp);
		T = T - inv(temp)*b;
		x0 = T(0, 0);
		y0 = T(1, 0);
	} while (abs(x0 - x1)> 1e-5||abs(y0 - y1)>1e-5);
	cout << "共迭代" << n << "次" << endl;
	cout << "最终结果为:" << x0 << "    " << y0 << endl;
}
void main()
{
	ND(2, 0.25);
}

运行结果 

特别注意

       由于此算法有矩阵的计算,为了使代码更加简洁,高效,上述代码调用了armadillo库,进行相应的矩阵计算(如果没有配置armadillo库,编译时不会通过,会报错!)

解决方法

       在以下链接文章中,详细说明了如何配置armadillo库以及使用,便于读者可以解决上述c++代码编译不通过的问题。同时,armadillo库也是一个计算矩阵非常方便的库文件,在其它数学矩阵计算方面也有很好的应用。

链接:

http://t.csdn.cn/3WF0I

猜你喜欢

转载自blog.csdn.net/qq_60811855/article/details/127751313