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

——代码中的各个函数和各个数组维数需要根据不同的情况进行改变才可以使用,这里运用两个例题来测试代码的可行性。

例题一源代码

#include<stdio.h>
void T_(double arr1[2][2],double arr2[2][2])//求矩阵的逆 
{
	int i;
	int j;
	int k; 
	int g;
	double arr1tmp[2]={0};
	double arr2tmp[2]={0};
	int h;
	int m;
	double tmp; 
	for(i=0;i<2;i++)
	{
		arr2[i][i]=1;//化单位矩阵 
	}
	for(i=0;i<2;i++)
	{
		h=i+1;
		while(arr1[i][i]==0)//找调整主元 
		{
			for(j=0;j<2;j++)
			{
				arr1tmp[j]=arr1[i][j];
				arr1[i][j]=arr1[h][j];
				arr1[h][j]=arr1tmp[j];
				arr2tmp[j]=arr2[i][j];
				arr2[i][j]=arr2[h][j];
				arr2[h][j]=arr2tmp[j];
			}
			h++;
		}
		tmp=arr1[i][i];
		for(j=0;j<2;j++)
		{
			
			arr1[i][j]=(arr1[i][j]/tmp);
			arr2[i][j]=(arr2[i][j]/tmp);
		}
			for(k=0;k<2;k++)
			{
				if(k==i)
				{
					continue;
				}
				tmp=arr1[k][i];
				for(g=0;g<2;g++)
				{
					
					arr1[k][g]=(arr1[k][g]-tmp*arr1[i][g]);
					arr2[k][g]=(arr2[k][g]-tmp*arr2[i][g]);
				}
			}
	}
	for(i=0;i<2;i++)
	{
		for(j=0;j<2;j++)
		{
			arr1[i][j]=arr2[i][j];
		}
	}
}
void F(double arr[2],double arr_[2])//F(x)表达式 ,自定义 
{
	arr_[0]=3*arr[0]*arr[0]-arr[1]*arr[1];
	arr_[1]=3*arr[0]*arr[1]*arr[1]-arr[0]*arr[0]*arr[0]-1;
 } 
void F_(double arr[2],double arr_[2][2]) //自定义 
{
	arr_[0][0]=6*arr[0];
	arr_[0][1]=-2*arr[1];
	arr_[1][0]=3*arr[1]*arr[1]-3*arr[0]*arr[0];
	arr_[1][1]=6*arr[0]*arr[1];
}
void M(double arr[2],double arra[2][2],double arrb[2])//矩阵运算:迭代结果,F_(x1,x2)逆矩阵,F(x1,x2) 
{
	int i,j;
	for(i=0;i<2;i++)
	{
		for(j=0;j<2;j++)
		{
			arr[i]+=arra[i][j]*(-arrb[j]);
		}
	}
}
int main()
{
	double arr0[2][2];
	double arr[2];//迭代结果 ,迭代初值 
	double arr1[2][2];//F_(x1,x2) 
	double arr2[2];//每次迭代该变量 
	double arr3[2];//F(x1,x2)
	int i;
	int count=0;
	int maxdd;//最大迭代次数 
	double jd;//精度 
	printf("存放初值:\n"); 
	for(i=0;i<2;i++)
	{
		scanf("%lf",&arr[i]);//存放初值 
	} 
	printf("输入精度范围:\n");
	scanf("%lf",&jd);
	printf("输入最大迭代次数\n");
	scanf("%d",&maxdd);
	while(1)
	{
	count++;
	F_(arr,arr1);
	F(arr,arr3);
	T_(arr1,arr0);
	M(arr,arr1,arr3);
	if((arr3[0]<=jd&&arr3[0]>=(-jd)&&arr3[1]<=jd&&arr3[1]>=(-jd))||count>maxdd)
	{
		break;
	}
	}
	if(count<=maxdd)
	{
		printf("迭代次数为:%d\n",count);
		printf("迭代结果为:");
		for(i=0;i<2;i++)
	{
		printf("%lf  ",arr[i]);
	}
	printf("\n");
	printf("误差为:%lf\n",arr3[0]);
	}
	else if(count>maxdd)
	{
		printf("超出最大迭代次数\n");
	}
	return 0;
}

