# model2jacfun: Generate a Jacobian matrix function from a nonlinear model... In nlmrt: Functions for Nonlinear Least Squares Solutions

## Description

Given a nonlinear model expressed as an expression of the form lhs ~ formula_for_rhs and a start vector where parameters used in the model formula are named, attempts to build the the `R` function for the Jacobian of the residuals. As a side effect, a text file with the program code is generated.

## Usage

 `1` ``` model2jacfun(modelformula, pvec, funname="myjac", filename=NULL) ```

## Arguments

 `modelformula` This is a modeling formula of the form (as in `nls`) lhsvar ~ rhsexpression for example, y ~ b1/(1+b2*exp(-b3*tt)) You may also give this as a string. `pvec` A named parameter vector. For our example, we could use start=c(b1=1, b2=2.345, b3=0.123) WARNING: the parameters in the output function will be used in the order presented in this vector. Names are NOT respected in the output function. `funname` The (optional) name for the function that is generated in the file named in the next argument. The default name is 'myjac'. `filename` The (optional) name of a file that is written containing the (text) program code for the function. If NULL, no file is written.

None.

## Value

An `R` function object that computes the Jacobian of the nonlinear model at a set of parameters.

## Author(s)

John C Nash <nashjc@uottawa.ca>

## References

Nash, J. C. (1979, 1990) _Compact Numerical Methods for Computers. Linear Algebra and Function Minimisation._ Adam Hilger./Institute of Physics Publications

Function `nls()`, packages `optim` and `optimx`.
 ``` 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``` ``` cat("See also examples in nlmrt-package.Rd\n") require(numDeriv) y <- c(5.308, 7.24, 9.638, 12.866, 17.069, 23.192, 31.443, 38.558, 50.156, 62.948, 75.995, 91.972) # for testing tt <- seq_along(y) # for testing f <- y ~ b1/(1 + b2 * exp(-1 * b3 * tt)) p <- c(b1 = 1, b2 = 1, b3 = 1) myfn <- model2jacfun(f, p) myres <- model2resfun(f, p) cat("myfn:\n") print(myfn) ans <- myfn(p, tt = tt, y = y) print(ans) Jnum<-jacobian(myres, p, tt = tt, y = y) cat("max(abs(ans-Jnum)) = ",max(abs(ans-Jnum)),"\n") bnew <- c(b1 = 200, b2 = 50, b3 = 0.3) ans <- myfn(prm = bnew, tt = tt, y = y) print(ans) Jnum<-jacobian(myres, bnew, tt = tt, y = y) cat("max(abs(ans-Jnum)) = ",max(abs(ans-Jnum)),"\n") cat("Test with un-named vector\n") # At 20120424 should fail bthree <- c(100, 40, 0.1) ans <- try(myfn(prm = bthree, tt = tt, y = y)) print(ans) Jnum<-jacobian(myres, bthree, tt = tt, y = y) cat("max(abs(ans-Jnum)) = ",max(abs(ans-Jnum)),"\n") ```