目录
一、公式介绍
牛顿迭代法基本公式,迭代出
面对非线性方程组问题,将上式变形
其中为:
注:这里面的不再时代表一个值,而是代表关于变量的一个矩阵,同理,代表着关于x,y的一个公式矩阵,(内x,与、内x不同!)
二、应用环境
牛顿迭代法主要用于求解在面对未知变量,计算困难,我们无法求出精确解时,使用的方法。可以利用特殊迭代的方式进行求解近似解。
三、C++代码
实例说明
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库也是一个计算矩阵非常方便的库文件,在其它数学矩阵计算方面也有很好的应用。
链接: