Python решает дифференциальные уравнения с запаздыванием условно

Я использую пакет 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. Подход 1 не жаловался, но его утверждение if else не было интерпретировано.

  2. Подход 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']

person TTT    schedule 18.10.2013    source источник


Ответы (1)


Хотя это действительно работает, обратите внимание, что это не может дать очень точное решение. Это связано с прерыванием на x=1. Более продвинутые решатели могут явно обрабатывать такие разрывы (см., Например, http://www.radford.edu/~thompson/ffddes/).

eqns = { 'x' : 'f(x, x(t - tau))'}

mycode = """
double f(double x, double x_tau) {
    if (x > 1.0){
        return 0.25 * x_tau / (1.0 + pow(x_tau, 10.0)) -0.1*x;
    }
    else{
        return 0.45 * x;
    }
}
"""

Если вы хотите придерживаться решателя pydelay для удобства или просто для обзора, вы можете попытаться установить максимальный размер шага dtmax достаточно малым, чтобы уменьшить ошибку.

Найден исполняемый файл c: \ mingw \ bin \ g ++. Exe c: \ docume ~ 1 \ thao \ locals ~ 1 \ temp \ thong \ python27_compiled \ sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp: в функции 'double f (double, double)': c: \ docume ~ 1 \ thao \ locals ~ 1 \ temp \ thong \ python27_compiled \ sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp: 734: error: 'x' не может использоваться как функция c: \ docume ~ 1 \ thao \ locals ~ 1 \ temp \ thong python27_compiled \ sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp: 734: error: 'x' не может использоваться как функция c: \ docume ~ 1 \ thao \ locals ~ 1 \ temp \ thong \ python27_python27_compiled \ sc_f68fbucajectc876bf2fc_f68fb7cjjectc8bf2fc_f68fbc8c9c8b2fc_f68fb8c9c8bfc_fc_f68fbc9ec8b2fc_fc_f68fbc8c8c8b2 *, PyObject *) ': c: \ docume ~ 1 \ thao \ locals ~ 1 \ temp \ thong \ python27_compiled \ sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp: 878: предупреждение: сравнение целочисленных выражений со знаком и без знака c: \ docume ~ 1 \ docume ~ 1 \ locals ~ 1 \ temp \ thong \ python27_compiled \ sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp: 883: предупреждение: сравнение целочисленных выражений со знаком и без знака c: \ docume ~ 1 \ thao \ locals ~ 1 \ temp \ thong \ python27_c ompiled \ sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp: 774: предупреждение: неиспользуемая переменная 'Nhistx_ar' c: \ docume ~ 1 \ thao \ locals ~ 1 \ temp \ thong \ python27_compiled \ sc_f68f7aused_876bf72: предупреждение 'c_f68f7aused_876bf72: предупреждение': docume ~ 1 \ thao \ locals ~ 1 \ temp \ thong \ python27_compiled \ sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp: 776: предупреждение: неиспользуемая переменная 'Dhistx_ar' c: \ docume ~ 1 \ thao \ locfcdc ~ 1 \ temp877 \ temp_fong_fong_cf2_cd327_cfcd_cd327_cp_cp_c_fx_327_327_327 cpp: 785: предупреждение: неиспользуемая переменная 'NVhistx_ar' c: \ docume ~ 1 \ thao \ locals ~ 1 \ temp \ thong \ python27_compiled \ sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp: 786: предупреждение: неиспользуемая переменная 'c: \ docume' chistx_ar thao \ locals ~ 1 \ temp \ thong \ python27_compiled \ sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp: 787: предупреждение: неиспользуемая переменная 'DVhistx_ar' c: \ docume ~ 1 \ thao \ locals ~ 1 \ tempfcfc7d7 \ python_fc7c7d8c7c8c8c7c8c8c8c8c7c8c7c8c8c8c7c8c7c8c8c7c8c8c8c8c8c8c8c8c8c8c8c8c7 / p878c8c8c7c8c7958c8c8c8c8c8c8c8c8c7 / python предупреждение: неиспользуемая переменная 'NThist_ar' c: \ docume ~ 1 \ thao \ locals ~ 1 \ temp \ thong \ python27_compiled \ sc_f68f7a878bf7b27c6f72 c9e771ec4d311.cpp: 797: предупреждение: неиспользованная переменная 'SThist_ar' c: \ docume ~ 1 \ thao \ locals ~ 1 \ temp \ thong \ python27_compiled \ sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp: unused_ocume ': переменная doc: 798 1 \ thao \ locals ~ 1 \ temp \ thong \ python27_compiled \ sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp: 817: предупреждение: неиспользуемая переменная 'Ndiscont' c: \ docume ~ 1 \ thao \ locals ~ 1 \ tempfcfc72 \ python_fc8c7c8c8c8c8c8c8c8c8c7c8c8c8c7c8cfc7c8c7c8c8c8c8c7c8c7fc7c8328c7c8c7c8cfc7c8c7c8c7fc7cfc7 / python 818: предупреждение: неиспользуемая переменная 'Sdiscont' c: \ docume ~ 1 \ thao \ locals ~ 1 \ temp \ thong \ python27_compiled \ sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp: 819: предупреждение: последний вызов неиспользованной переменной 'Ddiscont' Traceback «C: \ Documents and Settings \ thao \ Desktop \ mackey-glass.py», строка 33, в файле dde.run () «C: \ Python27 \ lib \ site-packages \ pydelay_dde23.py», строка 1120, в run compiler = 'gcc') Файл "C: \ Python27 \ lib \ site-packages \ scipy \ weave \ inline_tools.py", строка 355, inline ** kw) Файл "C: \ Python27 \ lib \ site-packages \ scipy \ weave \ inline_tools.py ", l ine 482, в compile_function verbose = verbose, ** kw) Файл "C: \ Python27 \ lib \ site-packages \ scipy \ weave \ ext_tools.py", строка 367, в compile verbose = verbose, ** kw) File " C: \ Python27 \ lib \ site-packages \ scipy \ weave \ build_tools.py ", строка 272, в настройке build_extension (name = имя_модуля, ext_modules = [ext], verbose = verb) Файл" C: \ Python27 \ lib \ site-packages \ numpy \ distutils \ core.py ", строка 186, в настройке return old_setup (** new_attr) Файл" C: \ Python27 \ lib \ distutils \ core.py ", строка 169, в настройке поднять SystemExit," ошибка: "+ str (msg) distutils.errors. CompileError: ошибка: команда "g ++ -O2 -Wall -IC: \ Python27 \ lib \ site-packages \ scipy \ weave -IC: \ Python27 \ lib \ site-packages \ scipy \ weave \ scxx -IC: \ Python27 \ lib \ site-packages \ numpy \ core \ include -IC: \ Python27 \ include -IC: \ Python27 \ PC -cc: \ docume ~ 1 \ thao \ locals ~ 1 \ temp \ thong \ python27_compiled \ sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp -oc: \ docume ~ 1 \ thao \ locals ~ 1 \ temp \ thong \ python27_intermediate \ compiler_a77d1132635f0379270bcb96a5e542fc \ Release \ docume ~ 1 \ thao \ locals ~ 1 \ temp \ thong \ python27_compiled \ sc77f68fc7a878b со статусом "не удалось завершить" статус exit1. s с кодом выхода 1]

person vafl    schedule 18.10.2013