Я использую пакет dde23
из pydelay
для решения дифференциального уравнения задержки. Мой вопрос: как условно закодировать уравнение? Например, у целевого уравнения есть два варианта:
when x>1, dx/dt=0.25 * x(t-tau) / (1.0 + pow(x(t-tau),10.0)) -0.1*x
otherwise, dx/dt=0.25 * x
Я пробовал два подхода, но похоже, что ни один из них не сработал:
Подход 1 не жаловался, но его утверждение if else не было интерпретировано.
Подход 2 вызвал следующие ошибки:
Подход 1 (используйте оператор if else для обновления
eqns
, который является Python dict):
Подход 2 (укажите код c для решающей программы):
import numpy as np
import pylab as pl
from pydelay import dde23
eqn_1a='0.25 * x(t-tau) / (1.0 + pow(x(t-tau),10.0)) -0.1*x'
eqn_1b='0.45 * x'
eqns = { 'x' : eqn_1a if 'x>1' else eqn_1b}
dde = dde23(eqns=eqns, params={'tau': 15})
dde.set_sim_params(tfinal=1000, dtmax=1.0, AbsTol=10**-6, RelTol=10**-3)
histfunc = {'x': lambda t: 0.5 }
dde.hist_from_funcs(histfunc, 51)
dde.run()
sol1 = dde.sample(2, 3, 0.1)
x1 = sol1['x']
Второй подход работает с одним незначительным изменением. Значение переменной с задержкой должно быть передано как аргумент функции напрямую.
eqns = { 'x' : 'f(x, tau)'}
# We can define a c function to be used in the equations
mycode = """
double f(double x, double tau) {
if (x>1){
return (0.25 * x(t-tau) / (1.0 + pow(x(t-tau),10.0)) -0.1*x);
}
else{
return (0.45 * x);
}
}
"""
dde = dde23(eqns=eqns, params={'tau': 15}, supportcode=mycode)
dde.set_sim_params(tfinal=1000, dtmax=1.0, AbsTol=10**-6, RelTol=10**-3)
histfunc = {'x': lambda t: 0.5 }
dde.hist_from_funcs(histfunc, 51)
dde.run()
sol1 = dde.sample(1, 300, 1)
x1 = sol1['x']