VIRCAM Pipeline
1.3.4
vircam
catalogue
solve.c
1
/*
2
3
$Id: solve.c,v 1.1 2005-09-13 13:25:31 jim Exp $
4
5
*/
6
#include <stdio.h>
7
#include <stdlib.h>
8
9
#include "imcore.h"
10
#include "floatmath.h"
11
#include "util.h"
12
13
/* gauss elimination to solve ax=b */
14
15
void
solve (
double
a[25][25],
double
b[25],
int
m) {
16
double
temp, big, pivot, rmax;
17
int
i, iu, j, k, l = 0, jl, ib, ir;
18
19
iu = m-1;
20
for
(i = 0; i < iu; i++) {
21
big = 0.0;
22
23
/* find largest remaining term in ith column for pivot */
24
for
(k = i; k < m; k++) {
25
rmax = fabs(a[i][k]);
26
if
(rmax > big) {
27
big = rmax;
28
l = k;
29
}
30
}
31
32
/* check for non-zero term */
33
if
(big == 0.0) {
34
for
(ib = 0; ib < m; ib++) b[ib] = 0.0;
35
/* fprintf(stderr, "solve: Zero determinant\n"); */
36
return
;
37
}
38
39
if
(i != l) {
40
/* switch rows */
41
for
(j = 0; j < m; j++) {
42
temp = a[j][i];
43
a[j][i] = a[j][l];
44
a[j][l] = temp;
45
}
46
temp = b[i];
47
b[i] = b[l];
48
b[l] = temp;
49
}
50
51
/* pivotal reduction */
52
pivot = a[i][i];
53
jl = i+1;
54
55
for
(j = jl; j < m; j++) {
56
temp = a[i][j]/pivot;
57
b[j] -= temp*b[i];
58
for
(k = i; k < m; k++) a[k][j] -= temp*a[k][i];
59
}
60
}
61
62
/* back substitution for solution */
63
for
(i = 0; i < m; i++) {
64
ir = m-1-i;
65
if
(a[ir][ir] != 0.0) {
66
temp = b[ir];
67
if
(ir != m-1) {
68
for
(j = 1; j <= i; j++) {
69
k = m-j;
70
temp -= a[k][ir]*b[k];
71
}
72
}
73
b[ir] = temp/a[ir][ir];
74
}
75
else
76
b[ir] = 0.0;
77
}
78
}
79
80
/*
81
82
$Log: not supported by cvs2svn $
83
84
*/
Generated on Fri Mar 6 2015 10:10:30 for VIRCAM Pipeline by
1.8.6