C语言牛顿法解非线性方程组,牛顿法解非线性方程组

本文档展示了使用C++实现牛顿法解决非线性方程组的过程,包括输入初值、计算函数值、求雅各比矩阵及其逆阵,并进行迭代直到满足误差要求。代码中定义了各个关键函数,如计算初始值、函数值、雅各比矩阵及其逆等,以逐步收敛到解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// 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;//如果有一个误差不符合要求即退出  } }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值