我在使用MATLAB python引擎时遇到了问题。
我希望从Python中获得ODEs的近似解(使用类似于MATLAB中的ode45函数),但问题是,ODE近似需要一个我似乎无法从MATLAB创建的ODE函数规范。
它可以很好地从Python调用MATLAB函数,比如isprime,但是似乎没有办法在Python中指定MATLAB函数。
因此,我的问题是:是否有任何方法从Python生成MATLAB函数代码,还是从Python中指定MATLAB函数?
发布于 2016-09-18 15:39:40
解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数据类型不受MATLAB引擎API for Python:的支持
总之,似乎没有直接的方法可以做到这一点。
潜在的解决方法可能涉及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()通过这样做,可以避免通过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()https://stackoverflow.com/questions/39556602
复制相似问题