00001
00002
00003
00004
00005
00006 #include <stdio.h>
00007 #include <stdlib.h>
00008
00009 #include "imcore.h"
00010 #include "floatmath.h"
00011 #include "util.h"
00012
00013
00014
00015 void solve (double a[25][25], double b[25], int m) {
00016 double temp, big, pivot, rmax;
00017 int i, iu, j, k, l = 0, jl, ib, ir;
00018
00019 iu = m-1;
00020 for(i = 0; i < iu; i++) {
00021 big = 0.0;
00022
00023
00024 for(k = i; k < m; k++) {
00025 rmax = fabs(a[i][k]);
00026 if(rmax > big) {
00027 big = rmax;
00028 l = k;
00029 }
00030 }
00031
00032
00033 if(big == 0.0) {
00034 for(ib = 0; ib < m; ib++) b[ib] = 0.0;
00035
00036 return;
00037 }
00038
00039 if(i != l) {
00040
00041 for(j = 0; j < m; j++) {
00042 temp = a[j][i];
00043 a[j][i] = a[j][l];
00044 a[j][l] = temp;
00045 }
00046 temp = b[i];
00047 b[i] = b[l];
00048 b[l] = temp;
00049 }
00050
00051
00052 pivot = a[i][i];
00053 jl = i+1;
00054
00055 for(j = jl; j < m; j++) {
00056 temp = a[i][j]/pivot;
00057 b[j] -= temp*b[i];
00058 for(k = i; k < m; k++) a[k][j] -= temp*a[k][i];
00059 }
00060 }
00061
00062
00063 for(i = 0; i < m; i++) {
00064 ir = m-1-i;
00065 if(a[ir][ir] != 0.0) {
00066 temp = b[ir];
00067 if(ir != m-1) {
00068 for(j = 1; j <= i; j++) {
00069 k = m-j;
00070 temp -= a[k][ir]*b[k];
00071 }
00072 }
00073 b[ir] = temp/a[ir][ir];
00074 }
00075 else
00076 b[ir] = 0.0;
00077 }
00078 }
00079
00080
00081
00082
00083
00084
00085
00086
00087