数学中国

 找回密码
 注册
搜索
热搜: 活动 交友 discuz
查看: 3827|回复: 0

请教:这个求解非线性方程组的程序存在什么问题?

[复制链接]
发表于 2009-5-12 09:26 | 显示全部楼层 |阅读模式
请教:这个求解非线性方程组的程序存在什么问题?
    上传的附件是一个C++求解非线性方程组的程序,但求解不了其中的含指数函数的非线性方程组。
    如果换成由幂函数组成的非线性方程组,就可以求解。请教有什么方法可以解决求解含指数函数的非线性方程组。

程序如下:
  #include "math.h"
  #include "stdio.h"
  #include "stdlib.h"

  int snse(n,eps,x,js,ff)
  int n,js;
  double eps,x[],(*ff)();
  { int l,j;
    double f,d,s,*y;
    y=malloc(n*sizeof(double));
    l=js;
    f=(*ff)(x,y,n);
    while (f>=eps)
      { l=l-1;
        printf("l=%d\n",l);
        if (l==0) { free(y); return(js);}
        d=0.0;
        printf("l==0   y(%d)=%13.7e\n\n",j);
        for (j=0; j<=n-1; j++) d=d+y[j]*y[j];
        if (d+1.0==1.0) { free(y); return(-1);}
        s=f/d;
        for (j=0; j<=n-1; j++) x[j]=x[j]-s*y[j];
        f=(*ff)(x,y,n);
        printf("d+1.0==1.0   y(%d)=%13.7e\n",j);
        printf("l = %d  f = %d\n\n",l,f);
      }
    free(y); return(js-l);
  }
  
  
  main()
  { int i, js;  //序数,最大代替次数
    double eps;  //求解精度
double snsef(double [],double [],int);
    static double x[4]={5, 5, 0.02, 0.02};
    js=300000; eps=0.000001;
    i=snse(4,eps,x,js,snsef);
    printf("ccc js=%d\n",js);
    if ((i>0)&&(i<js))
{ printf("1\n");
        for (i=0; i<=3; i++)
          printf("&#35;  x(%d)=%13.7e\n",i,x);  //因是4元,i的循环值改0至3。
        printf("ddd\n");
      }
else
    {   printf("2\n");
printf("eps=%e    js=%d    i=%d\n", &eps, &js, &i);
        for (i=0; i<=3; i++)
          printf("&#36;  x(%d)=%13.7e\n",i,x);  //因是4元,i的循环值改0至3。
        printf("eee\n");
      }
    printf("fff\n");
  }


  double snsef(x, y, n)
  int n;
  double x[], y[];
  { double z, f1, f2, f3, f4, df1, df2, df3, df4;
    n = n;
    f1 = x[0] * exp(x[2] * 1050) + x[1] * exp(x[3] * 1050) - 1406.37;
    f2 = x[0] * exp(x[2] * 1100) + x[1] * exp(x[3] * 1100) - 1409.69;
    f3 = x[0] * exp(x[2] * 1150) + x[1] * exp(x[3] * 1150) - 1463.95;
    f4 = x[0] * exp(x[2] * 1200) + x[1] * exp(x[3] * 1200) - 1516.58;  //因是4元,增加一条方程。
printf("x[0]=%e    x[1]=%e\n    x[2]=%e    x[3]=%e\n", &x[0], &x[1], &x[2], &x[3]);
    z = f1 * f1 + f2 * f2 + f3 * f3 + f4 * f4;
    df1 = exp(x[2] * 1050);
df2 = exp(x[2] * 1100);
df3 = exp(x[2] * 1150);
df4 = exp(x[2] * 1200);  //因是4元,增加一个对x1[0]的偏导数。
    y[0] = 2.0 * (f1 * df1 + f2 * df2 + f3 * df3 + f4 * df4);
    df1 = exp(x[3] * 1050);
df2 = exp(x[3] * 1100);
df3 = exp(x[3] * 1150);
df4 = exp(x[3] * 1200);  //因是4元,增加一个对x1[1]的偏导数。
    y[1] = 2.0 * (f1 * df1 + f2 * df2 + f3 * df3 + f4 * df4);
    df1 = x[0] * 1050 * exp(x[2] * 1050);
df2 = x[0] * 1100 * exp(x[2] * 1100);
df3 = x[0] * 1150 * exp(x[2] * 1150);
df4 = x[0] * 1200 * exp(x[2] * 1200);  //因是4元,增加一个对x1[2]的偏导数。
    y[2] = 2.0 * (f1 * df1 + f2 * df2 + f3 * df3 + f4 * df4);
    df1 = x[1] * 1050 * exp(x[3] * 1050);
df2 = x[1] * 1100 * exp(x[3] * 1100);
df3 = x[1] * 1150 * exp(x[3] * 1150);
df4 = x[1] * 1200 * exp(x[3] * 1200);  //因是4元,增加一个对x1[3]的偏导数。
    y[3] = 2.0 * (f1 * df1 + f2 * df2 + f3 * df3 + f4 * df4);
return(z);
  }

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|数学中国 ( 京ICP备05040119号 )

GMT+8, 2025-6-19 06:53 , Processed in 0.101022 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表