编程论坛's Archiver

angeleye 发表于 2007-10-10 21:35

这段程序每次运行结果都不一样,请高人指点!

<P>前面的函数编码已经调试过均没有问题,就是每次的运行结果不一样,有时候对有时候错,错的时候多,调整*alamda的大小运行结果也不一样,初步认为是函数传递的问题,那位高人指点下啊,多谢了!!<BR>当*lamda=1(赋值)时<BR>第一次运行结果:<BR>n=41,total=0.000000<BR>  0.83857<BR>  2.35192<BR>  2.87649<BR>  2.22281<BR>  0.98173<BR>  2.03835<BR> 1.147371e-08<BR>Null pointer assignment<BR>第二次运行结果:<BR>n=41,total=0.000000<BR>  0.83857<BR>  2.35192<BR>  2.87649<BR>  2.22281<BR>  0.98173<BR>  2.03835<BR> 1.147371e-08<BR>第三次运行结果:<BR>502.29750<BR>-36.82217<BR>  6.15297<BR>  0.98418<BR>  3.82171<BR>  4.53858<BR> 9.321532e+00<BR>第四次以后:<BR>Null pointer assignment<BR>Floating point error: Domain.</P>
<P>#include &lt;math.h&gt;<BR>#include &lt;stdio.h&gt;<BR>#include &lt;stdlib.h&gt;<BR>#include &lt;stddef.h&gt;<BR>#include &lt;malloc.h&gt;<BR>double *vector(long nl, long nh)<BR>void free_vector(double *v, long nl, long nh)<BR>double **matrix(long nrl, long nrh, long ncl, long nch)<BR>void free_matrix(double **m, long nrl, long nrh, long ncl, long nch)<BR>int *ivector(long nl, long nh)<BR>void gaussj(double **a, int n, double **b, int m)<BR>void covsrt(double **covar, int ma, int ia[], int mfit)<BR>void funcs(double x, double a[], double *y, double dyda[], int na)<BR>void mrqcof(double x[], double y[], double sig[], int ndata,double a[], int ia[], int ma, double **alpha, double beta[], double *chisq)<BR>main()<BR>{<BR> int i,j,k,l;<BR> long int n;<BR> static double x[7]={1,2,3,4,5,6,7};<BR> static double y[7]={2.895,2.558,1.631,0.852,0.405,0.173,0.062};<BR> static double sig[7]={1,1,1,1,1,1,1};<BR> int ndata=7,ma=6;<BR> double a[6]={2,3,4,3,2,3},a2[6];<BR> double total=0;<BR> int ia[6]={1,1,1,1,1,1};<BR> double *alamda, *chisq; <BR> double **alpha,tr;<BR> double **covar;<BR> static int mfit;<BR> static double ochisq,*atry,*da,**oneda,*beta;<BR> double *p1[6],*p2[6];<BR> <BR> *alamda=-0.1;<BR> *chisq=10000;<BR> covar=matrix(1,ma,1,ma);<BR> alpha=matrix(1,ma,1,ma);<BR> for(j=0;j&lt;ma;j++) <BR>     for(k=0;k&lt;ma;k++){  covar[j][k]=0.0;alpha[j][k]=0;}<BR> <BR>for(n=0;n&lt;100;n++)<BR>{ total=0;<BR>  for(i=0;i&lt;ma;i++) a2[i]=a[i];<BR>  if(*alamda&lt;0.0) {<BR>    atry=vector(1,ma);<BR>    beta=vector(1,ma);<BR>    da=vector(1,ma);<BR>    for(mfit=0,j=0;j&lt;ma;j++)<BR>       if(ia[j]) mfit++;<BR>    oneda=matrix(1,mfit,1,1);<BR>    *alamda=1;<BR>    mrqcof(x,y,sig,ndata,a,ia,ma,alpha,beta,chisq);<BR>    ochisq=(*chisq);<BR>    for(j=0;j&lt;ma;j++) atry[j]=a[j]; <BR>   }<BR>  for(j=0;j&lt; mfit;j++) <BR>      for(k=0;k&lt; mfit;k++)  covar[j][k]=alpha[j][k]; <BR>  for(j=0;j&lt; mfit;j++) {     <BR>      covar[j][j]=alpha[j][j]*(1.0+(*alamda));<BR>      oneda[j][0]=beta[j];<BR>  }<BR>  p1[0]=&amp;covar[0][0];<BR>  p2[0]=&amp;oneda[0][0];<BR>  <BR>  for(i=1;i&lt;6;i++)<BR>    { p1[i]=covar[i];<BR>      p2[i]=oneda[i];<BR>  }<BR>  gaussj(p1,mfit,p2,1);<BR>  covar[0]=&amp;p1[0][0];<BR>  oneda[0]=&amp;p2[0][0];<BR>  <BR>  for(i=1;i&lt;6;i++)<BR>    { covar[i]=p1[i];<BR>      oneda[i]=p2[i];<BR>  }<BR>  <BR>  for(j=0;j&lt;mfit;j++) da[j]=oneda[j][0];<BR>  <BR>  for(j=-1,l=0;l&lt;ma;l++)<BR>     if(ia[l]) atry[l]=a[l]+da[++j];<BR>  <BR>  mrqcof(x,y,sig,ndata,atry,ia,ma,covar,da,chisq);<BR>  <BR>  if(*chisq&lt;ochisq) {<BR>     *alamda*=0.1; <BR>     ochisq=(*chisq);<BR>     for(j=0;j&lt;mfit;j++) {<BR>         for(k=0;k&lt;mfit;k++) alpha[j][k]=covar[j][k]; <BR>        beta[j]=da[j];<BR>     }<BR>     <BR>   for(j=0;j&lt;ma;j++) a[j]=atry[j];     <BR>   for(j=0;j&lt;ma;j++) {tr=fabs(a2[j]-a[j]);total=total+tr;}<BR>   fprintf(fout,"total=%f\n",total);<BR>   if(total&lt;1e-6)<BR>       {printf("n=%d,total=%f\n",n,total); break;}<BR>   } else {<BR>     *alamda*=10.0; <BR>     *chisq=ochisq;<BR>  }</P>
<P>}<BR>for(i=0;i&lt;ma;i++)<BR>    printf("%9.5f\n",a[i]);<BR>printf("%13.7e\n",*chisq);<BR>if(*alamda==0) {<BR>    covsrt(covar,ma,ia,mfit);<BR>    covsrt(alpha,ma,ia,mfit);<BR>   <BR>  }<BR>free_matrix(alpha,1,ma,1,ma);<BR>free_matrix(covar,1,ma,1,ma);<BR>free_matrix(oneda,1,mfit,1,1);<BR>free_vector(da,1,ma);<BR>free_vector(beta,1,ma);<BR>free_vector(atry,1,ma);<BR>}</P>
<P><BR> </P>

