2016-09-18 135 views
3

使用MATLAB python engine时出现问题。从python生成MATLAB代码

我想近似解决微分方程(使用类似MATLAB中的ode45功能)从Python,但问题是,ODE近似需要ODE功能规范,我似乎无法从MATLAB的Python引擎创建。

它可以很好地调用Python的MATLAB函数,比如isprime,但似乎没有办法在Python中指定MATLAB函数。

因此,我的问题是; 有没有从Python生成MATLAB函数代码的方法,或者是从Python中指定MATLAB函数的方法?

+0

使用SciPy的可能性? 'scipy.integrate.ode(f).set_integrator('dopri5')' –

+0

@JamesK它必须是MATLAB,因为我想给用户一个解算器/库的选择。 – Ezbob

回答

1

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.workspaceengine.eval的某种组合,如Use MATLAB Engine Workspace in Python示例中所示。

engine.evalfirst 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在那里评估它。返回的是纯数字数组。之后,您可以对结果向量进行操作,例如,绘制它们。

Matplotlib result

由于传递参数作为文字会很快变得疼痛,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()