// Newton.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include
#include
#define N 3
void get_Chuzhi(double a[N],int n);
void F(double x[N],double X[N]);
void get_J(double x[N],double J[N][N]);
void get_J_1(double J[N][N]);
void Get_Flash_x(double X[N],double x[N],double J[N][N],double Wuchanxian);
void Newton(double x[N],double X[N],double J[N][N],double Wuchaxian);
void main()
{
double Wuchaxian=1.0,x[N],X[N];//定义定义:误差"Wuchaxian"、未知数x值"x[N]"、函数值"X[N]"、
double J[N][N];//雅阁比矩阵"J[N][N]"(后面程序将雅阁比逆阵赋给J[N][N]
Newton(x,X,J,Wuchaxian);//进入迭代过程
}
void Newton(double x[N],double X[N],double J[N][N],double Wuchaxian)解非线性方程组
{
int i;//控制循环最高次数
for(i=0;i<100&&Wuchaxian>0.0000001;i++)//迭代过程
{
if(i==0) {get_Chuzhi(x,N);}
F(x,X);
get_J(x,J);
get_J_1(J);
Get_Flash_x(X,x,J,Wuchaxian);
}
F(x,X);
for(i=0;i
{
printf("x(%d)=%e F(%d)=%e\n",i,x[i],i,X[i]);
}
}
void get_Chuzhi(double a[],int n)///录入方程初值
{
int i;
printf("请输入%d个初值\n",N);
for(i=0;i
{
cin>>a[i];
if(i==0){cout<
cout<
}
cout<
cout<
}
void F(double x[N],double X[N])/求方程函数值F(x)
{
/
/
X[0]=x[0]*x[0]+x[1]*x[1]+x[2]*x[2]-2.0;//方程可替换
X[1]=3.0*x[0]*x[0]+x[1]*x[1]-3.0*x[2];
X[2]=2.0*x[0]*x[0]-3.0*x[1]+2.0*x[2]*x[2];
/
/
}
void get_J(double x[N],double J[N][N])//求雅各比矩阵
{
/
/
J[0][0]=2.0*x[0];J[0][1]=2.0*x[1];J[0][2]=2.0*x[2];//方程偏导函数可替换
J[1][0]=6.0*x[0];J[1][1]=2.0*x[1];J[1][2]=-3.0;
J[2][0]=4.0*x[0];J[2][1]=-3.0;J[2][2]=4.0*x[2];
/
/
}
void get_J_1(double D[N][N])求雅各比逆阵(通过建立单位增广矩阵) { int i,j,k,n,s[N];//i,j,k,n控制循环,s[N]存放矩阵行编号 double P,Q,T,S[N][N];//P,Q存放主元所在行数据,上消、下消、过程需要乘的系数; //T 数据互换时需要的中间变量;S[N][N]是单位阵 for(i=0;i=0) S[n][k]=S[n][k]-S[i][k]*Q;//上消 } for(k=i;k=0) D[n][k]=D[n][k]-D[i][k]*Q;//逆阵做相同的消去 } if(n<0 && j>=N) break;//直到将上消下消完成后退出循环 } } for(i=0;i0.0000001) break;//如果有一个误差不符合要求即退出 } }