XLPack 6.1
Excel VBA Numerical Library Reference Manual
Loading...
Searching...
No Matches

◆ N2g1()

Sub N2g1 ( M As  Long,
N As  Long,
X() As  Double,
F As  LongPtr,
Fj As  LongPtr,
Info As  Long,
Optional NFcall As  Long,
Optional NFjcall As  Long,
Optional Niter As  Long 
)

Nonlinear least squares approximation (adaptive algorithm) (simple driver)

Purpose
This routine minimizes the sum of the squares of M nonlinear functions in N variables by the adaptive algorithm which combines and augments a Gauss-Newton, Levenberg-Marquardt and other techniques for better convergence.
minimize the sum of fi(x1, x2, ..., xn)^2 (sum for i = 1 to M)
The user must provide a subroutine which calculates the function and Jacobian values.

N2g1 is equivalent to using N2g with setting default parameters. Covariance matrix and regression diagnostic vector are not computed.
Parameters
[in]MNumber of data. (M > 0)
[in]NNumber of parameters. (0 < N <= M)
[in,out]X()Array X(LX - 1) (LX >= N)
[in] X must contain an initial estimate of the solution vector.
[out] X contains the final estimate of the solution vector.
[in]FThe user-supplied subroutine which calculates the function fi(x1, x2, ..., xn) defined as follows.
Sub F(M As Long, N As Long, X() As Double, Nf As Long, Fvec() As Double)
Calculate the Fi value from given X() and return in Fvec(i-1) (i = 1 to M).
Nf is invocation counter. If given X() is out of bounds, Nf should be set to 0.
The other variables should not be altered.
For same X() value, same Nf will be passed to F and Fj.
End Sub
[in]FjThe user-supplied subroutine which calculates the Jacobian of the function fi(x1, x2, ..., xn) defined as follows.
Sub Fj(M As Long, N As Long, X() As Double, Nf As Long, Fjac() As Double)
Calculate the Jacobian (dFi/dXj) from given X() and return in Fjac(i-1,j-1) (i = 1 to M, j = 1 to N).
Nf is invocation counter. If given X() is out of bounds, Nf should be set to 0.
The other variables should not be altered.
For same X() value, same Nf will be passed to F and Fj.
End Sub
[out]Info= 0: Successful exit.
= -1: The argument M had an illegal value. (M < N)
= -2: The argument N had an illegal value. (N < 1)
= -3: The argument X() is invalid.
= 7: Singular convergence. (Hessian near the current iterate appears to be singular)
= 8: False convergence. (Iterate appears to be converging to a noncritical point. Tolerances may be too small)
= 9: Function evaluation limit reached.
= 10: Iteration limit reached.
= 63: F(X) cannot be computed at the initial X.
= 65: The gradient could not be computed at X.
[out]NFcall(Optional)
Number of function evaluations of F.
[out]NFjcall(Optional)
Number of function evaluations of Fj.
[out]Niter(Optional)
Number of iterations.
Reference
netlib/port
Example Program
Approximate the following data with model function f(x) = c1*(1 - exp(-c2*x)). Determine two parameters c1 and c2 by the nonlinear least squares method.
f(x) x
10.07 77.6
29.61 239.9
50.76 434.8
81.78 760.0
The initial estimates of the solution are c1 = 500 and c2 = 0.0001.
Sub FN2g(M As Long, N As Long, X() As Double, Nf As Long, Fvec() As Double)
Dim Xdata(3) As Double, Ydata(3) As Double, I As Long
Ydata(0) = 10.07: Xdata(0) = 77.6
Ydata(1) = 29.61: Xdata(1) = 239.9
Ydata(2) = 50.76: Xdata(2) = 434.8
Ydata(3) = 81.78: Xdata(3) = 760
For I = 0 To M - 1
Fvec(I) = Ydata(I) - X(0) * (1 - Exp(-Xdata(I) * X(1)))
Next
End Sub
Sub JN2g(M As Long, N As Long, X() As Double, Nf As Long, Fjac() As Double)
Dim Xdata(3) As Double, Ydata(3) As Double, I As Long
Ydata(0) = 10.07: Xdata(0) = 77.6
Ydata(1) = 29.61: Xdata(1) = 239.9
Ydata(2) = 50.76: Xdata(2) = 434.8
Ydata(3) = 81.78: Xdata(3) = 760
For I = 0 To M - 1
Fjac(I, 0) = Exp(-Xdata(I) * X(1)) - 1
Fjac(I, 1) = -Xdata(I) * X(0) * Exp(-X(1) * Xdata(I))
Next
End Sub
Sub Ex_N2g1()
Const M = 4, N = 2
Dim X(N - 1) As Double, Info As Long
X(0) = 500: X(1) = 0.0001
Call N2g1(M, N, X(), AddressOf FN2g, AddressOf JN2g, Info)
Debug.Print "C1, C2 =", X(0), X(1)
Debug.Print "Info =", Info
End Sub
Example Results
C1, C2 = 241.084896112856 5.44942234058364E-04
Info = 0