void pade(double cof[], int n, float *resid) { void lubksb(float **a, int n, int *indx, float b[]); void ludcmp(float **a, int n, int *indx, float *d); void mprove(float **a, float **alud, int n, int indx[], float b[], float x[]); int j,k,*indx; float d,rr,rrold,sum,**q,**qlu,*x,*y,*z; indx=ivector(1,n); q=matrix(1,n,1,n); qlu=matrix(1,n,1,n); x=vector(1,n); y=vector(1,n); z=vector(1,n); for (j=1;j<=n;j++) { y[j]=x[j]=cof[n+j]; for (k=1;k<=n;k++) { q[j][k]=cof[j-k+n]; qlu[j][k]=q[j][k]; } } ludcmp(qlu,n,indx,&d); lubksb(qlu,n,indx,x); rr=BIG; do { rrold=rr; for (j=1;j<=n;j++) z[j]=x[j]; mprove(q,qlu,n,indx,y,x); for (rr=0.0,j=1;j<=n;j++) rr += SQR(z[j]-x[j]); } while (rr < rrold); *resid=sqrt(rrold); for (k=1;k<=n;k++) { for (sum=cof[k],j=1;j<=k;j++) sum -= z[j]*cof[k-j]; y[k]=sum; } for (j=1;j<=n;j++) { cof[j]=y[j]; cof[j+n] = -z[j]; } free_vector(z,1,n); free_vector(y,1,n); free_vector(x,1,n); free_matrix(qlu,1,n,1,n); free_matrix(q,1,n,1,n); free_ivector(indx,1,n); }
int main(void) { int i,j,*indx; long idum=(-13); float d,*x,**a,**aa; static float ainit[NP][NP]= {1.0,2.0,3.0,4.0,5.0, 2.0,3.0,4.0,5.0,1.0, 1.0,1.0,1.0,1.0,1.0, 4.0,5.0,1.0,2.0,3.0, 5.0,1.0,2.0,3.0,4.0}; static float b[N+1]={0.0,1.0,1.0,1.0,1.0,1.0}; indx=ivector(1,N); x=vector(1,N); a=convert_matrix(&ainit[0][0],1,N,1,N); aa=matrix(1,N,1,N); for (i=1;i<=N;i++) { x[i]=b[i]; for (j=1;j<=N;j++) aa[i][j]=a[i][j]; } ludcmp(aa,N,indx,&d); lubksb(aa,N,indx,x); printf("\nSolution vector for the equations:\n"); for (i=1;i<=N;i++) printf("%12.6f",x[i]); printf("\n"); /* now phoney up x and let mprove fix it */ for (i=1;i<=N;i++) x[i] *= (1.0+0.2*ran3(&idum)); printf("\nSolution vector with noise added:\n"); for (i=1;i<=N;i++) printf("%12.6f",x[i]); printf("\n"); mprove(a,aa,N,indx,b,x); printf("\nSolution vector recovered by mprove:\n"); for (i=1;i<=N;i++) printf("%12.6f",x[i]); printf("\n"); free_matrix(aa,1,N,1,N); free_convert_matrix(a,1,N,1,N); free_vector(x,1,N); free_ivector(indx,1,N); return 0; }