近段时间遇到了多元非线性方程组求解问题,总是觉得理解的不透彻。所以单独将问题拿出来,循序渐进,由浅到深解决问题。
好吧,从最简单的开始吧!
用迭代法解下面的方程组
2*x1*x1+x2*x2-1=0;
x1+x2=0;
基本的思想将非线性化为线性进行求解
…(省略)…
vc++实现如下
#include<stdio.h>
#include<math.h>
//float f1(float x1,float x2)=;
//float f2(float x1,float x2)=;
int main()
{
int k=0;
float J[2][2];//雅可比矩阵
float x1=-1,x2=1;//初始解
float F[2];//迭代过程的中间解,带入函数
float detx[2];
do{
k++;
printf("第%d次迭代",k);
//计算第k次雅可比矩阵J[2][2]={ (4*x,2*y), ( 1, 1) }
J[0][0]=4*x1;J[0][1]=2*x2;J[1][0]=1;J[1][1]=1;
//求F(x) F[0]=f1(x1,x2);F[1]=f2(x1,x2);
F[0]=2*x1*x1+x2*x2-1;F[1]=x1+x2;
//接线性方程组detx[2]=-J的逆*F[2][2]
//求解-J的逆
J[0][0]=1/(2*x2-4*x1);
J[0][1]=2*x2/(4*x1-2*x2);
J[1][0]=-J[0][0];
J[1][1]=4*x1/(2*x2-4*x1);
//求解x1,x2的增量
detx[0]=J[0][0]*F[0]+J[0][1]*F[1];
detx[1]=J[0][1]*F[0]+J[1][1]*F[1];
x1=x1+detx[0];x2=x2+detx[1];
printf("x1的增量%f,x2的增量%f\n",detx[0],detx[1]);
}while(fabs(detx[0])>0.0001||fabs(detx[1])>0.0001);
printf("非线性方程组的解为x1=%f,x2=%f\n",x1,x2);
//验证
printf("将x1,x2的值带入第一个方程%f\n",2*x1*x1+x2*x2-1);
printf("将x1,x2的值带入第二个方程%f\n",x1+x2);
return 0;
}
结果如下
第1次迭代x1的增量0.333333,x2的增量-0.666667
第2次迭代x1的增量0.066667,x2的增量0.266667
第3次迭代x1的增量0.022222,x2的增量-0.026667
第4次迭代x1的增量0.000423,x2的增量0.004176
第5次迭代x1的增量0.000005,x2的增量-0.000168
第6次迭代x1的增量-0.000000,x2的增量0.000009
非线性方程组的解为x1=-0.577350,x2=0.577351
将x1,x2的值带入第一个方程0.000001
将x1,x2的值带入第二个方程0.000000
Press any key to continue
说明:初始值的选取非常重要。为了将问题的核心集中,做了很多简化,没必要去纠结其中的很多东西。