实验结果

例题二只需要改变例题一代码中的函数即可

例题二源代码 

#include<stdio.h>
void T_(double arr1[2][2],double arr2[2][2])//求矩阵的逆 
{
	int i;
	int j;
	int k; 
	int g;
	double arr1tmp[2]={0};
	double arr2tmp[2]={0};
	int h;
	int m;
	double tmp; 
	for(i=0;i<2;i++)
	{
		arr2[i][i]=1;//化单位矩阵 
	}
	for(i=0;i<2;i++)
	{
		h=i+1;
		while(arr1[i][i]==0)//找调整主元 
		{
			for(j=0;j<2;j++)
			{
				arr1tmp[j]=arr1[i][j];
				arr1[i][j]=arr1[h][j];
				arr1[h][j]=arr1tmp[j];
				arr2tmp[j]=arr2[i][j];
				arr2[i][j]=arr2[h][j];
				arr2[h][j]=arr2tmp[j];
			}
			h++;
		}
		tmp=arr1[i][i];
		for(j=0;j<2;j++)
		{
			
			arr1[i][j]=(arr1[i][j]/tmp);
			arr2[i][j]=(arr2[i][j]/tmp);
		}
			for(k=0;k<2;k++)
			{
				if(k==i)
				{
					continue;
				}
				tmp=arr1[k][i];
				for(g=0;g<2;g++)
				{
					
					arr1[k][g]=(arr1[k][g]-tmp*arr1[i][g]);
					arr2[k][g]=(arr2[k][g]-tmp*arr2[i][g]);
				}
			}
	}
	for(i=0;i<2;i++)
	{
		for(j=0;j<2;j++)
		{
			arr1[i][j]=arr2[i][j];
		}
	}
}
void F(double arr[2],double arr_[2])//F(x)表达式 ,自定义 
{
	arr_[0]=arr[0]*arr[0]+arr[1]*arr[1]-4;
	arr_[1]=arr[0]*arr[0]-arr[1]*arr[1]-1;
 } 
void F_(double arr[2],double arr_[2][2]) //自定义 
{
	arr_[0][0]=2*arr[0];
	arr_[0][1]=2*arr[1];
	arr_[1][0]=2*arr[0];
	arr_[1][1]=-2*arr[1];
}
void M(double arr[2],double arra[2][2],double arrb[2])//矩阵运算:迭代结果,F_(x1,x2)逆矩阵,F(x1,x2) 
{
	int i,j;
	for(i=0;i<2;i++)
	{
		for(j=0;j<2;j++)
		{
			arr[i]+=arra[i][j]*(-arrb[j]);
		}
	}
}
int main()
{
	double arr0[2][2];
	double arr[2];//迭代结果 ,迭代初值 
	double arr1[2][2];//F_(x1,x2) 
	double arr2[2];//每次迭代该变量 
	double arr3[2];//F(x1,x2)
	int i;
	int count=0;
	int maxdd;//最大迭代次数 
	double jd;//精度 
	printf("存放初值:\n"); 
	for(i=0;i<2;i++)
	{
		scanf("%lf",&arr[i]);//存放初值 
	} 
	printf("输入精度范围:\n");
	scanf("%lf",&jd);
	printf("输入最大迭代次数\n");
	scanf("%d",&maxdd);
	while(1)
	{
	count++;
	F_(arr,arr1);
	F(arr,arr3);
	T_(arr1,arr0);
	M(arr,arr1,arr3);
	if((arr3[0]<=jd&&arr3[0]>=(-jd)&&arr3[1]<=jd&&arr3[1]>=(-jd))||count>maxdd)
	{
		break;
	}
	}
	if(count<=maxdd)
	{
		printf("迭代次数为:%d\n",count);
		printf("迭代结果为:");
		for(i=0;i<2;i++)
	{
		printf("%lf  ",arr[i]);
	}
	printf("\n");
	printf("误差为:%lf\n",arr3[0]);
	}
	else if(count>maxdd)
	{
		printf("超出最大迭代次数\n");
	}
	return 0;
}

 实验结果

 

                                                                        ——————如有错误,欢迎指正(#^.^#) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值