Effacer les filtres
Effacer les filtres

Matlab ODE function solving using Python Scipy library.

39 vues (au cours des 30 derniers jours)
Simon Mwakitabu
Simon Mwakitabu le 13 Fév 2024
Commenté : Simon Mwakitabu le 22 Avr 2024
I would like to solve a system of stiff ODE equations from Matlab with other methods from the scipy library such as LSODA or Sundials rather than Rosenbrock (ode23s).
A matlab ODE complex function defined as;
function [dpdt]=damper_rebo(t,P,amp,freq,pars)
.....
with amp, frequency constants and pars a cell of parameters with constants parameters.
It works fine with;
tic
[tsol,ysol]=ode23s(@(t,P) damper_rebo(t,P,amp,freq,pars),[0 0.5/freq],P_0,options);
toc
I am trying to compare with other methods to solve ODE with stiff equations like LSODA and BDF.
I loaded the python environment and installed all the path requirements, then I tried this:
py.importlib.import_module("scipy")
%--Call out the constant parameters from the function--%%
pars=params7();
pyrun("from scipy.integrate import LSODA")
%-----------------------------------------%
%---Excitation Signal Properties of the Damper---%
amp=25.25e-3; % Modal excitational amplitudes (m)
v_n=0.151;
freq=v_n/2/pi/amp; % Modal frequency (Hz)
%-------------------------------------%
%--Initial Pressure conditions--%
Pg_0=pars{68};
P_0=[0.01,0.001,1e5,2e5,Pg_0]; % At equilibrium three chambers at the same pressure
%-------------------------------%
% %-------------------------------%
%--Atmospheric Surrounding Temp and Pressure--%
T_atm=15; % Fluid Initial Properties by the supplier
p_atm=101325;
%---------------------------------------------%
Tspan = py.list([0.0, 0.5/freq]);
pyfun = py.str('lambda t,P: damper_rebo(t,P,amp,freq,pars)');
or
pyfun = py.function_handle(@(t,P) damper_rebo(t,P,amp,freq,pars));
sol=py.scipy.integrate.solve_ivp(pyfun,Tspan, py.numpy.array(P_0),pyargs(method="BDF", rtol=0.00001, atol=1e-06));
The first `pyfun`option brings an error that `
Python Error: TypeError: 'str' object is not callable`
The second option brings an error too with
`Unable to resolve the name 'py.function_handle'.`
1. How can I pass the Matlab ODE function to a callable python function?
2. How can I pass the extra arguments in a python manner?

Réponses (2)

Tejas
Tejas le 5 Avr 2024
Modifié(e) : Tejas le 5 Avr 2024
Hello Simon,
It appears from the code shared above, that you are attempting to pass a MATLAB function handle as an input argument to a Python function, which has led to the two issues mentioned.
In the first issue, ‘py.str’ converts the function call into a string, which subsequently renders it uncallable from any function. The second issue arises due to an attempt to pass a MATLAB function handle as an input argument to a Python function, a process for which there currently isn't a direct method. For further understanding of what is supported and what isn't when interacting with Python from MATLAB, please refer to the following documentation: https://www.mathworks.com/help/releases/R2022b/matlab/matlab_external/passing-data-to-python.html .
This documentation also includes details on how MATLAB variables are interpreted as Python variables, offering guidance on how to pass input arguments when calling a Python function from MATLAB.
To address the above two issues, I suggest the following workaround:
  • Create a Python function that calls the ‘damper_rebo’ function using the MATLAB Engine API.
  • Pass this Python function as an input argument to the ‘solve_ivp’ function.
For more information on how to use the MATLAB Engine API, please consult the following two pieces of documentation:
Hope it helps!
  1 commentaire
Simon Mwakitabu
Simon Mwakitabu le 14 Avr 2024
I had couple of conversations with the Mathworks team, we tried to get a solution. Function handling is not an easy task by the way.

Connectez-vous pour commenter.


Mike Croucher
Mike Croucher le 17 Avr 2024
  1 commentaire
Simon Mwakitabu
Simon Mwakitabu le 22 Avr 2024
I am using MAtlab R2023B version. It seems to not have the solver installed. I would wait for my licence to be updated for the R2024 to synchronise.

Connectez-vous pour commenter.

Catégories

En savoir plus sur Call Python from MATLAB dans Help Center et File Exchange

Produits


Version

R2022b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by