aboutsummaryrefslogtreecommitdiff
path: root/noao/imred/vtel/lstsq.x
blob: 9091fb48cd4cfff013a10cf110a97b8c1acd4454 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
include	<mach.h>

# LSTSQ -- Do a least squares fit to the data contained in the zz array.
# Algorithm is from Jack Harvey. (Yes, it's a black box...)

procedure lstsq (zz, mz, fno)

real	zz[mz, mz]
int	mz
real	fno

int	n, m, m1, i, j, k, l, l1
real	fn, pp

begin
	n = mz - 2
	m = n + 1
	m1 = m + 1
	fn = n

	do i = 1, m {
	    l = i + 1
	    do k = 1, i-1 {
		zz[i,l] = zz[i,l] - zz[k,l]**2
	    }

	    if (i == m)
		break
	    if (zz[i,l] >= 0.0)
	        zz[i,l] = zz[i,l]**.5
	    else {
		call eprintf ("square root of negitive number in lstsq\n")
	        zz[i,l] = 0.0
	    }
	    l1 = l + 1

	    do j = l1, m1 {
		do k = 1, i-1 {
		    zz[i,j] = zz[i,j] - zz[k,l] * zz[k,j]
		}
		if (zz[i,l] >= EPSILONR)
		    zz[i,j] = zz[i,j] / zz[i,l]
		else
		    call eprintf ("divide by zero in lstsq\n")
	    }

	    if (zz[i,l] >= EPSILONR)
	        zz[i,i] = 1. / zz[i,l]
	    else
		call eprintf ("divide by zero in lstsq\n")
	    do j = 1, i-1 {
		pp = 0.
		l1 = i - 1
		do k = j, l1 {
		    pp = pp + zz[k,l] * zz[k,j]
		}
	        zz[i,j] = -zz[i,i] * pp
	    }
	}

	if ((fno - fn) >= EPSILONR)
	    if ((zz[m,m1] / (fno - fn)) >= 0.0)
	        zz[m1,m1] = .6745 * (zz[m,m1] / (fno - fn))**.5
	    else {
		call eprintf ("square root of negitive number in lstsq\n")
	        zz[m1,m1] = 0.0
	    }
	else
	    call eprintf ("divide by zero in lstsq\n")

	do i = 1, n {
	    zz[m,i] = 0.
	    pp = 0.
	    do j = i, n {
		zz[m,i] = zz[m,i] + zz[j,i] * zz[j,m1]
		pp = pp + zz[j,i] * zz[j,i]
	    }
	    if (pp >= 0.0)
	        zz[m1,i] = zz[m1,m1] * pp**.5
	    else {
		call eprintf ("square root of negitive number in lstsq\n")
	        zz[m1,i] = 0.0
	    }
	}
end