这段程序每次运行结果都不一样,请高人指点!
<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 <math.h><BR>#include <stdio.h><BR>#include <stdlib.h><BR>#include <stddef.h><BR>#include <malloc.h><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<ma;j++) <BR> for(k=0;k<ma;k++){ covar[j][k]=0.0;alpha[j][k]=0;}<BR> <BR>for(n=0;n<100;n++)<BR>{ total=0;<BR> for(i=0;i<ma;i++) a2[i]=a[i];<BR> if(*alamda<0.0) {<BR> atry=vector(1,ma);<BR> beta=vector(1,ma);<BR> da=vector(1,ma);<BR> for(mfit=0,j=0;j<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<ma;j++) atry[j]=a[j]; <BR> }<BR> for(j=0;j< mfit;j++) <BR> for(k=0;k< mfit;k++) covar[j][k]=alpha[j][k]; <BR> for(j=0;j< mfit;j++) { <BR> covar[j][j]=alpha[j][j]*(1.0+(*alamda));<BR> oneda[j][0]=beta[j];<BR> }<BR> p1[0]=&covar[0][0];<BR> p2[0]=&oneda[0][0];<BR> <BR> for(i=1;i<6;i++)<BR> { p1[i]=covar[i];<BR> p2[i]=oneda[i];<BR> }<BR> gaussj(p1,mfit,p2,1);<BR> covar[0]=&p1[0][0];<BR> oneda[0]=&p2[0][0];<BR> <BR> for(i=1;i<6;i++)<BR> { covar[i]=p1[i];<BR> oneda[i]=p2[i];<BR> }<BR> <BR> for(j=0;j<mfit;j++) da[j]=oneda[j][0];<BR> <BR> for(j=-1,l=0;l<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<ochisq) {<BR> *alamda*=0.1; <BR> ochisq=(*chisq);<BR> for(j=0;j<mfit;j++) {<BR> for(k=0;k<mfit;k++) alpha[j][k]=covar[j][k]; <BR> beta[j]=da[j];<BR> }<BR> <BR> for(j=0;j<ma;j++) a[j]=atry[j]; <BR> for(j=0;j<ma;j++) {tr=fabs(a2[j]-a[j]);total=total+tr;}<BR> fprintf(fout,"total=%f\n",total);<BR> if(total<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<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> 也要把每个函数啥功能说说吧<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><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> 路过,顶一下 没有注释的代码,。。。
页:
[1]
