Tyngdekraft
Man kan simulere tyngde-interaktionen mellem massive objekter, ved at bestemme kraftvektoren mellem hvert objekt og bestemme den resulterende effekt på objekts position med numerisk integration.
To-legeme system
Tyngdekraften mellem to objekter er beskrevet af Newtons ligning:
\begin{equation}
\vec{F}_g = G \frac{M \ m}{ \left| \vec{r} \right|^2} \hat{r}
\end{equation}
Hvor \(M\) og \(m\) er massen af de respektive objekter, \(G\) er gravitationskonstanten (\( G = 6.67 \times 10^{-11} N \ m^2 \ kg^{-2} \)), \(\vec{r}\) er afstandsvektoren mellem de to objekter og \(\hat{r}\) er retningsvektoren mellem objekterne.
Hvis vi antager at det ene objekt er meget større end det andet (f.eks. Jordens masse \(m_\oplus\) i forhold til en satellits masse \( m_{sat} \)), og derfor ikke ændrer sin position under simuleringen, kan vi nøjes med at følge det lille objekts bane. For hvert tidsskridt beregner vi følgende udtryk:
Positionsopdatering af satellit i kredsløb om Jorden
Newtonisk tyngdekraftFor hvert tidsskridt \(\Delta t\) beregn, \begin{align} 1) \ & \vec{r} = \vec{r}_{sat_n} - \vec{r}_{\oplus_n} & \text{Afstandsvektor mellem de to objekter} \\ 2) \ & \hat{r} = \frac{\vec{r}}{\left| \vec{r} \right|} \ & \text{Retningsvektor mellem de to objekter} \\ 3) \ & \vec{F}_g = - G \frac{m_{\oplus} \ m_{sat}}{ \left| \vec{r} \right|^2} \hat{r} & \text{Kraften mellem de to objekter} \\ 4) \ & \vec{p}_{sat_{n+1}} = \vec{p}_{sat_n} + \Delta t \ \vec{F}_g & \text{Impulsvektor opdatering af satellitten} \\ 5) \ & \vec{r}_{sat_{n+1}} = \vec{r}_{sat_n} + \Delta t \ \frac{\vec{p}_{sat_{n+1}}}{m_{sat}} & \text{Positionsopdatering af det satellitten} \end{align}
\begin{align} 6^*) \ & \vec{p}_{\oplus_{n+1}} = \vec{p}_{\oplus_n} + \Delta t \ \vec{F}_g & \text{Impulsvektor opdatering af Jorden} \\ 7^*) \ & \vec{r}_{\oplus_{n+1}} = \vec{r}_{\oplus_n} + \Delta t \ \frac{\vec{p}_{\oplus_{n+1}}}{m_{\oplus}} & \text{Positionsopdatering af Jorden} \end{align}
* Det primære objekt (Jorden i dette eksempel) kan ligeledes opdateres. Da kraften er den samme (Newtons 3. lov) kan vi nøjes med at opdatere objektets impuls og positionsvektorer
r_jorden = [0, 0, 0]; % (m) Position af Jorden
r_sat = [9e7, 0, 0]; % (m) Position af satellit
m_sat = 1500; % (kg) Satellittens masse
m_jorden = 5.97e24; % (kg) Jordens masse
v_sat = [0, 2400, 600]; % (m/s) begyndelseshastighed for satellitten
p_sat = m_sat .* v_sat; % (kg*m/s) satellittens impuls
G = 6.67e-11; % (N m^2 kg^-2) Gravitationskonstanten
dt = 1000; % (s) tidsskridt størrelse
t = 0; % (s) Begyndelses tid
tf = 360*24*60; % (s) slut tid
% Plot startbetingelser
plot3(r_jorden(1), r_jorden(2), r_jorden(3),'ok')
hold on
plot3(r_sat(1), r_sat(2), r_sat(3), 'o')
xlabel('x (m)')
ylabel('y (m)')
zlabel('z (m)')
% Løkke (Euler-integration)
while t < tf
r = r_sat - r_jorden; % (afstanden mellem jorden og objektet)
rhat = r./norm(r); % retning (enhedsvektor)
F_g = -G .* m_sat .* m_jorden ./(norm(r).^2) .* rhat; % (N) Kraft
p_sat = p_sat + dt .* F_g ; % Impulsopdatering
r_sat = r_sat + dt .* p_sat ./ m_sat; % positionsopdatering
plot3(r_sat(1), r_sat(2), r_sat(3),'.') % Plot den opdaterede position
t = t + dt; % adder tidsskridt
pause(0.1); % vent 100 ms...
end
n-legeme simulering
clf;clear;clc;
% Protostjerne
stjerne = struct();
stjerne.mass = 10e31;
stjerne.pos = [0, 0, 0];
stjerne.vel = [0, 0, 0];
stjerne.p = stjerne.mass .* stjerne.vel;
% Tyngdekraft mellem to masser
G = 6.67e-11;
F_g = @(s1, s2) - G .* s1.mass .* s2.mass /(norm(s1.pos-s2.pos).^2) .* (s1.pos-s2.pos)/norm(s1.pos-s2.pos);
N = 3; % Antal stjerner
stjerner(1:N) = struct(stjerne);
% Tilfældige startbetingelser for stjernerne
for i=1:N
stjerner(i).pos = [rand * 10e10, rand * 10e10, rand* 10e10];
stjerner(i).vel = [rand * 5000, rand*5000, rand*500];
stjerner(i).p = stjerne.mass .* stjerne.vel;
plot3(stjerner(i).pos(1), stjerner(i).pos(2), stjerner(i).pos(3))
hold on
end
dt = 500; % (s) tidsskridt
t = 0; % (s) tid
t_end = 10000000;
% Kør simulering
while t < t_end
F = zeros(N,3);% (N) den resulterende kraft
for i=1:N % Løb over alle stjerner
for j=1:N % Løb over alle stjerner
if i ~= j % ingen selv-interaktion
F(i,:) = F(i) + F_g(stjerner(i), stjerner(j));
end
end
stjerner(i).p = stjerner(i).p + F(i,:) .* dt;
stjerner(i).vel = stjerner(i).p ./ stjerner(i).mass;
end
% opdater position
for i=1:N
stjerner(i).pos = stjerner(i).pos + stjerner(i).vel .* dt;
if mod(t, 10000) == 0
plot3(stjerner(i).pos(1), stjerner(i).pos(2), stjerner(i).pos(3),'Color',[i/(4+N) i/N i/N],'Marker','.');
end
end
pause(0.01)
t = t+dt;
end