2016-09-18 30 views
3

У меня проблема при использовании MATLAB python engine.Создать код MATLAB от python

Я хочу получить аппроксимированные решения для ODE (используя что-то вроде функции ode45 в MATLAB) из Python, но проблема в том, что для приближения ODE требуется спецификация функции ODE, которую я не могу создать из MATLAB Python ,

Он отлично работает, вызывая функции MATLAB, такие как isprime, из Python, но, похоже, нет способа указать функцию MATLAB в Python.

Мой вопрос поэтому; Есть ли способ генерировать код функции MATLAB из Python или это способ указать функции MATLAB из Python?

+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.

Решить оду

у»= 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 ее оценивать.Возвращаются чистые числовые массивы. После этого вы можете работать с векторами результатов, например. заговорить их.

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() 
Смежные вопросы