odefun
passed to ode45
, according to docs, has to be a function handle.
Löse das ODE
y‘= 2t
Verwenden ein Zeitintervall von [0,5], und die Anfangsbedingung y0 = 0.
tspan = [0 5];
y0 = 0;
[t,y] = ode45(@(t,y) 2*t, tspan, y0);
@(t,y) 2*t
kehrt ein Funktionshandle zur anonymen Funktion.
Leider function handles are listed as one of datatypes unsupported in MATLAB <-> Python conversion:
Nicht unterstützte MATLAB Typen Die folgenden MATLAB Datentypen werden nicht durch die MATLAB Engine API für Python unterstützt:
- Categorical Array
- char array (M -von-N)
- Zellenanordnung (M-mal-N)
- Funktionsgriff
- Sparse-Array
- Struktur Array
- Tabelle
- MATLAB Wertobjekte (für eine Diskussion von Griff und Wertklassen Vergleich Griff und Wertklassen sehen)
- Nicht MATLAB-Objekte (wie Java® Objekte)
zusammenzufassen, um, wie es scheint, gibt es keine einfache Möglichkeit, zu tun ist, es.
Mögliche Abhilfe kann eine Kombination von engine.workspace
und engine.eval
, wie in Use MATLAB Engine Workspace in Python Beispiel gezeigt.
Behelfslösung mit 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()
Auf diese Weise vermeiden Sie vorbei Funktionsgriff über MATLAB/Python-Schranke. Sie übergeben die Zeichenfolge (Bytes) und erlauben MATLAB, sie dort auszuwerten.Was zurückgegeben wird, sind reine numerische Arrays. Danach können Sie mit Ergebnisvektoren arbeiten, z. plotte sie.
Da Argumente als Literale vorbei schnell Schmerzen wurden würde, kann engine.workspace
es zu vermeiden, verwendet werden:
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()
ist eine Möglichkeit, mit scipy? 'scipy.integrate.ode (f) .set_integrator ('dopri5')' –
@JamesK Es muss MATLAB sein, da ich dem Benutzer eine Auswahl von Solvern/Bibliotheken geben möchte. – Ezbob