在 MatLab API 中使用 python 库 Scipy 求解 Matlab ODE 方程

问题描述 投票:0回答:1

我正在尝试使用其他方法来求解刚性 ODE 系统,而不是使用 Rosenbrock 作为 Matlab 中的 ode23。我想将 scipy 库与各种方法一起使用,例如 LSODA 或 Sundials。

Matlab ODE 复函数定义为;

function [dpdt]=damper_rebo(t,P,amp,freq,pars)
.....

带有放大器、频率常数和参数单元格以及常数参数。 它可以很好地配合;

tic
[tsol,ysol]=ode23s(@(t,P) damper_rebo(t,P,amp,freq,pars),[0 0.5/freq],P_0,options);
toc

我正在尝试与使用 LSODA 和 BDF 等刚性方程求解 ODE 的其他方法进行比较。 我加载了python环境并安装了所有路径要求,然后我尝试了这个:

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));

第一个

pyfun
选项会带来错误
Python Error: TypeError: 'str' object is not callable
第二个选项也会带来错误
Unable to resolve the name 'py.function_handle'.

  1. 如何将 Matlab ODE 函数传递给可调用的 python 函数?
  2. 如何以Python方式传递额外的参数?
python matlab scipy matlab-engine
1个回答
0
投票

这个话题看起来就像 70 年代制造核弹一样复杂。 两种不同语言的函数句柄并不相同,尝试转换正确格式的类型和数组是一件令人伤脑筋的事情。

© www.soinside.com 2019 - 2024. All rights reserved.