odefun
passed to ode45
, according to docs, has to be a function handle.
Решить оду
у»= 2t
использовать временный интервал [0,5] и начальное условие у0 = 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 Engine API для Python:
- Категорического массив
- массива символов (M -by-N)
- Ячейка клеток (M-by-N)
- Функция ручка
- разреженный массив
- Структура массива
- Таблица
объекты
- значение MATLAB (для обсуждения ручки и стоимостных классов см Сравнение ручки и стоимость классов)
- объекты Non-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