00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <render.h>
00020 #include <math.h>
00021 #include <stdlib.h>
00022 #include <stdio.h>
00023 #define asub(i,j) a[(i)*n + (j)]
00024
00025
00026 void solve(double *a, double *b, double *c, int n)
00027 {
00028 double *asave, *csave;
00029 double amax, dum, pivot;
00030 register int i, ii, j;
00031 register int k, m, mp;
00032 register int istar, ip;
00033 register int nm, nsq, t;
00034
00035 istar = 0;
00036 nsq = n * n;
00037 asave = N_GNEW(nsq, double);
00038 csave = N_GNEW(n, double);
00039
00040 for (i = 0; i < n; i++)
00041 csave[i] = c[i];
00042 for (i = 0; i < nsq; i++)
00043 asave[i] = a[i];
00044
00045 nm = n - 1;
00046 for (i = 0; i < nm; i++) {
00047
00048 amax = 0.;
00049 for (ii = i; ii < n; ii++) {
00050 dum = fabs(asub(ii, i));
00051 if (dum < amax)
00052 continue;
00053 istar = ii;
00054 amax = dum;
00055 }
00056
00057 if (amax < 1.e-10)
00058 goto bad;
00059
00060 for (j = i; j < n; j++) {
00061 t = istar * n + j;
00062 dum = a[t];
00063 a[t] = a[i * n + j];
00064 a[i * n + j] = dum;
00065 }
00066 dum = c[istar];
00067 c[istar] = c[i];
00068 c[i] = dum;
00069
00070 ip = i + 1;
00071 for (ii = ip; ii < n; ii++) {
00072 pivot = a[ii * n + i] / a[i * n + i];
00073 c[ii] = c[ii] - pivot * c[i];
00074 for (j = 0; j < n; j++)
00075 a[ii * n + j] = a[ii * n + j] - pivot * a[i * n + j];
00076 }
00077 }
00078
00079 if (fabs(a[n * n - 1]) < 1.e-10)
00080 goto bad;
00081 b[n - 1] = c[n - 1] / a[n * n - 1];
00082
00083 for (k = 0; k < nm; k++) {
00084 m = n - k - 2;
00085 b[m] = c[m];
00086 mp = m + 1;
00087 for (j = mp; j < n; j++)
00088 b[m] = b[m] - a[m * n + j] * b[j];
00089 b[m] = b[m] / a[m * n + m];
00090 }
00091
00092 for (i = 0; i < n; i++)
00093 c[i] = csave[i];
00094 for (i = 0; i < nsq; i++)
00095 a[i] = asave[i];
00096 free(asave);
00097 free(csave);
00098 return;
00099 bad:
00100 printf("ill-conditioned\n");
00101 free(asave);
00102 free(csave);
00103 return;
00104 }