最近在使用 MATLAB 时,我遇到了一些我无法解释的奇怪问题。我正在使用 ode45 求解器来求解两个耦合二阶 ODE 的系统。我不相信结果,所以我尝试了一些更简单的方法,只是想看看哪里出了问题。我将方程解耦,并将其中一个交换为一个简单的谐振子。
令人惊讶的是,我没有得到我所期望的。然而,当我从第二个等式中删除其中一个项(现在已解耦!)并再次运行它时,它产生了一个正确的答案。这让我大吃一惊,因为现在这两个方程之间根本没有联系。这是我修改后的代码:
主功能:
function Ord2ODE
t=0:0.0001:20;
%x,xdot,y,ydot
ainit = [0; 1; 0; 0];
[t,a] = ode45(@rhs,t,ainit);
figure;
plot(t, a(:,1));
end
和函数rhs:
function dadt = rhs(t,a)
mu = 0;
x = a(1);
xdot = a(2);
y = a(3);
ydot = a(4);
**Fy = stuff in terms of x, y (a(1), a(2))**
Fx = stuff in terms of x, y (a(1), a(2))
dadt1 = a(2);
dadt2 = -2*a(1);
dadt3 = a(4);
dadt4 = -2*a(3) - **Fy**;
dadt = [dadt1;dadt2;dadt3;dadt4];
end
带有 ** ** 标记的问题位(dadd4 计算中的定义和出现)。您可以看到在 x 的计算中既不存在 a(3) 也不存在 a(4)。带有和不带有该术语的结果发布在下面。有谁知道为什么解耦方程中的一个项会在另一个方程的解中导致这种发散?
Fy = -mu*y - (1-mu)*y + mu*y/(sqrt(((x+1-mu)^2 + y^2)^3)) + (1-mu)*y/(sqrt(((x-mu)^2 + y^2)^3));
Fx = -mu*(x+1-mu) - (1-mu)*(x-mu) + mu*(x+1-mu)/(sqrt(((x+1-mu)^2 + y^2)^3)) + (1-mu)*(x-mu)/(sqrt(((x-mu)^2 + y^2)^3));

