#include #include #include "opt.h" #define Debug 0 /************************************************** Vector operations **************************************************/ extern void vectorcopy(n, x, y) int n; dbl x[], y[]; { int i; for (i=0; i *pmax) { *pimax = i; *pmax = value; } } } /* inverse of matrix input: A = (n,n) matrix eps = small value output: Ainv = (n,n) matrix */ extern void matrixinverse(n, ainv, a, eps) /* Ainv = a^{-1} */ int n; dbl a[], ainv[], eps; { int i, j, m, imax; dbl max, div, mul; m = n; matrixunit(n, ainv); #if Debug printf("--- marix inverse ---\n"); matrixfprint(stdout, m, n, a); printf("\n"); matrixfprint(stdout, m, n, ainv); #endif /* forward elimination */ for (j=0; j 1 fprintf(stdout, "imax=%d max=%lf\n", imax, max); #endif if (max <= eps) { fprintf(stderr, "matrix inverse: singular\n"); matrixfprint(stderr, m, n, ainv); exit(1); break; } if (j != imax) { matrixrowexchange(m, n, a, j, imax); matrixrowexchange(m, n, ainv, j, imax); } #if Debug > 1 printf("exchange %d and %d\n", j, imax); matrixfprint(stdout, m, n, a); printf("\n"); matrixfprint(stdout, m, n, ainv); #endif div = 1/a[j*n+j]; matrixrowscalar(m, n, a, j, div); matrixrowscalar(m, n, ainv, j, div); #if Debug > 1 printf("scalar %lf\n", div); matrixfprint(stdout, m, n, a); printf("\n"); matrixfprint(stdout, m, n, ainv); #endif for (i=j+1; i 1 printf("add\n"); matrixfprint(stdout, m, n, a); printf("\n"); matrixfprint(stdout, m, n, ainv); #endif } #if Debug printf("forward process\n"); matrixfprint(stdout, m, n, a); printf("\n"); matrixfprint(stdout, m, n, ainv); #endif } for (j=n-1; j>=0; j--) { for (i=j-1; i>=0; i--) { mul = -a[i*n+j]; matrixrowadd(m, n, a, i, mul, j); matrixrowadd(m, n, ainv, i, mul, j); } #if Debug printf("backward process\n"); matrixfprint(stdout, m, n, a); printf("\n"); matrixfprint(stdout, m, n, ainv); #endif } #if Debug printf("answer\n"); matrixfprint(stdout, m, n, a); printf("\n"); matrixfprint(stdout, m, n, ainv); printf("\n"); #endif } /* Print & Scan */ static char *format = " %lf "; extern void vectorfprint(fd, n, x) FILE *fd; int n; dbl x[]; { int i; for (i=0; i