使用MATLAB python engine时出现问题。
我想从Python获得ODE的近似解决方案(使用类似MATLAB中的ode45
函数),但问题是ODE近似需要ODE函数规范,我似乎无法从中创建MATLAB Python引擎。
从Python调用MATLAB函数(例如isprime
)可以正常工作,但似乎无法在Python中指定MATLAB函数。
因此我的问题是; 有没有办法从Python生成MATLAB函数代码,还是从Python中指定MATLAB函数的方法?
答案 0 :(得分:1)
odefun
passed to ode45
, according to docs, has to be a function handle
解决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
返回匿名函数的函数句柄。
不幸的是,function handles are listed as one of datatypes unsupported in MATLAB <-> Python conversion:
不支持的MATLAB类型MATLAB Engine API for Python不支持以下MATLAB数据类型:
- 分类数组
- char array(M-by-N)
- 细胞阵列(M-by-N)
- 功能句柄
- 稀疏数组
- 结构数组
- 表
- MATLAB值对象(有关句柄和值类的讨论,请参阅句柄和值类的比较)
- 非MATLAB对象(例如Java®对象)
总而言之,似乎没有直接的方法。
潜在的解决方法可能涉及engine.workspace
和engine.eval
的某种组合,如Use MATLAB Engine Workspace in Python示例所示。
与engine.eval
(first demo)的解决方法:
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()
通过这样做,您可以避免通过MATLAB / Python屏障传递函数句柄。您传递字符串(字节)并允许MATLAB在那里评估它。返回的是纯数字数组。之后,您可以对结果向量进行操作,例如绘制它们。
由于将参数作为文字传递很快就会变得很痛苦,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()