[R-sig-dyn-mod] How to solve ODEs with an internal threshold?
Thomas Petzoldt
Thomas.Petzoldt at TU-Dresden.de
Wed Oct 31 19:39:57 CET 2012
Hi Lilith,
your script does exactly what is expected from an ODE system, i.e. the
new state depends on the *past* state and the derivatives. You cannot
set a new state directly to a fixed value in a "pure" ODE system.
Fortunately, package deSolve has a solution for your problem, called
"root finding" in combination with "events" -- see example 3 on the
?events help page.
Hope it helps
Thomas Petzoldt
PS: The list address is r-sig-dynamic-models at r-project.org i.e. without
"-owner". AN email to "-owners" is only sent to the list moderators.
On 10/31/2012 6:31 PM, Lilith wrote:
> Hi There! I have tried to find the solution to this problem for a long
> time and hope you can help.
>
> I have the following function containing some odes:
>
>
> |myfunction<- function(t, state, parameters) {
> with(as.list(c(state, parameters)),{
> if (X>20) { # this is an internal threshold!
> Y<- 35000
> dY<- 0
> }else{
> dY<- b* (Y-Z)
> }
> dX<- a*X^6 + Y*Z
> dZ<- -X*Y+ c*Y- Z
> # return the rate of change
> list(c(dX, dY, dZ),Y,dY)
> })
> }|
>
> Here are some results:
>
> |library(deSolve)
> parameters<- c(a= -8/3, b= -10, c= 28)
> state<- c(X= 1, Y= 1, Z= 1)
> times<- seq(0, 10, by = 0.1)
> out <- ode(y= state, times= times, func= myfunction, parms= parameters)
> out
> time X Y Z Y dY
> 1 0.0 1.000000 1.000000 1.000000 1.000000 0.00000
> 2 0.1 1.104670 2.132728 4.470145 2.132728 23.37417
> 3 0.2 1.783117 6.598806 14.086158 6.598806 74.87351
> 4 0.3 2.620428 20.325966 42.957134 20.325966 226.31169
> 5 0.4 3.775597 60.969424 126.920014 60.969424 659.50590
> 6 0.5 5.358823 176.094907 358.726482 176.094907 1826.31575
> 7 0.6 7.460841 482.506706 953.270570 482.506706 4707.63864
> 8 0.7 10.122371 1230.831764 2330.599161 1230.831764 10997.67398
> 9 0.8 13.279052 2859.284114 5113.458479 2859.284114 22541.74365
> 10 0.9 16.711405 5912.675147 9823.406760 5912.675147 39107.31613
> 11 1.0 24.452867 10590.600567 16288.435139 35000.000000 0.00000
> 12 1.1 25.988924 10590.600567 23476.343542 35000.000000 0.00000
> 13 1.2 26.572411 10590.600567 26821.703961 35000.000000 0.00000
> 14 1.3 26.844240 10590.600567 28510.668725 35000.000000 0.00000
> 15 1.4 26.980647 10590.600567 29391.032472 35000.000000 0.00000
>
>
> ...
> |
>
> States Y (columns 3 and 5) should be the same, instead when the
> threshold is active they become different. Is there a way to "force"
> Y(column 3) to change according to the set threshold?
>
> Many thanks for your help!
>
>
--
Dr. Thomas Petzoldt
Technische Universitaet Dresden
Faculty of Environmental Sciences
Institute of Hydrobiology
01062 Dresden, Germany
E-Mail: thomas.petzoldt at tu-dresden.de
http://tu-dresden.de/Members/thomas.petzoldt
More information about the R-sig-dynamic-models
mailing list