我如何使用 ODE45 求解这个由 5 个方程组成的系统(涉及代数方程)?
How may I solve this system of 5 equations using ODE45 (algebraic equations involved)?
我是一个经验丰富的 Matlab 程序员,但我不知道如何解决这个(看似)简单的问题。我有一个包含 5 个方程和 5 个未知数的系统:
我知道如何在 不涉及代数方程 的情况下使用 ode45 求解 ODE。在上面的系统中,V(速度)和C(加速度)都是常数且已知。 C为航天器横向加速度
该问题应按如下方式解决:
- 在 t=0 时,我们知道 Theta(0)、x(0) 和 y(0)。请记住,V 和 C 都是常数且已知。
- 给定 Theta(0) 和 C/V,我们得到 Theta(t1) 积分第四个方程。有了 Theta 的这个新值,我们应该能够计算出新的 Vx(t1) 和 Vy(t1),这将为我们提供 x(t1) 和 y(t2) 的新值。
- 重复
使用 Matlab 的 ODE45 解决问题很重要,因为当我添加风、变化的重力和密度、航天器质量和几何形状(以及惯性等!)时,它最终会变得非常难以解决。所以我会得到一个由几十个方程组成的系统,它们都会耦合在一起。如果我知道如何在 Matlab 中解决这个简单的问题,我将了解如何在未来解决更复杂的问题。
我已经在网上搜索过以寻求帮助,但没有成功。非常感谢您的帮助。
在我看来,你的系统是未定的,因为 y_1 不受你的方程式的约束,但它必须是正数。至于系统的其余部分,它实际上是解耦的。以下是我的做法:
1) 第一个等式意味着 y_1 是正数。考虑到这一点,如果您在第一个等式中替换 y_2 和 y_3,您将获得恒等式 y_1=y_1。所以这个点 y_1 可以是时间的任何函数,只受制于在 t=0 时它满足初始条件的约束。在下文中,我将假设它是时间常数。
2) 有了这个规定,C/y_1 是一个任意常数,我们称它为 B,由此得出 y_4= Bt + y0_4, y0_4是积分常数。
3) 将y_2代入第5个等式,y_3代入第6个等式。现在您有两个具有时间相关 r.h.s 的 ODE。这些方程足够简单,可以解析求解。例如,最后一个等式给出 y_6=-y_1/B cos(Bt+y0_4)+y0_6。
更一般地说,假设您遇到的问题不是欠约束的。然后,您总能及时对代数方程进行微分,得到耦合的 ODE 系统。
作为最后的评论,我想说的是,在急于使用 Matlab(或 Python、R 或 C++,...)之前,用纸来解决问题总是一件好事和pencil看能不能简化,或者像上面的情况一样,能不能解决。
使用更正后的系统,您只有 3 个状态变量需要集成
function dotu = f(t,u)
theta = y(1);
dotu = [ C/V, -V*cos(theta), V*sin(theta) ];
end
然后您可以直接将其插入求解器
[ T,U ] = ode45(f, [t0, tf], [ theta0, x0, y0])
为初始条件和积分结束使用适当的值。
我是一个经验丰富的 Matlab 程序员,但我不知道如何解决这个(看似)简单的问题。我有一个包含 5 个方程和 5 个未知数的系统:
我知道如何在 不涉及代数方程 的情况下使用 ode45 求解 ODE。在上面的系统中,V(速度)和C(加速度)都是常数且已知。 C为航天器横向加速度
该问题应按如下方式解决:
- 在 t=0 时,我们知道 Theta(0)、x(0) 和 y(0)。请记住,V 和 C 都是常数且已知。
- 给定 Theta(0) 和 C/V,我们得到 Theta(t1) 积分第四个方程。有了 Theta 的这个新值,我们应该能够计算出新的 Vx(t1) 和 Vy(t1),这将为我们提供 x(t1) 和 y(t2) 的新值。
- 重复
使用 Matlab 的 ODE45 解决问题很重要,因为当我添加风、变化的重力和密度、航天器质量和几何形状(以及惯性等!)时,它最终会变得非常难以解决。所以我会得到一个由几十个方程组成的系统,它们都会耦合在一起。如果我知道如何在 Matlab 中解决这个简单的问题,我将了解如何在未来解决更复杂的问题。
我已经在网上搜索过以寻求帮助,但没有成功。非常感谢您的帮助。
在我看来,你的系统是未定的,因为 y_1 不受你的方程式的约束,但它必须是正数。至于系统的其余部分,它实际上是解耦的。以下是我的做法:
1) 第一个等式意味着 y_1 是正数。考虑到这一点,如果您在第一个等式中替换 y_2 和 y_3,您将获得恒等式 y_1=y_1。所以这个点 y_1 可以是时间的任何函数,只受制于在 t=0 时它满足初始条件的约束。在下文中,我将假设它是时间常数。
2) 有了这个规定,C/y_1 是一个任意常数,我们称它为 B,由此得出 y_4= Bt + y0_4, y0_4是积分常数。
3) 将y_2代入第5个等式,y_3代入第6个等式。现在您有两个具有时间相关 r.h.s 的 ODE。这些方程足够简单,可以解析求解。例如,最后一个等式给出 y_6=-y_1/B cos(Bt+y0_4)+y0_6。
更一般地说,假设您遇到的问题不是欠约束的。然后,您总能及时对代数方程进行微分,得到耦合的 ODE 系统。
作为最后的评论,我想说的是,在急于使用 Matlab(或 Python、R 或 C++,...)之前,用纸来解决问题总是一件好事和pencil看能不能简化,或者像上面的情况一样,能不能解决。
使用更正后的系统,您只有 3 个状态变量需要集成
function dotu = f(t,u)
theta = y(1);
dotu = [ C/V, -V*cos(theta), V*sin(theta) ];
end
然后您可以直接将其插入求解器
[ T,U ] = ode45(f, [t0, tf], [ theta0, x0, y0])
为初始条件和积分结束使用适当的值。