Doxygen Source Code Documentation
eis_minfit.c File Reference
#include "f2c.h"
Go to the source code of this file.
Functions | |
int | minfit_ (integer *nm, integer *m, integer *n, doublereal *a, doublereal *w, integer *ip, doublereal *b, integer *ierr, doublereal *rv1) |
Variables | |
doublereal | c_b39 = 1. |
Function Documentation
|
Definition at line 12 of file eis_minfit.c. References a, abs, c_b39, d_sign(), i1, l, m1, max, pythag_(), and scale.
00015 { 00016 /* System generated locals */ 00017 integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3; 00018 doublereal d__1, d__2, d__3, d__4; 00019 00020 /* Builtin functions */ 00021 double sqrt(doublereal), d_sign(doublereal *, doublereal *); 00022 00023 /* Local variables */ 00024 static doublereal c__, f, g, h__; 00025 static integer i__, j, k, l; 00026 static doublereal s, x, y, z__, scale; 00027 static integer i1, k1, l1, m1, ii, kk, ll; 00028 extern doublereal pythag_(doublereal *, doublereal *); 00029 static integer its; 00030 static doublereal tst1, tst2; 00031 00032 00033 00034 /* THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE MINFIT, */ 00035 /* NUM. MATH. 14, 403-420(1970) BY GOLUB AND REINSCH. */ 00036 /* HANDBOOK FOR AUTO. COMP., VOL II-LINEAR ALGEBRA, 134-151(1971). */ 00037 00038 /* THIS SUBROUTINE DETERMINES, TOWARDS THE SOLUTION OF THE LINEAR */ 00039 /* T */ 00040 /* SYSTEM AX=B, THE SINGULAR VALUE DECOMPOSITION A=USV OF A REAL */ 00041 /* T */ 00042 /* M BY N RECTANGULAR MATRIX, FORMING U B RATHER THAN U. HOUSEHOLDER 00043 */ 00044 /* BIDIAGONALIZATION AND A VARIANT OF THE QR ALGORITHM ARE USED. */ 00045 00046 /* ON INPUT */ 00047 00048 /* NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */ 00049 /* ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */ 00050 /* DIMENSION STATEMENT. NOTE THAT NM MUST BE AT LEAST */ 00051 /* AS LARGE AS THE MAXIMUM OF M AND N. */ 00052 00053 /* M IS THE NUMBER OF ROWS OF A AND B. */ 00054 00055 /* N IS THE NUMBER OF COLUMNS OF A AND THE ORDER OF V. */ 00056 00057 /* A CONTAINS THE RECTANGULAR COEFFICIENT MATRIX OF THE SYSTEM. */ 00058 00059 /* IP IS THE NUMBER OF COLUMNS OF B. IP CAN BE ZERO. */ 00060 00061 /* B CONTAINS THE CONSTANT COLUMN MATRIX OF THE SYSTEM */ 00062 /* IF IP IS NOT ZERO. OTHERWISE B IS NOT REFERENCED. */ 00063 00064 /* ON OUTPUT */ 00065 00066 /* A HAS BEEN OVERWRITTEN BY THE MATRIX V (ORTHOGONAL) OF THE */ 00067 /* DECOMPOSITION IN ITS FIRST N ROWS AND COLUMNS. IF AN */ 00068 /* ERROR EXIT IS MADE, THE COLUMNS OF V CORRESPONDING TO */ 00069 /* INDICES OF CORRECT SINGULAR VALUES SHOULD BE CORRECT. */ 00070 00071 /* W CONTAINS THE N (NON-NEGATIVE) SINGULAR VALUES OF A (THE */ 00072 /* DIAGONAL ELEMENTS OF S). THEY ARE UNORDERED. IF AN */ 00073 /* ERROR EXIT IS MADE, THE SINGULAR VALUES SHOULD BE CORRECT */ 00074 /* FOR INDICES IERR+1,IERR+2,...,N. */ 00075 00076 /* T */ 00077 /* B HAS BEEN OVERWRITTEN BY U B. IF AN ERROR EXIT IS MADE, */ 00078 /* T */ 00079 /* THE ROWS OF U B CORRESPONDING TO INDICES OF CORRECT */ 00080 /* SINGULAR VALUES SHOULD BE CORRECT. */ 00081 00082 /* IERR IS SET TO */ 00083 /* ZERO FOR NORMAL RETURN, */ 00084 /* K IF THE K-TH SINGULAR VALUE HAS NOT BEEN */ 00085 /* DETERMINED AFTER 30 ITERATIONS. */ 00086 00087 /* RV1 IS A TEMPORARY STORAGE ARRAY. */ 00088 00089 /* CALLS PYTHAG FOR DSQRT(A*A + B*B) . */ 00090 00091 /* QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */ 00092 /* MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 00093 */ 00094 00095 /* THIS VERSION DATED AUGUST 1983. */ 00096 00097 /* ------------------------------------------------------------------ 00098 */ 00099 00100 /* Parameter adjustments */ 00101 --rv1; 00102 --w; 00103 a_dim1 = *nm; 00104 a_offset = a_dim1 + 1; 00105 a -= a_offset; 00106 b_dim1 = *nm; 00107 b_offset = b_dim1 + 1; 00108 b -= b_offset; 00109 00110 /* Function Body */ 00111 *ierr = 0; 00112 /* .......... HOUSEHOLDER REDUCTION TO BIDIAGONAL FORM .......... */ 00113 g = 0.; 00114 scale = 0.; 00115 x = 0.; 00116 00117 i__1 = *n; 00118 for (i__ = 1; i__ <= i__1; ++i__) { 00119 l = i__ + 1; 00120 rv1[i__] = scale * g; 00121 g = 0.; 00122 s = 0.; 00123 scale = 0.; 00124 if (i__ > *m) { 00125 goto L210; 00126 } 00127 00128 i__2 = *m; 00129 for (k = i__; k <= i__2; ++k) { 00130 /* L120: */ 00131 scale += (d__1 = a[k + i__ * a_dim1], abs(d__1)); 00132 } 00133 00134 if (scale == 0.) { 00135 goto L210; 00136 } 00137 00138 i__2 = *m; 00139 for (k = i__; k <= i__2; ++k) { 00140 a[k + i__ * a_dim1] /= scale; 00141 /* Computing 2nd power */ 00142 d__1 = a[k + i__ * a_dim1]; 00143 s += d__1 * d__1; 00144 /* L130: */ 00145 } 00146 00147 f = a[i__ + i__ * a_dim1]; 00148 d__1 = sqrt(s); 00149 g = -d_sign(&d__1, &f); 00150 h__ = f * g - s; 00151 a[i__ + i__ * a_dim1] = f - g; 00152 if (i__ == *n) { 00153 goto L160; 00154 } 00155 00156 i__2 = *n; 00157 for (j = l; j <= i__2; ++j) { 00158 s = 0.; 00159 00160 i__3 = *m; 00161 for (k = i__; k <= i__3; ++k) { 00162 /* L140: */ 00163 s += a[k + i__ * a_dim1] * a[k + j * a_dim1]; 00164 } 00165 00166 f = s / h__; 00167 00168 i__3 = *m; 00169 for (k = i__; k <= i__3; ++k) { 00170 a[k + j * a_dim1] += f * a[k + i__ * a_dim1]; 00171 /* L150: */ 00172 } 00173 } 00174 00175 L160: 00176 if (*ip == 0) { 00177 goto L190; 00178 } 00179 00180 i__3 = *ip; 00181 for (j = 1; j <= i__3; ++j) { 00182 s = 0.; 00183 00184 i__2 = *m; 00185 for (k = i__; k <= i__2; ++k) { 00186 /* L170: */ 00187 s += a[k + i__ * a_dim1] * b[k + j * b_dim1]; 00188 } 00189 00190 f = s / h__; 00191 00192 i__2 = *m; 00193 for (k = i__; k <= i__2; ++k) { 00194 b[k + j * b_dim1] += f * a[k + i__ * a_dim1]; 00195 /* L180: */ 00196 } 00197 } 00198 00199 L190: 00200 i__2 = *m; 00201 for (k = i__; k <= i__2; ++k) { 00202 /* L200: */ 00203 a[k + i__ * a_dim1] = scale * a[k + i__ * a_dim1]; 00204 } 00205 00206 L210: 00207 w[i__] = scale * g; 00208 g = 0.; 00209 s = 0.; 00210 scale = 0.; 00211 if (i__ > *m || i__ == *n) { 00212 goto L290; 00213 } 00214 00215 i__2 = *n; 00216 for (k = l; k <= i__2; ++k) { 00217 /* L220: */ 00218 scale += (d__1 = a[i__ + k * a_dim1], abs(d__1)); 00219 } 00220 00221 if (scale == 0.) { 00222 goto L290; 00223 } 00224 00225 i__2 = *n; 00226 for (k = l; k <= i__2; ++k) { 00227 a[i__ + k * a_dim1] /= scale; 00228 /* Computing 2nd power */ 00229 d__1 = a[i__ + k * a_dim1]; 00230 s += d__1 * d__1; 00231 /* L230: */ 00232 } 00233 00234 f = a[i__ + l * a_dim1]; 00235 d__1 = sqrt(s); 00236 g = -d_sign(&d__1, &f); 00237 h__ = f * g - s; 00238 a[i__ + l * a_dim1] = f - g; 00239 00240 i__2 = *n; 00241 for (k = l; k <= i__2; ++k) { 00242 /* L240: */ 00243 rv1[k] = a[i__ + k * a_dim1] / h__; 00244 } 00245 00246 if (i__ == *m) { 00247 goto L270; 00248 } 00249 00250 i__2 = *m; 00251 for (j = l; j <= i__2; ++j) { 00252 s = 0.; 00253 00254 i__3 = *n; 00255 for (k = l; k <= i__3; ++k) { 00256 /* L250: */ 00257 s += a[j + k * a_dim1] * a[i__ + k * a_dim1]; 00258 } 00259 00260 i__3 = *n; 00261 for (k = l; k <= i__3; ++k) { 00262 a[j + k * a_dim1] += s * rv1[k]; 00263 /* L260: */ 00264 } 00265 } 00266 00267 L270: 00268 i__3 = *n; 00269 for (k = l; k <= i__3; ++k) { 00270 /* L280: */ 00271 a[i__ + k * a_dim1] = scale * a[i__ + k * a_dim1]; 00272 } 00273 00274 L290: 00275 /* Computing MAX */ 00276 d__3 = x, d__4 = (d__1 = w[i__], abs(d__1)) + (d__2 = rv1[i__], abs( 00277 d__2)); 00278 x = max(d__3,d__4); 00279 /* L300: */ 00280 } 00281 /* .......... ACCUMULATION OF RIGHT-HAND TRANSFORMATIONS. */ 00282 /* FOR I=N STEP -1 UNTIL 1 DO -- .......... */ 00283 i__1 = *n; 00284 for (ii = 1; ii <= i__1; ++ii) { 00285 i__ = *n + 1 - ii; 00286 if (i__ == *n) { 00287 goto L390; 00288 } 00289 if (g == 0.) { 00290 goto L360; 00291 } 00292 00293 i__3 = *n; 00294 for (j = l; j <= i__3; ++j) { 00295 /* .......... DOUBLE DIVISION AVOIDS POSSIBLE UNDERFLOW ...... 00296 .... */ 00297 /* L320: */ 00298 a[j + i__ * a_dim1] = a[i__ + j * a_dim1] / a[i__ + l * a_dim1] / 00299 g; 00300 } 00301 00302 i__3 = *n; 00303 for (j = l; j <= i__3; ++j) { 00304 s = 0.; 00305 00306 i__2 = *n; 00307 for (k = l; k <= i__2; ++k) { 00308 /* L340: */ 00309 s += a[i__ + k * a_dim1] * a[k + j * a_dim1]; 00310 } 00311 00312 i__2 = *n; 00313 for (k = l; k <= i__2; ++k) { 00314 a[k + j * a_dim1] += s * a[k + i__ * a_dim1]; 00315 /* L350: */ 00316 } 00317 } 00318 00319 L360: 00320 i__2 = *n; 00321 for (j = l; j <= i__2; ++j) { 00322 a[i__ + j * a_dim1] = 0.; 00323 a[j + i__ * a_dim1] = 0.; 00324 /* L380: */ 00325 } 00326 00327 L390: 00328 a[i__ + i__ * a_dim1] = 1.; 00329 g = rv1[i__]; 00330 l = i__; 00331 /* L400: */ 00332 } 00333 00334 if (*m >= *n || *ip == 0) { 00335 goto L510; 00336 } 00337 m1 = *m + 1; 00338 00339 i__1 = *n; 00340 for (i__ = m1; i__ <= i__1; ++i__) { 00341 00342 i__2 = *ip; 00343 for (j = 1; j <= i__2; ++j) { 00344 b[i__ + j * b_dim1] = 0.; 00345 /* L500: */ 00346 } 00347 } 00348 /* .......... DIAGONALIZATION OF THE BIDIAGONAL FORM .......... */ 00349 L510: 00350 tst1 = x; 00351 /* .......... FOR K=N STEP -1 UNTIL 1 DO -- .......... */ 00352 i__2 = *n; 00353 for (kk = 1; kk <= i__2; ++kk) { 00354 k1 = *n - kk; 00355 k = k1 + 1; 00356 its = 0; 00357 /* .......... TEST FOR SPLITTING. */ 00358 /* FOR L=K STEP -1 UNTIL 1 DO -- .......... */ 00359 L520: 00360 i__1 = k; 00361 for (ll = 1; ll <= i__1; ++ll) { 00362 l1 = k - ll; 00363 l = l1 + 1; 00364 tst2 = tst1 + (d__1 = rv1[l], abs(d__1)); 00365 if (tst2 == tst1) { 00366 goto L565; 00367 } 00368 /* .......... RV1(1) IS ALWAYS ZERO, SO THERE IS NO EXIT */ 00369 /* THROUGH THE BOTTOM OF THE LOOP .......... */ 00370 tst2 = tst1 + (d__1 = w[l1], abs(d__1)); 00371 if (tst2 == tst1) { 00372 goto L540; 00373 } 00374 /* L530: */ 00375 } 00376 /* .......... CANCELLATION OF RV1(L) IF L GREATER THAN 1 ......... 00377 . */ 00378 L540: 00379 c__ = 0.; 00380 s = 1.; 00381 00382 i__1 = k; 00383 for (i__ = l; i__ <= i__1; ++i__) { 00384 f = s * rv1[i__]; 00385 rv1[i__] = c__ * rv1[i__]; 00386 tst2 = tst1 + abs(f); 00387 if (tst2 == tst1) { 00388 goto L565; 00389 } 00390 g = w[i__]; 00391 h__ = pythag_(&f, &g); 00392 w[i__] = h__; 00393 c__ = g / h__; 00394 s = -f / h__; 00395 if (*ip == 0) { 00396 goto L560; 00397 } 00398 00399 i__3 = *ip; 00400 for (j = 1; j <= i__3; ++j) { 00401 y = b[l1 + j * b_dim1]; 00402 z__ = b[i__ + j * b_dim1]; 00403 b[l1 + j * b_dim1] = y * c__ + z__ * s; 00404 b[i__ + j * b_dim1] = -y * s + z__ * c__; 00405 /* L550: */ 00406 } 00407 00408 L560: 00409 ; 00410 } 00411 /* .......... TEST FOR CONVERGENCE .......... */ 00412 L565: 00413 z__ = w[k]; 00414 if (l == k) { 00415 goto L650; 00416 } 00417 /* .......... SHIFT FROM BOTTOM 2 BY 2 MINOR .......... */ 00418 if (its == 30) { 00419 goto L1000; 00420 } 00421 ++its; 00422 x = w[l]; 00423 y = w[k1]; 00424 g = rv1[k1]; 00425 h__ = rv1[k]; 00426 f = ((g + z__) / h__ * ((g - z__) / y) + y / h__ - h__ / y) * .5; 00427 g = pythag_(&f, &c_b39); 00428 f = x - z__ / x * z__ + h__ / x * (y / (f + d_sign(&g, &f)) - h__); 00429 /* .......... NEXT QR TRANSFORMATION .......... */ 00430 c__ = 1.; 00431 s = 1.; 00432 00433 i__1 = k1; 00434 for (i1 = l; i1 <= i__1; ++i1) { 00435 i__ = i1 + 1; 00436 g = rv1[i__]; 00437 y = w[i__]; 00438 h__ = s * g; 00439 g = c__ * g; 00440 z__ = pythag_(&f, &h__); 00441 rv1[i1] = z__; 00442 c__ = f / z__; 00443 s = h__ / z__; 00444 f = x * c__ + g * s; 00445 g = -x * s + g * c__; 00446 h__ = y * s; 00447 y *= c__; 00448 00449 i__3 = *n; 00450 for (j = 1; j <= i__3; ++j) { 00451 x = a[j + i1 * a_dim1]; 00452 z__ = a[j + i__ * a_dim1]; 00453 a[j + i1 * a_dim1] = x * c__ + z__ * s; 00454 a[j + i__ * a_dim1] = -x * s + z__ * c__; 00455 /* L570: */ 00456 } 00457 00458 z__ = pythag_(&f, &h__); 00459 w[i1] = z__; 00460 /* .......... ROTATION CAN BE ARBITRARY IF Z IS ZERO ......... 00461 . */ 00462 if (z__ == 0.) { 00463 goto L580; 00464 } 00465 c__ = f / z__; 00466 s = h__ / z__; 00467 L580: 00468 f = c__ * g + s * y; 00469 x = -s * g + c__ * y; 00470 if (*ip == 0) { 00471 goto L600; 00472 } 00473 00474 i__3 = *ip; 00475 for (j = 1; j <= i__3; ++j) { 00476 y = b[i1 + j * b_dim1]; 00477 z__ = b[i__ + j * b_dim1]; 00478 b[i1 + j * b_dim1] = y * c__ + z__ * s; 00479 b[i__ + j * b_dim1] = -y * s + z__ * c__; 00480 /* L590: */ 00481 } 00482 00483 L600: 00484 ; 00485 } 00486 00487 rv1[l] = 0.; 00488 rv1[k] = f; 00489 w[k] = x; 00490 goto L520; 00491 /* .......... CONVERGENCE .......... */ 00492 L650: 00493 if (z__ >= 0.) { 00494 goto L700; 00495 } 00496 /* .......... W(K) IS MADE NON-NEGATIVE .......... */ 00497 w[k] = -z__; 00498 00499 i__1 = *n; 00500 for (j = 1; j <= i__1; ++j) { 00501 /* L690: */ 00502 a[j + k * a_dim1] = -a[j + k * a_dim1]; 00503 } 00504 00505 L700: 00506 ; 00507 } 00508 00509 goto L1001; 00510 /* .......... SET ERROR -- NO CONVERGENCE TO A */ 00511 /* SINGULAR VALUE AFTER 30 ITERATIONS .......... */ 00512 L1000: 00513 *ierr = k; 00514 L1001: 00515 return 0; 00516 } /* minfit_ */ |
Variable Documentation
|
Definition at line 10 of file eis_minfit.c. Referenced by minfit_(). |