1 | SUBROUTINE FELLIPSE(NMAX,X,Y,BB,TAU,RNORM) |
---|
2 | |
---|
3 | Cf2py intent(in) NMAX |
---|
4 | Cf2py intent(in) X,Y |
---|
5 | Cf2py intent(in) Y |
---|
6 | Cf2py depend(NMAX) X,Y |
---|
7 | Cf2py intent(in) TAU |
---|
8 | Cf2py intent(out) BB |
---|
9 | Cf2py intent(out) RNORM |
---|
10 | |
---|
11 | C |
---|
12 | C NMAX is the number of data points |
---|
13 | C A, B : work arrays |
---|
14 | C X, Y : data points coordinates |
---|
15 | C |
---|
16 | C Daniel Pfenniger, Geneva Observatory, 6/1991 |
---|
17 | C |
---|
18 | C |
---|
19 | REAL*8 X(NMAX),Y(NMAX) |
---|
20 | REAL*4 A(5,NMAX),B(NMAX),BB(0:4),TAU |
---|
21 | INTEGER*4 KRANK,NMAX |
---|
22 | REAL*4 RNORM |
---|
23 | C |
---|
24 | C |
---|
25 | C |
---|
26 | CALL FITQDR(NMAX,NMAX,A,B,X,Y,TAU,KRANK,RNORM) |
---|
27 | |
---|
28 | C Coefficients of the quadratic form |
---|
29 | C |
---|
30 | BB(0) = B(1) |
---|
31 | BB(1) = B(2) |
---|
32 | BB(2) = B(3) |
---|
33 | BB(3) = B(4) |
---|
34 | BB(4) = B(5) |
---|
35 | C |
---|
36 | RETURN |
---|
37 | END |
---|
38 | C----------------------------------------------------------------------- |
---|
39 | C |
---|
40 | SUBROUTINE FITQDR(N,NMAX,A,B,X,Y,TAU,KRANK,RNORM) |
---|
41 | C |
---|
42 | C Fortran subroutine using the linear least squares routine HFTI |
---|
43 | C finding the parameters a, c, d, e, f defining the best |
---|
44 | C quadratic form |
---|
45 | C |
---|
46 | C (1+a) X^2 + (1-a) Y^2 + c X Y + d X + e Y + f = 0 |
---|
47 | C |
---|
48 | C passing through a set of data points {Xi,Yi} i=1,..N |
---|
49 | C The result is invariant by rotation and translation. |
---|
50 | C If N<6, this program finds an exact solution passing through the |
---|
51 | C points |
---|
52 | C If N>5, it finds the quadratic form which minimizes |
---|
53 | C |
---|
54 | C SUM(i=1,N) [ (1+a)X^2 + (1-a)Y^2 + c X Y + d X + e Y + f ]^2 |
---|
55 | C |
---|
56 | C N : Actual number of data points |
---|
57 | C NMAX : Maximum number of data points |
---|
58 | C NPAR : Number of parameters to find (5) |
---|
59 | C A, B : Work arrays |
---|
60 | C X, Y : Data point coordinates |
---|
61 | C KRANK : Rank of the data matrix A (should be 5) |
---|
62 | C RNORM : Norm of the residual |
---|
63 | C |
---|
64 | C TAU : tolerance for a zero in HFTI |
---|
65 | C |
---|
66 | C On outpout a,c,d,e,f are in B(1),B(2), ... B(5) respectively |
---|
67 | C |
---|
68 | C Daniel Pfenniger, Geneva Observatory, 6/1991 |
---|
69 | C |
---|
70 | PARAMETER (NPAR=5) |
---|
71 | C |
---|
72 | INTEGER*4 NMAX,KRANK |
---|
73 | REAL*4 A(NMAX,NPAR), B(NMAX),TAU, RNORM |
---|
74 | REAL*8 X(NMAX), Y(NMAX) |
---|
75 | C |
---|
76 | C H, G, IP : Work arrays for HFTI |
---|
77 | C |
---|
78 | INTEGER*4 H(NPAR), IP(NPAR),I,N |
---|
79 | REAL*4 G(NPAR) |
---|
80 | C |
---|
81 | C Building the matrices A and B |
---|
82 | C |
---|
83 | DO 10 I = 1, N |
---|
84 | A(I,1) = X(I)**2-Y(I)**2 |
---|
85 | A(I,2) = X(I)*Y(I) |
---|
86 | A(I,3) = X(I) |
---|
87 | A(I,4) = Y(I) |
---|
88 | A(I,5) = 1. |
---|
89 | 10 B(I) = -(X(I)**2+Y(I)**2) |
---|
90 | C |
---|
91 | C Solving the LS problem: ||A Z - B|| minimum |
---|
92 | C Call HFTI, the result Z is in the first NPAR rows of B |
---|
93 | C TAU is the tolerance for zero |
---|
94 | C KRANK is the rank of A (should be NPAR) |
---|
95 | C RNORM is the norm of the residual |
---|
96 | C See Lawson & Hanson (1974) for detail |
---|
97 | CALL HFTI(A,NMAX,N,NPAR,B,NMAX,1,TAU,KRANK,RNORM,H,G,IP) |
---|
98 | C |
---|
99 | RETURN |
---|
100 | END |
---|
101 | |
---|
102 | C Some LSQ routines from Lawson & Hanson |
---|
103 | C |
---|
104 | SUBROUTINE HFTI (A,MDA,M,N,B,MDB,NB,TAU,KRANK,RNORM,H,G,IP) |
---|
105 | C C.L.LAWSON & R.J.HANSON, JET PROPULSION LABORATORY, 1973 JUN 12 |
---|
106 | C TO APPEAR IN 'SOLVING LEAST SQUARES PROBLEMS', PRENTICE-HALL 1974 |
---|
107 | C SOLVE LEAST SQUARES PROBLEM USING ALGORITHM HFTI. |
---|
108 | C |
---|
109 | INTEGER*4 MDA,M,N,MDB,NB,KRANK,H |
---|
110 | REAL*4 A,B,TAU,RNORM,G |
---|
111 | DIMENSION A(MDA,N),B(MDB,NB),H(N),G(N),RNORM(NB) |
---|
112 | INTEGER IP(N) |
---|
113 | DOUBLE PRECISION SM,DZERO |
---|
114 | PARAMETER (SZERO=0., DZERO=0.D0, FACTOR = 0.001 ) |
---|
115 | C |
---|
116 | K = 0 |
---|
117 | LDIAG = MIN0(M,N) |
---|
118 | IF (LDIAG.LE.0) GOTO 270 |
---|
119 | DO 80 J=1,LDIAG |
---|
120 | IF (J.EQ.1) GOTO 20 |
---|
121 | C |
---|
122 | C UPDATE SQUARED COLUMN LENGTHS AND FIND LMAX |
---|
123 | C |
---|
124 | LMAX = J |
---|
125 | DO 10 L = J,N |
---|
126 | H(L) = H(L) - A(J-1,L)**2 |
---|
127 | IF (H(L).GT.H(LMAX)) LMAX = L |
---|
128 | 10 CONTINUE |
---|
129 | IF (DIFF(HMAX+FACTOR*H(LMAX),HMAX)) 20,20,50 |
---|
130 | C |
---|
131 | C COMPUTE SQUARED COLUMN LENGTHS AND FIND LMAX |
---|
132 | C |
---|
133 | 20 LMAX = J |
---|
134 | DO 40 L = J,N |
---|
135 | H(L) = SZERO |
---|
136 | DO 30 I = J,M |
---|
137 | 30 H(L) = H(L) + A(I,L)**2 |
---|
138 | IF (H(L).GT.H(LMAX)) LMAX = L |
---|
139 | 40 CONTINUE |
---|
140 | HMAX = H(LMAX) |
---|
141 | C |
---|
142 | C LMAX HAS BEEN DETERMINED |
---|
143 | C |
---|
144 | C DO COLUMN INTERCHANGES IF NEEDED. |
---|
145 | C |
---|
146 | 50 CONTINUE |
---|
147 | IP(J) = LMAX |
---|
148 | IF (IP(J).EQ.J) GOTO 70 |
---|
149 | DO 60 I = 1,M |
---|
150 | TMP = A(I,J) |
---|
151 | A(I,J) = A(I,LMAX) |
---|
152 | 60 A(I,LMAX) = TMP |
---|
153 | H(LMAX) = H(J) |
---|
154 | C |
---|
155 | C COMPUTE THE J-TH TRANSFORMATION AND APPLY IT TO A AND B. |
---|
156 | C |
---|
157 | 70 CALL H12 (1,J,J+1,M,A(1,J),1,H(J),A(1,J+1),1,MDA,N-J) |
---|
158 | 80 CALL H12 (2,J,J+1,M,A(1,J),1,H(J),B,1,MDB,NB) |
---|
159 | C |
---|
160 | C DETERMINE THE PSEUDORANK, K, USING THE TOLERANCE, TAU. |
---|
161 | C |
---|
162 | DO 90 J = 1,LDIAG |
---|
163 | IF (ABS(A(J,J)).LE.TAU) GOTO 100 |
---|
164 | 90 CONTINUE |
---|
165 | K = LDIAG |
---|
166 | GOTO 110 |
---|
167 | 100 K = J - 1 |
---|
168 | 110 KP1 = K + 1 |
---|
169 | C |
---|
170 | C COMPUTE THE NORMS OF THE RESIDUAL VECTORS. |
---|
171 | C |
---|
172 | IF (NB.LE.0) GOTO 140 |
---|
173 | DO 130 JB = 1,NB |
---|
174 | TMP = SZERO |
---|
175 | IF (KP1.GT.M) GOTO 130 |
---|
176 | DO 120 I = KP1,M |
---|
177 | 120 TMP = TMP + B(I,JB)**2 |
---|
178 | 130 RNORM(JB) = SQRT(TMP) |
---|
179 | 140 CONTINUE |
---|
180 | C SPECIAL FOR PSEUDORANK = 0 |
---|
181 | IF (K.GT.0) GOTO 160 |
---|
182 | IF (NB.LE.0) GOTO 270 |
---|
183 | DO 150 JB = 1,NB |
---|
184 | DO 150 I = 1,N |
---|
185 | 150 B(I,JB) = SZERO |
---|
186 | GOTO 270 |
---|
187 | C |
---|
188 | C IF THE PSEUDORANK IS LESS THAN N COMPUTE HOUSHOLDER |
---|
189 | C DECOMPOSITION OF FIRST K ROWS. |
---|
190 | C |
---|
191 | 160 IF (K.EQ.N) GOTO 180 |
---|
192 | DO 170 II = 1,K |
---|
193 | I = KP1 - II |
---|
194 | 170 CALL H12 (1,I,KP1,N,A(I,1),MDA,G(I),A,MDA,1,I-1) |
---|
195 | 180 CONTINUE |
---|
196 | C |
---|
197 | C |
---|
198 | IF (NB.LE.0) GOTO 270 |
---|
199 | DO 260 JB = 1,NB |
---|
200 | C |
---|
201 | C SOLVE THE K BY K TRIANGULAR SYSTEM |
---|
202 | C |
---|
203 | DO 210 L = 1,K |
---|
204 | SM = DZERO |
---|
205 | I = KP1 - L |
---|
206 | IF (I.EQ.K) GOTO 200 |
---|
207 | IP1 = I + 1 |
---|
208 | DO 190 J = IP1,K |
---|
209 | 190 SM = SM + A(I,J)*DBLE(B(J,JB)) |
---|
210 | 200 SM1 = SM |
---|
211 | 210 B(I,JB) = (B(I,JB)-SM1)/A(I,I) |
---|
212 | C |
---|
213 | IF (K.EQ.N) GOTO 240 |
---|
214 | DO 220 J = KP1,N |
---|
215 | 220 B(J,JB) = SZERO |
---|
216 | DO 230 I = 1,K |
---|
217 | 230 CALL H12 (2,I,KP1,N,A(I,1),MDA,G(I),B(1,JB),1,MDB,1) |
---|
218 | C |
---|
219 | C RE-ORDER THE SOLUTION VECTOR TO COMPENSATE FOR THE |
---|
220 | C COLUMN INTERCHANGES. |
---|
221 | C |
---|
222 | C COMPLETE COMPUTATION OF SOLUTION VECTOR |
---|
223 | C |
---|
224 | 240 DO 250 JJ = 1,LDIAG |
---|
225 | J = LDIAG + 1 - JJ |
---|
226 | IF (IP(J).EQ.J) GOTO 250 |
---|
227 | L = IP(J) |
---|
228 | TMP = B(L,JB) |
---|
229 | B(L,JB) = B(J,JB) |
---|
230 | B(J,JB) = TMP |
---|
231 | 250 CONTINUE |
---|
232 | 260 CONTINUE |
---|
233 | C |
---|
234 | C THE SOLUTION VECTORS, X, ARE NOW |
---|
235 | C IN THE FIRST N ROWS OF THE ARRAY B(.). |
---|
236 | C |
---|
237 | 270 KRANK = K |
---|
238 | RETURN |
---|
239 | END |
---|
240 | C----------------------------------------------------------------------- |
---|
241 | C |
---|
242 | C SUBROUTINE H12 (MODE,LPIVOT,L1,M,U,IUE,UP,C,ICE,ICV,NCV) |
---|
243 | C C.L.LAWSON & R.J.HANSON, JET PROPULSION LABORATORY, 1973 JUN 12 |
---|
244 | C TO APPEAR IN 'SOLVING LEAST SQUARES PROBLEMS', PRENTICE-HALL, 1974 |
---|
245 | C |
---|
246 | C CONSTRUCTION AND/OR APPLICATION OF A SINGLE |
---|
247 | C HOUSHOLDER TRANSFORMATION: Q = I + U*(U**T)/B |
---|
248 | C |
---|
249 | C MODE = 1 OR 2 TO SELECT ALGORITHM H1 OR H2 |
---|
250 | C LPIVOT IS THE INDEX OF THE PIVOT ELEMENT. |
---|
251 | C L1,M IF L1 .LE. M THE TRANSFORMATION WILL BE CONSTRUCTED TO |
---|
252 | C ZERO ELEMENTS INDEXED FROM L1 THROUGH M. IF L1 .GT. M |
---|
253 | C THE SUBROUTINE DOES AN IDENTITY TRANSFORMATION. |
---|
254 | C U(),IUE,UP ON ENTRY TO H1 U() CONTAINS THE PIVOT VECTOR. |
---|
255 | C IUE IS THE STORAGE INCREMENT BETWEEN ELEMENTS. |
---|
256 | C ON EXIT FROM H1 U() AND UP |
---|
257 | C CONTAIN QUANTITES DEFINING THE VECTOR U OF THE |
---|
258 | C HOUSHOLDER TRANSFORMATION. ON ENTRY TO H2 U() |
---|
259 | C AND UP SHOULD CONTAIN QUATITIES PREVIOUSLY COMPUTED |
---|
260 | C BY H1. THESE WILL NOT BE MODIFIED BY H2. |
---|
261 | C C() ON ENTRY TO H1 OR H2 C() CONTAINS A MATRIX WHICH WILL BE |
---|
262 | C REGARDED AS A SET OF VECTORS TO WHICH THE HOUSHOLDER |
---|
263 | C TRANSFORMATION IS TO BE APPLIED. ON EXIT C() CONTAINS THE |
---|
264 | C SET OF TRANSFORMED VECTORS. |
---|
265 | C ICE STORAGE INCREMENT BETWEEN ELEMENTS OF VECTORS IN C(). |
---|
266 | C ICV STORAGE INCREMENT BETWEEN VECTORS IN C(). |
---|
267 | C NCV NUMBER OF VECTORS IN C() TO BE TRANSFORMED. IF NCV .LE. 0 |
---|
268 | C NO OPERATIONS WILL BE DONE ON C(). |
---|
269 | C |
---|
270 | SUBROUTINE H12 (MODE,LPIVOT,L1,M,U,IUE,UP,C,ICE,ICV,NCV) |
---|
271 | INTEGER*4 MODE,LPIVOT,L1,M,IUE,ICE,ICV,NCV |
---|
272 | REAL*4 U,UP,C,X,Y |
---|
273 | DIMENSION U(IUE,M),C(*) |
---|
274 | DOUBLE PRECISION SM,B |
---|
275 | PARAMETER (ONE = 1.) |
---|
276 | C |
---|
277 | IF (0.GE.LPIVOT.OR.LPIVOT.GE.L1.OR.L1.GT.M) RETURN |
---|
278 | CL = ABS(U(1,LPIVOT)) |
---|
279 | IF (MODE.EQ.2) GOTO 60 |
---|
280 | C *** CONSTRUCT THE TRANSFORMATION *** |
---|
281 | DO 10 J = L1,M |
---|
282 | 10 CL = AMAX1(ABS(U(1,J)),CL) |
---|
283 | IF (CL) 130,130,20 |
---|
284 | 20 CLINV = ONE/CL |
---|
285 | SM = (DBLE(U(1,LPIVOT))*CLINV)**2 |
---|
286 | DO 30 J = L1,M |
---|
287 | 30 SM = SM + (DBLE(U(1,J))*CLINV)**2 |
---|
288 | C CONVERT DBLE PREC SM TO SNGL. PREC. SM1 |
---|
289 | SM1 = SM |
---|
290 | CL = CL*SQRT(SM1) |
---|
291 | IF (U(1,LPIVOT)) 50,50,40 |
---|
292 | 40 CL = -CL |
---|
293 | 50 UP = U(1,LPIVOT) - CL |
---|
294 | U(1,LPIVOT) = CL |
---|
295 | GOTO 70 |
---|
296 | C *** APPLY THE TRANSFORMATION I + U*(U**T)*B TO C *** |
---|
297 | C |
---|
298 | 60 IF (CL) 130,130,70 |
---|
299 | 70 IF (NCV.LE.0) RETURN |
---|
300 | B = DBLE(UP)*U(1,LPIVOT) |
---|
301 | C B MUST BE NONPOSITIVE HERE. IF B=0.,RETURN |
---|
302 | C |
---|
303 | IF (B) 80,130,130 |
---|
304 | 80 B = ONE/B |
---|
305 | I2 = 1 - ICV + ICE*(LPIVOT-1) |
---|
306 | INCR = ICE*(L1-LPIVOT) |
---|
307 | DO 120 J = 1,NCV |
---|
308 | I2 = I2 +ICV |
---|
309 | I3 = I2 + INCR |
---|
310 | I4 = I3 |
---|
311 | SM = C(I2)*DBLE(UP) |
---|
312 | DO 90 I = L1,M |
---|
313 | SM = SM + C(I3)*DBLE(U(1,I)) |
---|
314 | 90 I3 = I3 + ICE |
---|
315 | IF (SM) 100,120,100 |
---|
316 | 100 SM = SM*B |
---|
317 | C(I2) = C(I2) + SM*DBLE(UP) |
---|
318 | DO 110 I = L1,M |
---|
319 | C(I4) = C(I4) + SM*DBLE(U(1,I)) |
---|
320 | 110 I4 = I4 + ICE |
---|
321 | 120 CONTINUE |
---|
322 | 130 RETURN |
---|
323 | END |
---|
324 | C--------------------------- this routine is not a joke! |
---|
325 | C |
---|
326 | FUNCTION DIFF(X,Y) |
---|
327 | C C.L.LAWSON & R.J.HANSON, JET PROPULSION LABORATORY, 1973 JUNE 7 |
---|
328 | C TO APPEAR IN 'SOLVING LEAST SQUARES PROBLEMS', PRENTICE-HALL, 1974 |
---|
329 | REAL X,Y |
---|
330 | DIFF = X-Y |
---|
331 | RETURN |
---|
332 | END |
---|