Skip to content

Commit f47e3e8

Browse files
authored
Merge pull request #7 from ComputationalScienceLaboratory/ArenstorfOrbit
Added Arenstorf orbit problem
2 parents 4c0d7aa + a7df9c9 commit f47e3e8

File tree

4 files changed

+81
-0
lines changed

4 files changed

+81
-0
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
classdef Canonical < otp.arenstorf.ArenstorfProblem
2+
methods
3+
function obj = Canonical(varargin)
4+
5+
p = inputParser;
6+
p.addParameter('m1', 0.012277471);
7+
p.parse(varargin{:});
8+
s = p.Results;
9+
10+
params.m1 = s.m1;
11+
params.m2 = 1-params.m1;
12+
13+
y0 = [0.994; 0; 0; -2.00158510637908252240537862224];
14+
tspan = [0,17.0652165601579625588917206249];
15+
16+
obj = obj@otp.arenstorf.ArenstorfProblem(tspan, y0, params);
17+
end
18+
19+
end
20+
end
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
classdef ArenstorfProblem < otp.Problem
2+
% The classic 3-body problem with parameters from
3+
% Reference: Hairer, Ernst, Syvert Paul Nørsett, and Gerhard Wanner.
4+
% Solving Ordinary Differential Equations I: Nonstiff Problems Springer-Verlag, 1987.
5+
% CH II, p. 129.
6+
methods
7+
function obj = ArenstorfProblem(timeSpan, y0, parameters)
8+
obj@otp.Problem('Arenstorf Orbit', 4, timeSpan, y0, parameters);
9+
end
10+
end
11+
12+
methods (Access=protected)
13+
14+
function onSettingsChanged(obj)
15+
m1 = obj.Parameters.m1;
16+
m2 = obj.Parameters.m2;
17+
18+
obj.Rhs = otp.Rhs( @(t, y) otp.arenstorf.f(t, y, m1, m2), ...
19+
otp.Rhs.FieldNames.Jacobian, @(t, y) otp.arenstorf.jac(t, y, m1, m2));
20+
end
21+
22+
23+
function validateNewState(obj, newTimeSpan, newY0, newParameters)
24+
validateNewState@otp.Problem(obj, newTimeSpan, newY0, newParameters);
25+
26+
otp.utils.StructParser(newParameters) ...
27+
.checkField('m1', 'scalar', 'real', 'finite', 'positive') ...
28+
.checkField('m2', 'scalar', 'real', 'finite', 'positive');
29+
end
30+
31+
function mov = internalMovie(obj, t, y, varargin)
32+
mov = otp.utils.movie.PhasePlaneMovie(obj.Name, @obj.index2label, varargin{:});
33+
mov.record(t, y(:,1:2));
34+
end
35+
36+
end
37+
end

src/+otp/+arenstorf/f.m

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
function dy = f(~, y, m1 ,m2)
2+
3+
D1 = ((y(1) + m1)^2 + y(2)^2)^(3/2);
4+
D2 = ((y(1) - m2)^2 + y(2)^2)^(3/2);
5+
6+
dy = [y(3:4);
7+
y(1) + 2*y(4) - m2/D1*(y(1) + m1) - m1/D2*(y(1) - m2);
8+
y(2) - 2*y(3) - m2/D1*y(2) - m1/D2*y(2)];
9+
10+
end

src/+otp/+arenstorf/jac.m

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
function dfy = jac(~, y, m1 ,m2)
2+
3+
D1 = m1/((m2 - y(1))^2 + y(2)^2)^(3/2);
4+
D2 = m2/((m1 + y(1))^2 + y(2)^2)^(3/2);
5+
L1 = (2*((m2 - y(1))^2 + y(2)^2)^(5/2));
6+
L2 = ((m1 + y(1))^2 + y(2)^2)^(5/2);
7+
8+
9+
dfy =[ 0, 0, 1, 0;
10+
0, 0, 0, 1;
11+
(3*m1*(2*m2 - 2*y(1))*(m2 - y(1)))/L1 - D1 - D2 + (3*m2*(2*m1 + 2*y(1))*(m1 + y(1)))/(2*L2) + 1, (3*m2*y(2)*(m1 + y(1)))/L2 - (3*m1*y(2)*(m2 - y(1)))/((m2 - y(1))^2 + y(2)^2)^(5/2), 0, 2;
12+
(3*m2*y(2)*(m1 + y(1)))/L2 - (3*m1*y(2)*(2*m2 - 2*y(1)))/L1, (3*m1*y(2)^2)/((m2 - y(1))^2 + y(2)^2)^(5/2) - D1 - D2 + (3*m2*y(2)^2)/L2 + 1, -2, 0];
13+
14+
end

0 commit comments

Comments
 (0)