多元非线性方程组的雅克比迭代解法

近段时间遇到了多元非线性方程组求解问题,总是觉得理解的不透彻。所以单独将问题拿出来,循序渐进,由浅到深解决问题。
好吧,从最简单的开始吧!
用迭代法解下面的方程组

                    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

说明:初始值的选取非常重要。为了将问题的核心集中,做了很多简化,没必要去纠结其中的很多东西。

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值