succubus 发表于 2007-10-10 21:38

也要把每个函数啥功能说说吧<BR>难道要我根据函数名去猜吗?

angeleye 发表于 2007-10-11 08:03

double *vector(long nl, long nh) /*开辟一定长度的双精度一维数组空间*/<BR>void free_vector(double *v, long nl, long nh)/*释放双精度一维数组空间*/<BR>double **matrix(long nrl, long nrh, long ncl, long nch)/*开辟双精度矩阵空间*/<BR><BR>void free_matrix(double **m, long nrl, long nrh, long ncl, long nch)/*释放矩阵空间*/<BR>int *ivector(long nl, long nh)/*开辟一定长度的整型一维数组空间*/<BR>void free_ivector(int *v, long nl, long nh)/*释放整型一维数组空间*/<BR>void gaussj(double **a, int n, double **b, int m)/*高斯求解aX=b,a为n*n矩阵求解完返回a的逆矩阵,b为n*m矩阵,求解完返回解*/<BR>void covsrt(double **covar, int ma, int ia[], int mfit)/*将mfit解covar矩阵扩展到ma阶*/<BR>void funcs(double x, double a[], double *y, double dyda[], int na)/*求x对应的y值保存在*y中,同时返回dyda【】*/<BR>void mrqcof(double x[], double y[], double sig[], int ndata,double a[], int ia[], int ma, double **alpha, double beta[], double *chisq)/*返回alpha,beta和,chisq值*/<BR>main函数为求x,y数组的最优拟合值。<BR>谢谢了<BR>

论坛元老 发表于 2008-3-31 18:34

路过,顶一下

now 发表于 2008-3-31 21:43

没有注释的代码,。。。

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.