Вызов ODE45 Матлаба из питона - PullRequest
1 голос
/ 17 октября 2019

Я хотел бы вызвать функцию Matlab ode45 из python, так же как функция MATLAB isprime () вызывается в следующем коде Python

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: function.

Я уже установил API-интерфейс MATLAB Engine для Python по следующей ссылке 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.

Я нашел следующий поток, который мог бы иметь отношение Имитировать функцию ode45 из MATLAB в Python , но из того, что я вижу, они просто использовали библиотеки python для решения ODE и не вызывали ODE45 в MATLABиз питона. Может быть, я просто не понимаю это правильно.

Может ли кто-нибудь помочь мне добиться прогресса в этом вопросе? Спасибо!

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

Воспроизведение примера из документа :

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')
0 голосов
/ 17 октября 2019

Вы можете использовать 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]]

(пример из официального документа)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...