여기 내가 한 일이 있습니다.
- 질량을 기준으로 처음에는 천왕성과 목성과 토성을 고려하는 것이 가장 안전합니다. 분석에 지구를 포함시키고 상대 위치, 관측 각도 등을 얻는 것도 유익 할 수 있습니다. 따라서 다음을 고려할 것입니다.
- 가져 오기 표준 중력 매개 변수 모두에 대해 (μ)를
- 이 모든 행성에 대해 JPL / HORIZONS 를 통해 초기 위치와 속도를 얻으십시오 . J2000.5에서 데이터를 가져 왔으므로 정오에 2000 년 1 월 1 일의 상태 벡터를 사용했습니다.
- MATLAB 툴이 내장 된 N- 바디 통합기를 작성하십시오. 이 불완전한 태양 광 시스템을 Neptune없이 한 번 통합하고 Neptune과 함께 한 번 통합하십시오.
- 분석하고 비교하십시오!
자, 여기 내 데이터와 N-body 통합자가 있습니다.
function [t, yout_noNeptune, yout_withNeptune] = discover_Neptune()
% Time of integration (in years)
tspan = [0 97] * 365.25 * 86400;
% std. gravitational parameters [km/s²/kg]
mus_noNeptune = [1.32712439940e11; % Sun
398600.4415 % Earth
1.26686534e8 % Jupiter
3.7931187e7 % Saturn
5.793939e6]; % Uranus
mus_withNeptune = [mus_noNeptune
6.836529e6]; % Neptune
% Initial positions [km] and velocities [km/s] on 2000/Jan/1, 00:00
% These positions describe the barycenter of the associated system,
% e.g., sJupiter equals the statevector of the Jovian system barycenter.
% Coordinates are expressed in ICRF, Solar system barycenter
sSun = [0 0 0 0 0 0].';
sEarth = [-2.519628815461580E+07 1.449304809540383E+08 -6.175201582312584E+02,...
-2.984033716426881E+01 -5.204660244783900E+00 6.043671763866776E-05].';
sJupiter = [ 5.989286428194381E+08 4.390950273441353E+08 -1.523283183395675E+07,...
-7.900977458946710E+00 1.116263478937066E+01 1.306377465321731E-01].';
sSaturn = [ 9.587405702749230E+08 9.825345942920649E+08 -5.522129405702555E+07,...
-7.429660072417541E+00 6.738335806405299E+00 1.781138895399632E-01].';
sUranus = [ 2.158728913593440E+09 -2.054869688179662E+09 -3.562250313222718E+07,...
4.637622471852293E+00 4.627114800383241E+00 -4.290473194118749E-02].';
sNeptune = [ 2.514787652167830E+09 -3.738894534538290E+09 1.904284739289832E+07,...
4.466005624145428E+00 3.075618250100339E+00 -1.666451179600835E-01].';
y0_noNeptune = [sSun; sEarth; sJupiter; sSaturn; sUranus];
y0_withNeptune = [y0_noNeptune; sNeptune];
% Integrate the partial Solar system
% once with Neptune, and once without
options = odeset('AbsTol', 1e-8,...
'RelTol', 1e-10);
[t, yout_noNeptune] = ode113(@(t,y) odefcn(t,y,mus_noNeptune) , tspan, y0_noNeptune , options);
[~, yout_withNeptune] = ode113(@(t,y) odefcn(t,y,mus_withNeptune), t, y0_withNeptune, options);
end
% The differential equation
%
% dy/dt = d/dt [r₀ v₀ r₁ v₁ r₂ v₂ ... rₙ vₙ]
% = [v₀ a₀ v₁ a₁ v₂ a₂ ... vₙ aₙ]
%
% with
%
% aₓ = Σₘ -G·mₘ/|rₘ-rₓ|² · (rₘ-rₓ) / |rₘ-rₓ|
% = Σₘ -μₘ·(rₘ-rₓ)/|rₘ-rₓ|³
%
function dydt = odefcn(~, y, mus)
% Split up position and velocity
rs = y([1:6:end; 2:6:end; 3:6:end]);
vs = y([4:6:end; 5:6:end; 6:6:end]);
% Number of celestial bodies
N = size(rs,2);
% Compute interplanetary distances to the power -3/2
df = bsxfun(@minus, permute(rs, [1 3 2]), rs);
D32 = permute(sum(df.^2), [3 2 1]).^(-3/2);
D32(1:N+1:end) = 0; % (remove infs)
% Compute all accelerations
as = -bsxfun(@times, mus.', D32); % (magnitudes)
as = bsxfun(@times, df, permute(as, [3 2 1])); % (directions)
as = reshape(sum(as,2), [],1); % (total)
% Output derivatives of the state vectors
dydt = y;
dydt([1:6:end; 2:6:end; 3:6:end]) = vs;
dydt([4:6:end; 5:6:end; 6:6:end]) = as;
end
멋진 줄거리를 얻는 데 사용한 드라이버 스크립트는 다음과 같습니다.
clc
close all
% Get coordinates from N-body simulation
[t, yout_noNeptune, yout_withNeptune] = discover_Neptune();
% For plot titles etc.
bodies = {'Sun'
'Earth'
'Jupiter'
'Saturn'
'Uranus'
'Neptune'};
% Extract positions
rs_noNeptune = yout_noNeptune (:, [1:6:end; 2:6:end; 3:6:end]);
rs_withNeptune = yout_withNeptune(:, [1:6:end; 2:6:end; 3:6:end]);
% Figure of the whole Solar sysetm, just to check
% whether everything went OK
figure, clf, hold on
for ii = 1:numel(bodies)
plot3(rs_withNeptune(:,3*(ii-1)+1),...
rs_withNeptune(:,3*(ii-1)+2),...
rs_withNeptune(:,3*(ii-1)+3),...
'color', rand(1,3));
end
axis equal
legend(bodies);
xlabel('X [km]');
ylabel('Y [km]');
title('Just the Solar system, nothing to see here');
% Compare positions of Uranus with and without Neptune
rs_Uranus_noNeptune = rs_noNeptune (:, 13:15);
rs_Uranus_withNeptune = rs_withNeptune(:, 13:15);
figure, clf, hold on
plot3(rs_Uranus_noNeptune(:,1),...
rs_Uranus_noNeptune(:,2),...
rs_Uranus_noNeptune(:,3),...
'b.');
plot3(rs_Uranus_withNeptune(:,1),...
rs_Uranus_withNeptune(:,2),...
rs_Uranus_withNeptune(:,3),...
'r.');
axis equal
xlabel('X [km]');
ylabel('Y [km]');
legend('Uranus, no Neptune',...
'Uranus, with Neptune');
% Norm of the difference over time
figure, clf, hold on
rescaled_t = t/365.25/86400;
dx = sqrt(sum((rs_Uranus_noNeptune - rs_Uranus_withNeptune).^2,2));
plot(rescaled_t,dx);
xlabel('Time [years]');
ylabel('Absolute offset [km]');
title({'Euclidian distance between'
'the two Uranuses'});
% Angles from Earth
figure, clf, hold on
rs_Earth_noNeptune = rs_noNeptune (:, 4:6);
rs_Earth_withNeptune = rs_withNeptune(:, 4:6);
v0 = rs_Uranus_noNeptune - rs_Earth_noNeptune;
v1 = rs_Uranus_withNeptune - rs_Earth_withNeptune;
nv0 = sqrt(sum(v0.^2,2));
nv1 = sqrt(sum(v1.^2,2));
dPhi = 180/pi * 3600 * acos(min(1,max(0, sum(v0.*v1,2) ./ (nv0.*nv1) )));
plot(rescaled_t, dPhi);
xlabel('Time [years]');
ylabel('Separation [arcsec]')
title({'Angular separation between the two'
'Uranuses when observed from Earth'});
여기서는 단계별로 설명하겠습니다.
먼저, N-body 통합자가 다음과 같이 작동하는지 확인하기위한 태양계 플롯입니다.
좋은! 다음으로, 나는 해왕성의 영향 유무에 관계없이 천왕성의 위치의 차이를보고 싶었습니다. 그래서 나는 그 두 우라누스의 위치를 추출하고 그 그림을 그렸습니다.
...별로 유용하지 않습니다. 크게 확대하고 지옥을 회전 시켜도 유용한 플롯은 아닙니다. 그래서 나는 두 우라누스 사이의 절대 유클리드 거리의 진화를 보았습니다.
더 좋아 보이기 시작합니다! 우리의 분석이 시작된 지 약 80 년이 지난 후 두 우라누스는 6 백만 킬로미터 떨어져 있습니다!
그것이 큰 소리로 들릴 수 있지만, 더 큰 규모의 물체에서는 지구에서 측정을 할 때 소음에 빠질 수 있습니다. 게다가, 우리는 잠시 후에 볼 수 있듯이 여전히 전체 이야기를하지 않습니다. 다음으로, 지구에서 두 개의 천왕성에 이르는 관측 벡터 사이의 각도 차이를 살펴보고 그 각도가 얼마나 큰지, 관측 오차 임계 값보다 눈에 띄는지를 살펴 보겠습니다.
우와! 300 arcsecs 이상의 차이와 더불어, 모든 종류의 엉뚱한 번쩍 거리는 시시한 엉망진창이 계속됩니다. 그것은 당시의 관측 능력 내에서 잘 보이는 것 같습니다 (그러나 믿을만한 출처를 빨리 찾을 수는 없지만 누구입니까?)
좋은 측정을 위해 목성과 토성을 떠나는 마지막 줄거리도 만들었습니다. 약간의 섭동 이론은 17에서 개발 된했지만 일 , 18 일 세기, 그것은 매우 잘 개발되지 않았고 심지어 르 베리어 (Verrier)가 고려 목성했다 의심 (그러나 다시, 내가 잘못 될 수있다, 당신은 더 알고있는 경우에 저를 수정하시기 바랍니다).
목성과 토성이없는 마지막 줄거리는 다음과 같습니다.
차이점은 있지만, 넵튠을 발견하는 데는 중요하지 않으며 가장 중요하지 않습니다.