我正在尝试使用其他方法来求解刚性 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'.
这个话题看起来就像 70 年代制造核弹一样复杂。 两种不同语言的函数句柄并不相同,尝试转换正确格式的类型和数组是一件令人伤脑筋的事情。