我在使用MATLAB Python引擎时遇到了问题。
我想从Python获取ODE的近似解(类似于MATLAB中的ode45
函数),但问题是ODE近似需要一个我无法从MATLAB Python引擎中创建的ODE函数规范。
从Python调用MATLAB函数(如isprime
)可以正常工作,但似乎没有办法在Python中指定MATLAB函数。
因此,我的问题是; 是否有任何方法可以从Python生成MATLAB函数代码或者从Python指定MATLAB函数?
我在使用MATLAB Python引擎时遇到了问题。
我想从Python获取ODE的近似解(类似于MATLAB中的ode45
函数),但问题是ODE近似需要一个我无法从MATLAB Python引擎中创建的ODE函数规范。
从Python调用MATLAB函数(如isprime
)可以正常工作,但似乎没有办法在Python中指定MATLAB函数。
因此,我的问题是; 是否有任何方法可以从Python生成MATLAB函数代码或者从Python指定MATLAB函数?
解决ODE
y' = 2t
使用时间间隔[0,5]和初始条件y0 = 0。
tspan = [0 5];
y0 = 0;
[t,y] = ode45(@(t,y) 2*t, tspan, y0);
@(t,y) 2*t
返回一个匿名函数的函数句柄。
不幸的是,函数句柄被列为不支持 MATLAB <-> Python 转换的数据类型之一:
不支持的 MATLAB 数据类型 MATLAB 引擎 API for Python 不支持以下 MATLAB 数据类型:
- 分类数组
- 字符数组(M×N)
- 单元数组(M×N)
- 函数句柄
- 稀疏数组
- 结构体数组
- 表格
- MATLAB 值对象(关于句柄和值类的讨论请参见 句柄类和值类的比较)
- 非-MATLAB 对象(例如 Java® 对象)
总之,似乎没有直接的方法来实现它。
潜在的解决方法可能涉及到engine.workspace
和 engine.eval
的某种组合,如 在 Python 中使用 MATLAB 引擎工作区 示例所示。engine.eval
的解决方法(第一个演示):import matlab.engine
import matplotlib.pyplot as plt
e = matlab.engine.start_matlab()
tr, yr = e.eval('ode45(@(t,y) 2*t, [0 5], 0)', nargout=2)
plt.plot(tr, yr)
plt.show()
由于直接传递参数很快就会变得痛苦,因此可以使用engine.workspace
来避免这种情况:
import matlab.engine
import matplotlib.pyplot as plt
e = matlab.engine.start_matlab()
e.workspace['tspan'] = matlab.double([0.0, 5.0])
e.workspace['y0'] = 0.0
tr, yr = e.eval('ode45(@(t,y) 2*t, tspan, y0)', nargout=2)
plt.plot(tr, yr)
plt.show()
scipy.integrate.ode(f).set_integrator('dopri5')
- James K