从python生成MATLAB代码
使用MATLAB python engine时出现问题。从python生成MATLAB代码
我想近似解决微分方程(使用类似MATLAB中的ode45
功能)从Python,但问题是,ODE近似需要ODE功能规范,我似乎无法从MATLAB的Python引擎创建。
它可以很好地调用Python的MATLAB函数,比如isprime
,但似乎没有办法在Python中指定MATLAB函数。
因此,我的问题是; 有没有从Python生成MATLAB函数代码的方法,或者是从Python中指定MATLAB函数的方法?
odefun
passed to ode45
, according to docs, has to be a function handle。
解决ODE
Y” =2吨
使用的[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用于Python支持:
- 范畴阵列
- char数组(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()
使用SciPy的可能性? 'scipy.integrate.ode(f).set_integrator('dopri5')' –
@JamesK它必须是MATLAB,因为我想给用户一个解算器/库的选择。 – Ezbob