[R-sig-dyn-mod] deSolve with compiled code and varying size of parms

Tim Keitt tkeitt at utexas.edu
Thu Mar 30 16:35:03 CEST 2017


On Thu, Mar 30, 2017 at 1:36 AM, Thomas Petzoldt <
thomas.petzoldt at tu-dresden.de> wrote:

> Besides this intrinsically fixed match between the C and R vector, there
> are several methods that can make parameter passing more flexible, i.e.
> using C vectors directly instead of #define macros, or employ UNIONs
> between numbered vector arguments and named arguments.


Had not thought of a UNION type. For odeintr, I just compile in some
globals:

library(odeintr)
> Lorenz.sys = '
>   dxdt[0] = a * (x[1] - x[0]);
> dxdt[1] = b * x[0] - x[1] - x[0] * x[2];
> dxdt[2] = c * x[2] + x[0] * x[1];
> ' # Lorenz.sys
> compile_sys("lorenz", Lorenz.sys, c(a = 10, b = 28, c = -8/3)) # named
> pars with defaults
> x = lorenz(rep(1, 3), 100, 0.001)
> par(mfrow = c(1, 2))
> scatterplot3d::scatterplot3d(x[,-1], type = "l")
> lorenz_set_params(b = 40)                                # change pars by
> name
> x = lorenz(rep(1, 3), 100, 0.001)
> scatterplot3d::scatterplot3d(x[,-1], type = "l")


Using a struct with named state variables (x.predator, x.prey)  is possible
too with a bit of extra C++ coding.

THK

http://www.keittlab.org/

	[[alternative HTML version deleted]]



More information about the R-sig-dynamic-models mailing list