Skip to content

Commit 2a32c96

Browse files
committed
planetary motion update to new ode interface
1 parent e5b7d9e commit 2a32c96

File tree

3 files changed

+36
-61
lines changed

3 files changed

+36
-61
lines changed

knitr/planetary_motion/model/planetary_motion.stan

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
11
functions {
2-
array[] real ode(real t, array[] real y, array[] real theta,
3-
array[] real x_r, array[] int x_i) {
4-
vector[2] q = to_vector({y[1], y[2]});
2+
vector ode(real t, vector y, real k, real m) {
3+
vector[2] q = y[1:2];
4+
vector[2] p = y[3:4];
5+
56
real r_cube = pow(dot_self(q), 1.5);
6-
vector[2] p = to_vector({y[3], y[4]});
7-
real m = x_r[1];
8-
real k = theta[1];
97

108
vector[4] dydt;
11-
dydt[1 : 2] = p ./ m;
12-
dydt[3 : 4] = -k * q ./ r_cube;
9+
dydt[1:2] = p / m;
10+
dydt[3:4] = -k * q / r_cube;
1311

14-
return to_array_1d(dydt);
12+
return dydt;
1513
}
1614
}
1715
data {
@@ -21,9 +19,9 @@ data {
2119
transformed data {
2220
real t0 = 0;
2321
int n_coord = 2;
24-
array[n_coord] real q0 = {1.0, 0.0};
25-
array[n_coord] real p0 = {0.0, 1.0};
26-
array[n_coord * 2] real y0 = append_array(q0, p0);
22+
vector[n_coord] q0 = to_vector({1.0, 0.0});
23+
vector[n_coord] p0 = to_vector({0.0, 1.0});
24+
vector[n_coord * 2] y0 = append_row(q0, p0);
2725

2826
real m = 1.0;
2927

@@ -32,23 +30,19 @@ transformed data {
3230
t[i] = i * 1.0 / 10;
3331
}
3432

35-
array[0] int x_i;
36-
3733
real<lower=0> sigma_x = 0.01;
3834
real<lower=0> sigma_y = 0.01;
3935

4036
// ODE tuning parameters
41-
real rel_tol = 1e-6; // 1e-12;
42-
real abs_tol = 1e-6; // 1e-12;
43-
int max_steps = 1000; // 1e6
37+
real rel_tol = 1e-6;
38+
real abs_tol = 1e-6;
39+
int max_steps = 1000;
4440
}
4541
parameters {
4642
real<lower=0> k;
4743
}
4844
transformed parameters {
49-
array[n, n_coord * 2] real y = integrate_ode_bdf(ode, y0, t0, t, {k}, {
50-
m}, x_i, rel_tol, abs_tol,
51-
max_steps);
45+
array[n] vector[n_coord * 2] y = ode_bdf_tol(ode, y0, t0, t, rel_tol, abs_tol, max_steps, k, m);
5246
}
5347
model {
5448
k ~ normal(0, 1);

knitr/planetary_motion/model/planetary_motion_sim.stan

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,16 @@
33
// the star (meaning the star doesn't move).
44

55
functions {
6-
array[] real ode(real t, array[] real y, array[] real theta,
7-
array[] real x_r, array[] int x_i) {
8-
vector[2] q = to_vector({y[1], y[2]});
6+
vector ode(real t, vector y, real m, real k) {
7+
vector[2] q = y[1:2];
8+
vector[2] p = y[3:4];
99
real r_cube = pow(dot_self(q), 1.5);
10-
vector[2] p = to_vector({y[3], y[4]});
11-
real m = x_r[1];
12-
real k = x_r[2];
1310

1411
vector[4] dydt;
15-
dydt[1 : 2] = p ./ m;
16-
dydt[3 : 4] = -k * q ./ r_cube;
12+
dydt[1:2] = p / m;
13+
dydt[3:4] = -k * q / r_cube;
1714

18-
return to_array_1d(dydt);
15+
return dydt;
1916
}
2017
}
2118
data {
@@ -27,9 +24,9 @@ transformed data {
2724
// intial state at t = 0
2825
real t0 = 0;
2926
int n_coord = 2;
30-
array[n_coord] real q0 = {1.0, 0.0};
31-
array[n_coord] real p0 = {0.0, 1.0};
32-
array[n_coord * 2] real y0 = append_array(q0, p0);
27+
vector[n_coord] q0 = to_vector({1.0, 0.0});
28+
vector[n_coord] p0 = to_vector({0.0, 1.0});
29+
vector[n_coord * 2] y0 = append_row(q0, p0);
3330

3431
// model parameters
3532
real m = 1.0;
@@ -41,12 +38,7 @@ transformed data {
4138
t[i] = (i * 1.0) / 10;
4239
}
4340
array[2] real x_r = {m, k};
44-
45-
array[0] real theta;
46-
array[0] int x_i;
47-
48-
array[n, n_coord * 2] real y = integrate_ode_rk45(ode, y0, t0, t, theta,
49-
x_r, x_i);
41+
array[n] vector[n_coord * 2] y = ode_rk45(ode, y0, t0, t, m, k);
5042
}
5143
parameters {
5244
real phi;

knitr/planetary_motion/model/planetary_motion_star.stan

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,15 @@
1-
// fixes a calculation error in planetary_motion_star.stan.
2-
31
functions {
4-
array[] real ode(real t, array[] real y, array[] real theta,
5-
array[] real x_r, array[] int x_i) {
6-
vector[2] q = to_vector({y[1], y[2]});
7-
vector[2] s = to_vector({theta[2], theta[3]});
2+
vector ode(real t, vector y, real k, vector star, real m) {
3+
vector[2] q = y[1:2];
4+
vector[2] p = y[3:4];
85

9-
real r_cube = pow(dot_self(q - s), 1.5);
10-
vector[2] p = to_vector({y[3], y[4]});
11-
real m = x_r[1];
12-
real k = theta[1];
6+
real r_cube = pow(dot_self(q - star), 1.5);
137

148
vector[4] dydt;
15-
dydt[1 : 2] = p ./ m;
16-
dydt[3 : 4] = -k * (q - s) ./ r_cube;
9+
dydt[1:2] = p / m;
10+
dydt[3:4] = -k * (q - star) / r_cube;
1711

18-
return to_array_1d(dydt);
12+
return dydt;
1913
}
2014
}
2115
data {
@@ -29,7 +23,6 @@ transformed data {
2923
real t0 = 0;
3024
int n_coord = 2;
3125
real m = 1.0;
32-
array[0] int x_i;
3326

3427
real<lower=0> sigma_x = sigma;
3528
real<lower=0> sigma_y = sigma;
@@ -41,17 +34,13 @@ transformed data {
4134
}
4235
parameters {
4336
real<lower=0> k;
44-
array[n_coord] real q0;
45-
array[n_coord] real p0;
46-
array[n_coord] real star;
37+
vector[n_coord] q0;
38+
vector[n_coord] p0;
39+
vector[n_coord] star;
4740
}
4841
transformed parameters {
49-
array[n_coord * 2] real y0 = append_array(q0, p0);
50-
array[n_coord + 1] real theta = append_array({k}, star);
51-
52-
array[n, n_coord * 2] real y = integrate_ode_rk45(ode, y0, t0, time, theta,
53-
{m}, x_i, rel_tol,
54-
abs_tol, max_steps);
42+
vector[n_coord * 2] y0 = append_row(q0, p0);
43+
array[n] vector[n_coord * 2] y = ode_rk45_tol(ode, y0, t0, time, rel_tol, abs_tol, max_steps, k, star, m);
5544
}
5645
model {
5746
k ~ normal(1, 0.001); // prior derive based on solar system

0 commit comments

Comments
 (0)