2

我正在使用dde23pydelay来求解延迟微分方程。我的问题:如何有条件地编写方程?例如,目标方程有两个选项:

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 产生以下错误:

    找到可执行文件 c:\mingw\bin\g++.exe c:\docume~1\thao\locals~1\temp\thong\python27_compiled\sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp: In function 'double f(double, double)': c:\ docume~1\thao\locals~1\temp\thong\python27_compiled\sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp:734: error: 'x' cannot be used as a function c:\docume~1\thao\locals~1\temp\thong\ python27_compiled\sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp:734: 错误: 'x' 不能用作函数 c:\docume~1\thao\locals~1\temp\thong\python27_compiled\sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp 函数'funcyObjectP: *, PyObject*)': c:\docume~1\thao\locals~1\temp\thong\python27_compiled\sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp:878: 警告:有符号和无符号整数表达式之间的比较 c:\docume~1\thao\locals~1\temp\thong\python27_compiled\sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp:883:警告:有符号和无符号整数表达式之间的比较 c:\docume~1\thao\locals~1\temp\thong\python27_compiled \sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp:774:警告:未使用的变量 'Nhistx_ar' c:\docume~1\thao\locals~1\temp\thong\python27_compiled\sc_f68f7a878bf7b27c6f72c9e771ec4d311.cppist:77_5 警告变量:\documeh' ~1\thao\locals~1\temp\thong\python27_compiled\sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp:776: 警告:未使用的变量 'Dhistx_ar' c:\docume~1\thao\locals~1\temp\thong\python27_compiled\sc_f68f7a878bf7bec4d3112cpp771. :785: 警告: 未使用的变量 'NVhistx_ar' c:\docume~1\thao\locals~1\temp\thong\python27_compiled\sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp:786:警告:未使用的变量 'SVhistx_ar' c:\docume~1\thao\locals~1\temp\thong\python27_compiled\sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp:787:警告:未使用的变量 'DVhistx_ar' c:\docume~1\thao\locals~ 1\temp\thong\python27_compiled\sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp:796: 警告:未使用的变量 'NThist_ar' c:\docume~1\thao\locals~1\temp\thong\python27_compiled\sc_f68f7a878bf7b27c6f72c9e771ec 变量:未使用的变量: 'SThist_ar' c:\docume~1\thao\locals~1\temp\thong\python27_compiled\sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp:798:警告:未使用的变量 'DThist_ar' c:\docume~1\thao\locals~1\temp\ thong\python27_compiled\sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp:817:警告:未使用的变量“Ndiscont”c:\docume~1\thao\locals~1\temp\thong\python27_compiled\sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp:818: 警告:未使用的变量 'Sdiscont' c:\docume~1\thao\locals~1\temp\thong\python27_compiled\sc_f68f7a878bf71ec27df3e677 .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 行,在运行编译器 = 'gcc') 文件“C:\Python27\lib\site-packages\scipy\weave\inline_tools.py”,第 355 行,内联 **kw)文件“C:\Python27\lib\site-packages\scipy\weave\inline_tools.py”,第 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 setup(name = module_name, ext_modules = [ext ],verbose=verb) 文件“C:\Python27\lib\site-packages\numpy\distutils\core.py”,第 186 行,在设置中返回 old_setup(**new_attr) 文件“C:\Python27\lib\distutils \core.py",第 169 行,在 setup raise SystemExit, "error:" + str(msg) distutils.errors.CompileError: error: Command "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\sc_f68f7a878bf7b27c6f72c9e.8 退出状态失败。 s 退出代码 1]

方法 1(使用 if else 语句更新eqns哪个是 python dict):

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']

方法 2(向求解器提供 c 代码):

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']
4

1 回答 1

3

第二种方法只需稍作改动即可工作。延迟变量的值必须作为参数直接传递给函数。

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;
    }
}
"""

尽管这确实可以运行,但请注意,它不能提供非常准确的解决方案。这是由于 处的不连续性x=1。更高级的求解器可以明确地处理这种不连续性(参见例如http://www.radford.edu/~thompson/ffddes/)。

如果您为了方便或只是为了获得概述而想坚持使用 pydelay 求解器,您可以尝试将最大步长设置dtmax得足够小以减少错误。

于 2013-10-18T22:14:58.200 回答