我试图为一个巨大的身体周围质量可忽略的物体建模基本万有引力。我已经按照ODE套件文档中提供的示例进行了操作,但我得到的结果显然很荒谬。
这是我用ode45
打电话的功能:
function dy = rigid(t,y)
dy = zeros(4,1);
%Position
xx=y(1);
yy=y(2);
%Radius
r=(xx.^2+yy.^2).^0.5;
%Constants
M=10^30;
G=6.67*10^-11;
%dX/dt
dy(1)=y(3); %vx
dy(3)=-M.*G.*xx.*r.^-3; %ax
%dY/dt
dy(2)=y(4); %vy
dy(4)=-M.*G.*yy.*r.^-3; %ay
以下是求解器行:
%Init
x_0=1;
y_0=1;
vx_0=0;
vy_0=5;
%ODEs
[T,Y] = ode45(@rigid,[0 1000],[x_0 y_0 vx_0 vy_0]);
%Vectors
x=Y(:,1);
y=Y(:,2);
%Plot
plot(x,y)
xlabel('x');
ylabel('y');
title('y=f(x)');
我最后得到一个线性图。即使具有初始速度,位置也不会在几个步骤的时间段内发生变化。我唯一能想到的是,我误解了建立我的ODE系统的方法。
我现在已经思考了一段时间了,而且我在网上做过一些搜索的想法非常缺乏。
答案 0 :(得分:2)
总结:将哈密顿系统与普通数值积分器相结合存在问题,并且您的特殊初始条件会加剧这一点,使得数值解与正确的数值解无相似。
您的实施本身没有任何问题。但是,您使用的初始条件并不是最好的。你使用的常数G和M是SI单位,这意味着坐标是m,速度是m / s,时间是s。这些行
x_0=1;
y_0=1;
vx_0=0;
vy_0=5;
[T,Y] = ode45(@rigid,[0 1000],[x_0 y_0 vx_0 vy_0]);
因此意味着您要求的是一个半径约为1.4米,轨道速度为5米/秒的轨道,并且您希望这个轨道持续17分钟。想象一下,实际上有一个距离大约10 ^ 30公斤的物体!
所以,让我们尝试一些更现实的东西,类似于Earths' orbit,并在1年内查看:
x_0=149.513e9;
y_0=0;
vx_0=0;
vy_0=29.78e3;
[T,Y] = ode45(@rigid,[0 31.536e6],[x_0 y_0 vx_0 vy_0]);
结果是
看起来像预期的那样。
但这里有第二个问题。让我们看一下10年期间的这个轨道([0 315.36e6]
):
现在我们不再获得一个封闭的轨道,而是螺旋式的!那是因为数值积分以有限的精度进行,并且对于这组方程,这导致(物理上讲)到loss of energy。使用ode45
的参数可以提高精度,但最终问题仍然存在。
现在让我们回到原始参数并查看结果:
这条“轨道”是朝向原点(太阳)的直线。这可能没问题,因为直线振荡是椭圆轨道的一种特殊情况。但随着时间的推移看坐标:
我们看到没有振荡。 “星球”落入太阳并停留在那里。这里发生的事情与大轨道的影响相同:不精确的整合会导致能量损失。此外,数值积分陷入困境:我们要求的时间为1000秒,但积分不会超过1.6e-10秒。
据我所知,ode45
和任何其他标准Matlab集成商都不足以解决这个问题。有一些特殊的数值积分算法,专门用于汉密尔顿系统,称为symplectic integrators。有file exchange entry提供不同的实现。另请参阅this question and answers以获取更多指示。