我想从python调用Matlab的ode45函数,就像在下面的python代码中调用MATLAB的isprime()函数一样
import matlab.engine
eng = matlab.engine.start_matlab()
tf = eng.isprime(37)
print(tf)
但是我真的不知道如何在python中实现代码。 我已经尝试过
import matlab.engine
def dydt(t,y):
dydt= 2*y
return dydt
eng = matlab.engine.start_matlab()
T,Y=eng.ode45(dydt,[0, 20],[2, 0])
它返回:
第73行,在致电中 out = _stdout,err = _stderr)
TypeError:不支持的Python数据类型:函数。
我已经根据以下链接安装了适用于Python的MATLAB Engine API https://www.mathworks.com/help/matlab/matlab_external/install-the-matlab-engine-for-python.html,并使用以下链接中的示例对其进行了成功的测试 https://www.mathworks.com/help/matlab/matlab_external/call-matlab-functions-from-python.html。
我发现以下可能相关的线程 Imitate ode45 function from MATLAB in Python 但是从我看来,他们只是使用python的库来解决ODE,而没有从python调用MATLAB的ODE45。也许我只是无法正确理解。
有人可以帮助我在该问题上取得进展吗? 谢谢!
答案 0 :(得分:0)
您可能正在使用scipy.integrate.RK45()
,或者最好使用scipy.integrate.solve_ivp()
:
from scipy.integrate import solve_ivp
def exponential_decay(t, y): return -0.5 * y
sol = solve_ivp(exponential_decay, [0, 10], [2, 4, 8])
print(sol.t)
# [ 0. 0.11487653 1.26364188 3.06061781 4.85759374
# 6.65456967 8.4515456 10. ]
print(sol.y)
# [[2. 1.88836035 1.06327177 0.43319312 0.17648948 0.0719045
# 0.02929499 0.01350938]
# [4. 3.7767207 2.12654355 0.86638624 0.35297895 0.143809
# 0.05858998 0.02701876]
# [8. 7.5534414 4.25308709 1.73277247 0.7059579 0.287618
# 0.11717996 0.05403753]]
(来自官方文档的示例)
答案 1 :(得分:0)
从doc复制示例:
import matlab.engine
eng = matlab.engine.start_matlab()
eng.eval('tspan = [0 5];',nargout = 0)
eng.eval('y0 = 0;',nargout = 0)
t,y=eng.eval('ode45(@(t,y) 2*t, tspan, y0)',nargout = 2)
现在您也可以绘制结果了:
eng.plot(t,y,'-o')