-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMyPendulum.h
More file actions
146 lines (101 loc) · 1.92 KB
/
MyPendulum.h
File metadata and controls
146 lines (101 loc) · 1.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#pragma once
/*
* Code based on https://freddie.witherden.org/tools/doublependulum/report.pdf, but with few alterations.
*/
struct Pendulum {
// Warning: using too small values for mass or l or r will likely introduce roundoff errors.
Pendulum(double t, double o, double v, double l, double m, double r, double k) : theta(t), omega(o), v(v), len(l), mass(m), r(r), k(k)
{}
double theta; // angle in radians.
double omega; // angular velocity - should be zero.
double v; // dot of r
double r; // length of spring
double len; // length of the pendulum
double mass; // mass of the ball attached to the end of pendulum
double k; // spring constant
};
class MyPendulum {
public:
MyPendulum(const Pendulum& upper, const Pendulum& lower,
double dt = 0.016, double g = 9.81);
void update();
double theta1() {
return m_theta1;
}
double omega1() {
return m_omega1;
}
double m1() {
return m_m1;
}
double l1() {
return m_l1;
}
double v1() {
return m_v1;
}
double r1() {
return m_r1;
}
double k1(){
return m_k1;
}
double theta2() {
return m_theta2;
}
double omega2() {
return m_omega2;
}
double m2() {
return m_m2;
}
double l2() {
return m_l2;
}
double v2() {
return m_v2;
}
double r2() {
return m_r2;
}
double k2() {
return m_k2;
}
double time() {
return m_time;
}
protected:
enum {
THETA_1,
OMEGA_1,
V_1,
R_1,
THETA_2,
OMEGA_2,
V_2,
R_2,
NUM_EQNS
};
// Get 8 first-order equations.
void derivs(const double* yin, double* dydx);
// Use RK4 method to solve systems of equations.
void solveODEs(const double* yin, double* yout);
// Angle from the y axis, radians.
double m_theta1;
double m_omega1;
double m_l1;
double m_m1;
double m_v1;
double m_r1;
double m_k1;
double m_theta2;
double m_omega2;
double m_v2;
double m_r2;
double m_l2;
double m_m2;
double m_k2;
const double m_dt;
const double m_g;
double m_time;
};