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

◆ N2f1()

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

Nonlinear least squares approximation (adaptive algorithm) (Jacobian not required) (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 values. Since the Jacobian is calculated by finite difference approximation within the routine, the user is not required to calculate the Jacobian.

N2f1 is equivalent to using N2f 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.
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 excluding those used in computing the Jacobian matrix.
[out]NFjcall(Optional)
Number of function evaluations of F used in computing the Jacobian matrix.
[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 FN2f(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 Ex_N2f1()
Const M = 4, N = 2
Dim X(N - 1) As Double, Info As Long
X(0) = 500: X(1) = 0.0001
Call N2f1(M, N, X(), AddressOf FN2f, Info)
Debug.Print "C1, C2 =", X(0), X(1)
Debug.Print "Info =", Info
End Sub
Example Results
C1, C2 = 241.084897030993 5.44942231587108E-04
Info = 0