|
请教:这个求解非线性方程组的程序存在什么问题?
上传的附件是一个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("# 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("$ 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);
}
|
|