/* * Invert the matrix if x = -1 * use gaussj */ FMatrix FMatrix::operator^( int x ) const { assert( x == -1 ); /* may want to extend to 2... in the future */ // check dimension assert( XDim() == YDim() ); // convience variables int n = XDim(); int size = n*n; // make a copy of the matrix for nrc routine to work on float *copy = new float[ size ]; memcpy( copy, elem, size*sizeof(float) ); float **a = convert_matrix( copy, 1, n, 1, n ); float **b = matrix( 1, n, 1, 1 ); b[1][1] = 1.0F; for( int i = 2; i <= n; i++ ) b[i][1] = 0.0F; gaussj( a, n, b, 1 ); FMatrix ret( n, n ); for( int iy = 0; iy < n; iy++ ) for( int ix = 0; ix < n; ix++ ) ret.Elem( iy, ix ) = copy[ iy*n + ix ]; delete [] copy; free_matrix( b, 1, n, 1, 1 ); free_convert_matrix( a, 1, n, 1, n ); return( ret ); }
int main(void) { unsigned long i,j,msize,*ija; float **a,*sa,*ax,*b; static float ainit[NP][NP]={ 3.0,0.0,1.0,0.0,0.0, 0.0,4.0,0.0,0.0,0.0, 0.0,7.0,5.0,9.0,0.0, 0.0,0.0,0.0,0.0,2.0, 0.0,0.0,0.0,6.0,5.0}; static float x[NP+1]={0.0,1.0,2.0,3.0,4.0,5.0}; ija=lvector(1,NMAX); ax=vector(1,NP); b=vector(1,NP); sa=vector(1,NMAX); a=convert_matrix(&ainit[0][0],1,NP,1,NP); sprsin(a,NP,0.5,NMAX,sa,ija); msize=ija[1]-2; sprstx(sa,ija,x,b,msize); for (i=1;i<=msize;i++) for (ax[i]=0.0,j=1;j<=msize;j++) ax[i] += a[j][i]*x[j]; printf("\tReference\tsprstx result\n"); for (i=1;i<=msize;i++) printf("\t%5.2f\t\t%5.2f\n",ax[i],b[i]); free_convert_matrix(a,1,NP,1,NP); free_vector(sa,1,NMAX); free_vector(b,1,NP); free_vector(ax,1,NP); free_lvector(ija,1,NMAX); return 0; }
int main(void) { int i,j; static float c[NP][NP]= {1.0,2.0,0.0,0.0,0.0, -2.0,3.0,0.0,0.0,0.0, 3.0,4.0,50.0,0.0,0.0, -4.0,5.0,-60.0,7.0,0.0, -5.0,6.0,-70.0,8.0,-9.0}; float *wr,*wi,**a; wr=vector(1,NP); wi=vector(1,NP); a=convert_matrix(&c[0][0],1,NP,1,NP); printf("matrix:\n"); for (i=1;i<=NP;i++) { for (j=1;j<=NP;j++) printf("%12.2f",a[i][j]); printf("\n"); } balanc(a,NP); elmhes(a,NP); hqr(a,NP,wr,wi); printf("eigenvalues:\n"); printf("%11s %16s \n","real","imag."); for (i=1;i<=NP;i++) printf("%15f %14f\n",wr[i],wi[i]); free_convert_matrix(a,1,NP,1,NP); free_vector(wi,1,NP); free_vector(wr,1,NP); return 0; }
int main(void) { int i,j,nrot; static float c[NP][NP]= {5.0,4.3,3.0,2.0,1.0,0.0,-1.0,-2.0,-3.0,-4.0, 4.3,5.1,4.0,3.0,2.0,1.0,0.0,-1.0,-2.0,-3.0, 3.0,4.0,5.0,4.0,3.0,2.0,1.0,0.0,-1.0,-2.0, 2.0,3.0,4.0,5.0,4.0,3.0,2.0,1.0,0.0,-1.0, 1.0,2.0,3.0,4.0,5.0,4.0,3.0,2.0,1.0,0.0, 0.0,1.0,2.0,3.0,4.0,5.0,4.0,3.0,2.0,1.0, -1.0,0.0,1.0,2.0,3.0,4.0,5.0,4.0,3.0,2.0, -2.0,-1.0,0.0,1.0,2.0,3.0,4.0,5.0,4.0,3.0, -3.0,-2.0,-1.0,0.0,1.0,2.0,3.0,4.0,5.0,4.0, -4.0,-3.0,-2.0,-1.0,0.0,1.0,2.0,3.0,4.0,5.0}; float *d,**v,**e; d=vector(1,NP); v=matrix(1,NP,1,NP); e=convert_matrix(&c[0][0],1,NP,1,NP); printf("****** Finding Eigenvectors ******\n"); jacobi(e,NP,d,v,&nrot); printf("unsorted eigenvectors:\n"); for (i=1;i<=NP;i++) { printf("eigenvalue %3d = %12.6f\n",i,d[i]); printf("eigenvector:\n"); for (j=1;j<=NP;j++) { printf("%12.6f",v[j][i]); if ((j % 5) == 0) printf("\n"); } printf("\n"); } printf("\n****** Sorting Eigenvectors ******\n\n"); eigsrt(d,v,NP); printf("sorted eigenvectors:\n"); for (i=1;i<=NP;i++) { printf("eigenvalue %3d = %12.6f\n",i,d[i]); printf("eigenvector:\n"); for (j=1;j<=NP;j++) { printf("%12.6f",v[j][i]); if ((j % 5) == 0) printf("\n"); } printf("\n"); } free_convert_matrix(e,1,NP,1,NP); free_matrix(v,1,NP,1,NP); free_vector(d,1,NP); return 0; }
int main(void) { int i,icase,j,*izrov,*iposv; static float c[MP][NP]= {0.0,1.0,1.0,3.0,-0.5, 740.0,-1.0,0.0,-2.0,0.0, 0.0,0.0,-2.0,0.0,7.0, 0.5,0.0,-1.0,1.0,-2.0, 9.0,-1.0,-1.0,-1.0,-1.0, 0.0,0.0,0.0,0.0,0.0}; float **a; static char *txt[NM1M2+1]= {" ","x1","x2","x3","x4","y1","y2","y3"}; izrov=ivector(1,N); iposv=ivector(1,M); a=convert_matrix(&c[0][0],1,MP,1,NP); simplx(a,M,N,M1,M2,M3,&icase,izrov,iposv); if (icase == 1) printf("\nunbounded objective function\n"); else if (icase == -1) printf("\nno solutions satisfy constraints given\n"); else { printf("\n%11s"," "); for (i=1;i<=N;i++) if (izrov[i] <= NM1M2) printf("%10s",txt[izrov[i]]); printf("\n"); for (i=1;i<=M+1;i++) { if (i == 1 || iposv[i-1] <= NM1M2) { if (i > 1) printf("%s",txt[iposv[i-1]]); else printf(" "); printf("%10.2f",a[i][1]); for (j=2;j<=N+1;j++) if (izrov[j-1] <= NM1M2) printf("%10.2f",a[i][j]); printf("\n"); } } } free_convert_matrix(a,1,MP,1,NP); free_ivector(iposv,1,M); free_ivector(izrov,1,N); return 0; }
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; }
int main(void) { int i,j,k,kk,l,ll,nrot; static float a[3][3]= {1.0,2.0,3.0, 2.0,2.0,3.0, 3.0,3.0,3.0}; static float b[5][5]= {-2.0,-1.0,0.0,1.0,2.0, -1.0,-1.0,0.0,1.0,2.0, 0.0,0.0,0.0,1.0,2.0, 1.0,1.0,1.0,1.0,2.0, 2.0,2.0,2.0,2.0,2.0}; static float c[NP][NP]= {5.0,4.3,3.0,2.0,1.0,0.0,-1.0,-2.0,-3.0,-4.0, 4.3,5.1,4.0,3.0,2.0,1.0,0.0,-1.0,-2.0,-3.0, 3.0,4.0,5.0,4.0,3.0,2.0,1.0,0.0,-1.0,-2.0, 2.0,3.0,4.0,5.0,4.0,3.0,2.0,1.0,0.0,-1.0, 1.0,2.0,3.0,4.0,5.0,4.0,3.0,2.0,1.0,0.0, 0.0,1.0,2.0,3.0,4.0,5.0,4.0,3.0,2.0,1.0, -1.0,0.0,1.0,2.0,3.0,4.0,5.0,4.0,3.0,2.0, -2.0,-1.0,0.0,1.0,2.0,3.0,4.0,5.0,4.0,3.0, -3.0,-2.0,-1.0,0.0,1.0,2.0,3.0,4.0,5.0,4.0, -4.0,-3.0,-2.0,-1.0,0.0,1.0,2.0,3.0,4.0,5.0}; float *d,*r,**v,**e; static int num[4]={0,3,5,10}; d=vector(1,NP); r=vector(1,NP); v=matrix(1,NP,1,NP); for (i=1;i<=NMAT;i++) { if (i == 1) e=convert_matrix(&a[0][0],1,num[i],1,num[i]); else if (i == 2) e=convert_matrix(&b[0][0],1,num[i],1,num[i]); else if (i == 3) e=convert_matrix(&c[0][0],1,num[i],1,num[i]); jacobi(e,num[i],d,v,&nrot); printf("matrix number %2d\n",i); printf("number of JACOBI rotations: %3d\n",nrot); printf("eigenvalues: \n"); for (j=1;j<=num[i];j++) { printf("%12.6f",d[j]); if ((j % 5) == 0) printf("\n"); } printf("\neigenvectors:\n"); for (j=1;j<=num[i];j++) { printf("%9s %3d \n","number",j); for (k=1;k<=num[i];k++) { printf("%12.6f",v[k][j]); if ((k % 5) == 0) printf("\n"); } printf("\n"); } /* eigenvector test */ printf("eigenvector test\n"); for (j=1;j<=num[i];j++) { for (l=1;l<=num[i];l++) { r[l]=0.0; for (k=1;k<=num[i];k++) { if (k > l) { kk=l; ll=k; } else { kk=k; ll=l; } r[l] += (e[ll][kk]*v[k][j]); } } printf("vector number %3d\n",j); printf("%11s %14s %10s\n", "vector","mtrx*vec.","ratio"); for (l=1;l<=num[i];l++) printf("%12.6f %12.6f %12.6f\n", v[l][j],r[l],r[l]/v[l][j]); } printf("press RETURN to continue...\n"); (void) getchar(); free_convert_matrix(e,1,num[i],1,num[i]); } free_matrix(v,1,NP,1,NP); free_vector(r,1,NP); free_vector(d,1,NP); return 0; }
int main(void) { unsigned long i,j,k,*ija,*ijb,*ijbt,*ijc; float *sa,*sb,*sbt,*sc,**a,**b,**c,**ab; static float ainit[NP][NP]={ 1.0,0.5,0.0,0.0,0.0, 0.5,2.0,0.5,0.0,0.0, 0.0,0.5,3.0,0.5,0.0, 0.0,0.0,0.5,4.0,0.5, 0.0,0.0,0.0,0.5,5.0}; static float binit[NP][NP]={ 1.0,1.0,0.0,0.0,0.0, 1.0,2.0,1.0,0.0,0.0, 0.0,1.0,3.0,1.0,0.0, 0.0,0.0,1.0,4.0,1.0, 0.0,0.0,0.0,1.0,5.0}; ija=lvector(1,NMAX); ijb=lvector(1,NMAX); ijbt=lvector(1,NMAX); ijc=lvector(1,NMAX); sa=vector(1,NMAX); sb=vector(1,NMAX); sbt=vector(1,NMAX); sc=vector(1,NMAX); c=matrix(1,NP,1,NP); ab=matrix(1,NP,1,NP); a=convert_matrix(&ainit[0][0],1,NP,1,NP); b=convert_matrix(&binit[0][0],1,NP,1,NP); sprsin(a,NP,0.5,NMAX,sa,ija); sprsin(b,NP,0.5,NMAX,sb,ijb); sprstp(sb,ijb,sbt,ijbt); /* specify tridiagonal output, using fact that a is tridiagonal */ for (i=1;i<=ija[ija[1]-1]-1;i++) ijc[i]=ija[i]; sprspm(sa,ija,sbt,ijbt,sc,ijc); for (i=1;i<=NP;i++) { for (j=1;j<=NP;j++) { ab[i][j]=0.0; for (k=1;k<=NP;k++) { ab[i][j]=ab[i][j]+a[i][k]*b[k][j]; } } } printf("Reference matrix:\n"); for (i=1;i<=NP;i++) { for (j=1;j<=NP;j++) printf("%5.2f\t",ab[i][j]); printf("\n"); } printf("sprspm matrix (should show only tridiagonals):\n"); for (i=1;i<=NP;i++) for (j=1;j<=NP;j++) c[i][j]=0.0; for (i=1;i<=NP;i++) { c[i][i]=sc[i]; for (j=ijc[i];j<=ijc[i+1]-1;j++) c[i][ijc[j]]=sc[j]; } for (i=1;i<=NP;i++) { for (j=1;j<=NP;j++) printf("%5.2f\t",c[i][j]); printf("\n"); } free_convert_matrix(b,1,NP,1,NP); free_convert_matrix(a,1,NP,1,NP); free_matrix(ab,1,NP,1,NP); free_matrix(c,1,NP,1,NP); free_vector(sc,1,NMAX); free_vector(sbt,1,NMAX); free_vector(sb,1,NMAX); free_vector(sa,1,NMAX); free_lvector(ijc,1,NMAX); free_lvector(ijbt,1,NMAX); free_lvector(ijb,1,NMAX); free_lvector(ija,1,NMAX); return 0; }