//经典牛顿迭代法C++实现
#include
#include
#define N 3 // 非线性方程组中方程个数、未知量个数
#define Epsilon 0.000000001 // 差向量1范数的上限
#define Max 1000000000000 //最大迭代次数
using namespace std;
const int N2=2*N;
int main()
{
void ff(double xx[N],double yy[N]); //计算向量函数的因变量向量yy[N]
void ffjacobian(double xx[N],double yy[N][N]); //计算雅克比矩阵yy[N][N]
void inv_jacobian(double yy[N][N],double inv[N][N]); //计算雅克比矩阵的逆矩阵inv
void newdundiedai(double x0[N], double inv[N][N],double y0[N],double x1[N]); //由近似解向量 x0 计算近似解向量 x1
// double x0[N]={82.7995,-5.92913,361.667};
double x0[N]={-5,-6,-7};
double y0[N],jacobian[N][N],invjacobian[N][N],x1[N],errornorm;
int i,j,iter=0;
cout<
for (i=0;i
cout<
cout<
do
{
iter=iter+1;
cout<
//计算向量函数的因变量向量 y0
ff(x0,y0);//double aaa = exp(-5);
//计算雅克比矩阵 jacobian
ffjacobian(x0,jacobian);
//计算雅克比矩阵的逆矩阵 invjacobian
inv_jacobian(jacobian,invjacobian);
//由近似解向量 x0 计算近似解向量 x1
newdundiedai(x0, invjacobian,y0,x1);
//计算差向量的1范数errornorm
errornorm=0;
for (i=0;i
errornorm=errornorm+fabs(x1[i]-x0[i]);
if (errornorm
for (i=0;i
x0[i]=x1[i];
} while (iter
return 0;
}
void ff(double xx[N],double yy[N])
{
double x,y,z;
int i;
x=xx[0];
y=xx[1];
z=xx[2];
// yy[0]=3*x-2*y+4*z-11;
// yy[1]=2*x*x+2*x+y*y+3*y+4*z*z-27;
// yy[2]=x+2*y+3*z-14;
yy[0]=3*x-cos(y*z)-0.5;
yy[1]=x*x-81*(y+0.1)*(y+0.1)+sin(z)+1.06;
yy[2]=exp(-x*y)+20*z+10.0/3.0*3.14159-1;
cout<