用Python生成MATLAB代码

3

我在使用MATLAB Python引擎时遇到了问题。

我想从Python获取ODE的近似解(类似于MATLAB中的ode45函数),但问题是ODE近似需要一个我无法从MATLAB Python引擎中创建的ODE函数规范。

从Python调用MATLAB函数(如isprime)可以正常工作,但似乎没有办法在Python中指定MATLAB函数。

因此,我的问题是; 是否有任何方法可以从Python生成MATLAB函数代码或者从Python指定MATLAB函数?


使用scipy是可能的吗?scipy.integrate.ode(f).set_integrator('dopri5') - James K
@JamesK 必须使用MATLAB,因为我想给用户选择求解器/库的选择。 - Ezbob
1个回答

1

odefun传递给ode45,根据文档,必须是函数句柄

解决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.workspaceengine.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在那里进行评估。返回的是纯数值数组。之后,您可以对结果向量进行操作,例如绘图。

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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接