solve.c

00001 /*
00002 
00003 $Id: solve.c,v 1.1 2005/09/13 13:25:31 jim Exp $
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 /* gauss elimination to solve ax=b */
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     /* find largest remaining term in ith column for pivot */
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     /* check for non-zero term */
00033     if(big == 0.0) {
00034       for(ib = 0; ib < m; ib++) b[ib] = 0.0;
00035 /*        fprintf(stderr, "solve: Zero determinant\n"); */
00036       return;
00037     }
00038 
00039     if(i != l) {
00040       /* switch rows */
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     /* pivotal reduction */
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   /* back substitution for solution */
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 $Log: solve.c,v $
00083 Revision 1.1  2005/09/13 13:25:31  jim
00084 Initial entry after modifications to make cpl compliant
00085 
00086 
00087 */

Generated on 5 Mar 2013 for VIRCAM Pipeline by  doxygen 1.6.1