Ode 在 python 中求解,每个方程有 2 个二阶导数项

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

大家

我一直在使用一个简单的 2 自由度气动弹性模型,使用以下 ODE 系统:

mh'' + Salpha'' + k_hh = L(t) Sh'' + Ialpha'' + k_alphaalpha = M(t)

with ' 表示关于时间 t 和位移 h 的导数,角度 alpha 是变量。

我习惯于在 matlab 中工作,在其中我可以根据 h 和 alpha 的二阶导数来定义函数,例如在下面的代码中:

function dYdt = ode(t, y, m, I, S, k_h, k_alpha, L, M)

   % h = y(1);
   % derivative of h = y(2);
   % second derivative of h = dYdt(2);
   % alpha = y(3);
   % derivative of alpha = y(4);
   % second derivative of alpha = dYdt(4);

   dYdt(1) = y(2);
   dYdt(2) = (L - k_h*y(1) - S*dYdt(4))/m;
   dYdt(3) = y(4);
   dYdt(4) = (M - k_alpha*y(3) - S*dYdt(2))/I;

end

因此,我只是将 dYdt(2) 定义为 dYdt(4) 的函数,反之亦然。

最近,我一直在尝试更熟悉 python 并尝试测试像这样的旧 matlab 代码,但我在使用二阶导数时遇到了一些麻烦。我在下面完成了这个 python 函数,其逻辑与我在 matlab 中所做的相同:

def ode(t, y, m, I, S, k_h, k_alpha, L, M):
   # h = h
   # derivative of h = hd
   # second derivative of h = hdd
   # alpha = alpha
   # derivative of alpha = alphad
   # second derivative of alpha = alphadd

   h, hd, alpha, alphad = y
   
   hdd = (L - k_h*h - S*alphadd)/m
   alphadd = (M - k_alpha*alpha - S*hdd)/I

   return [hd, hdd, alphad, alphadd]

使用这段代码,我最终得到以下错误消息:“UnboundLocalError:赋值前引用的局部变量‘alphadd’”。

我知道问题是,一旦每个方程都依赖于另一个方程的二阶导数,就可以声明这样的系统是一种“循环”,但这是我以前在 matlab 中所做的并且曾经工作得很好。

有人可以帮助我吗?

我试图在 hdd 方程中插入 alphadd 的表达式,反之亦然,但到目前为止没有成功。不幸的是,到目前为止我还没有在互联网上找到任何类似的东西。

python matlab ode
© www.soinside.com 2019 - 2024. All rights reserved.