使用数值问题N体问题

2视图(30天)
你好,
我工作与N = 4 N体问题质量10 ^ 10公斤的卫星围绕地球在3000年代。
他们最初的职位X1 = [100;0;0];X2 = [0;100;0];X3 = [-100;0;0);X4 = [0;-100;0); in meters
和他们的初始速度V1 = [0;0.1;0);V2 = (-0.1;0;0);V3 = [0;-0.1;0);V4 = (0.1; 0; 0]. in meters per second
我用数值来解决这个问题。为此我使用X向量定义为:
X = (x1 x1dot y1 y1dot z1 z1dot……xN xNdot yN yNdot锌zNdot), x, y, z是每个卫星的坐标。
下面我把我的代码。
关闭所有
清晰的所有
clc
%的卫星数量
N = 4;
%初始条件
% X格式是[X y dx, dy]在m和m / s
X0 = 0 (N * 6, 1);
X0 (1:6, 1) = (0.1 100 0 0 0 0);
(7:12 X0 1) = (0 100 - -0.1 0 0 0);
X0(聪明,1)= (-0.1 -100 0 0 0 0);
(19:24 X0 1) = (0 -100 - 0.1 0 0 0);
%在3000年代传播
tspan = linspace (0、3000、3000);% [s]
%的变化对积分器的容忍度
托尔= 1的军医;
选择= odeset (“RelTol”,tol);
%使用RK4方法解决方程数值
(t, x) =数值(@ (t, x) ODE_multiple (t, x, N), tspan, X0,选项);
和ODE_multiple函数的导数计算X向量编码:
%表示方程函数
% X向量= (X y xdot ydot z zdot) * #的
函数dXdt = ODE_multiple (t, X, N)
G = 6.674 * 10 ^ (-11);% [m ^ 3 /(千克²))
我= 5.9722 * 10 ^ 24;%(公斤)
质量= 10 ^ 10;%(公斤)
dXdt = 0(长度(X), 1);
i = 1: N
r = [X(1 + 6 *(张))X(3 + 6 *(张))X(5 + 6 *(张)));
n =规范(r);
ddr =我/ n ^ 3;
j = 1: N
如果j ~ =我
rj = [X (1 + 6 * (j - 1)) X (3 + 6 * (j - 1)) X (5 + 6 * (j - 1)));
国际扶轮= [X(1 + 6 *(张))X(3 + 6 *(张))X(5 + 6 *(张)));
rij = rj - ri;
nij =规范(它们);
ddr = ddr +质量/ nij ^ 3;
结束
结束
ddr = ddr * G;
%,xdot ydot和zdot卫星
张dXdt (1 + 6 * () = X(2 + 6 *(张));
张dXdt (3 + 6 * () = X(4 + 6 *(张));
dXdt(5 + 6 *(张))= X(6 + 6 *(张));
% x, y和z为每个卫星
张dXdt (2 + 6 * () = ddr * X(1 + 6 *(张));
张dXdt (4 + 6 * () = ddr * X(3 + 6 *(张));
张dXdt (6 + 6 * () = ddr * X(5 + 6 *(张));
结束
结束
数值的x是一个矩阵,每个位置和速度作为colomns演变通过时间(行)。变量x,我看到在我的深灰色列(见下图),我的速度并不是进化,是错误的,我不明白为什么。
这个问题你能帮我吗?
提前谢谢你

接受的答案

阿历克斯杜马斯
阿历克斯杜马斯 2022年9月7日
你好,非常感谢你的答案!
我最终发现我的代码是错误的感谢:
  • 第一个地球不是考虑也许身体大所以m = 10 ^ 10公斤很好但我不得不起飞与地球在我歌唱的交互功能
  • 二当我计算方程计算accelarations我一切乘以ri而不是每一项代表身体j乘以向量它们,所以它没有工作
最后问题是看看N身体开始他们的运动之间的相互作用相互接近,然后彼此interracted。谢谢你的帮助!

更多的答案(2)

史蒂文的主
史蒂文的主 2022年9月7日
你一定在这些卫星质量?看着 维基百科 吉萨大金字塔的质量是6 e9公斤。这些卫星小小行星大小的两倍大金字塔?或者你用错单位了吗?e10克将1 e7公斤,约5航天飞机或1/5《泰坦尼克号》。
他们可能有一个 很多 惯性,所以加速 非常 l s l o w y。
检查这个尝试使用一个时间变量格式显示数据。如果你有这个变量开放在变量编辑器中,单击视图选项卡在将来发布和变更显示格式。我的猜测是,这些大块的岩石和/或金属移动,但不会很快。

詹姆斯Tursa
詹姆斯Tursa 2022年9月7日
编辑:詹姆斯Tursa 2022年9月7日
你需要重新考虑问题陈述和初始条件。最初的职位不可能在附近100米因为这几乎是在地球的中心。在附近和初始速度为0.1米/秒也不合理,因为这会有效地生产出近直线运动与一切下降几乎垂直向下。这些应该是“相对”位置和速度一些参考圆轨道高度呢?
也不知道为什么你正在运行一个N体问题首先不是N单独2-Body问题。你想模拟弱引力相互作用的影响4小身体轨道时关闭组高于地球更大?或者…?
你列表的质量每个小身体10 ^ 10公斤,但如果我做了我的计算正确的球形岩石的质量会有一个半径约98米。这意味着这些小的身体几乎触摸对方。这是目的吗?
你当前的描述与初始位置,速度,和群众并没有意义,你需要正确的这和发布一个更新你的问题。
注:很难跟随你的索引,但乍一看速度衍生品看起来不正确。我希望看到累积向量添加计算这些衍生品,但我看不出。我可以建议你重塑你的状态向量进入3 x2n矩阵简化你的索引。例如,
Y =重塑(X 3 []);
然后第一个体位只是Y(: 1)和它的速度是Y (:, 2)。第二身体Pos &韦尔是Y(:, 3)和Y (:, 4)。n体Pos &韦尔(:2 * n - 1)和Y (: 2 * n)。等等。这将是更容易编写代码下游比你现在所拥有的东西。
或者你可以重塑一个6 xn矩阵,例如,
Y =重塑(X 6 []);
然后第一个体位是Y(1:3, 1)和速度是Y (4:6 - 1)。第二身体Pos &韦尔(1:3,2)和Y (4:6 - 2)。n体Pos &韦尔(1:3,n)和Y (4:6 - n)。等。
我猜你甚至可以可爱,创建两个辅助索引变量:
pos = 1:3;
韦尔= 4:6;
然后第n个身体位置和速度是Y (pos, n)和Y(韦尔,n)下游这将使你的代码更加可读。
例如,使用最后一个方案可以得到一行中的所有位置衍生品:
:dYdt (pos) = Y(韦尔:);
然后运行循环填写dYdt(韦尔:)部分。
后计算3 x2n或6 xn矩阵导数dYdt,然后重塑为返回一个列向量的目的:
dXdt = dYdt (:);

类别

找到更多的在常微分方程帮助中心文件交换

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!