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
|
include <math/nlfit.h>
$if (datatype == r)
include "nlfitdefr.h"
$else
include "nlfitdefd.h"
$endif
# NLSOLVE -- Procedure to solve nonlinear system
procedure nlsolve$t (nl, ier)
pointer nl # pointer to the nlfit structure
int ier # error code
int nfree
begin
# Make temporary arrays.
call amov$t (ALPHA(NL_ALPHA(nl)), COVAR(NL_COVAR(nl)),
NL_NFPARAMS(nl) ** 2)
call amov$t (BETA(NL_BETA(nl)), DPARAM(NL_DPARAM(nl)), NL_NFPARAMS(nl))
# Add the lambda damping factor.
call nl_damp$t (COVAR(NL_COVAR(nl)), COVAR(NL_COVAR(nl)),
(1.0 + NL_LAMBDA(nl)), NL_NFPARAMS(nl), NL_NFPARAMS(nl))
ier = OK
nfree = NL_NPTS(nl) - NL_NFPARAMS(nl)
if (nfree < 0) {
ier = NO_DEG_FREEDOM
return
}
# Compute the factorization of the matrix.
call nl_chfac$t (COVAR(NL_COVAR(nl)), NL_NFPARAMS(nl), NL_NFPARAMS(nl),
CHOFAC(NL_CHOFAC(nl)), ier)
# Solve the equations for the parameter increments.
call nl_chslv$t (CHOFAC(NL_CHOFAC(nl)), NL_NFPARAMS(nl), NL_NFPARAMS(nl),
DPARAM(NL_DPARAM(nl)), DPARAM(NL_DPARAM(nl)))
end
|