Skip to content

Commit 32e4213

Browse files
YingboMachriselrod
andcommitted
Don't use cse when it's broken
Co-authored-by: Chris Elrod <[email protected]>
1 parent e400f5b commit 32e4213

File tree

2 files changed

+407
-19
lines changed

2 files changed

+407
-19
lines changed

m.jl

Lines changed: 387 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,387 @@
1+
using ModelingToolkit
2+
using LinearAlgebra
3+
@parameters(
4+
m₁ = 0.36,
5+
m₂ = 0.151104,
6+
m₃ = 0.075552,
7+
l₁ = 0.15,
8+
l₂ = 0.30,
9+
J₁ = 0.002727,
10+
J₂ = 0.0045339259,
11+
EE = 0.20e12,
12+
NUE= 0.30,
13+
BB = 0.0080,
14+
HH = 0.0080,
15+
ρ = 7870.0,
16+
γ = 0.0,
17+
Ω = 150.,
18+
)
19+
20+
FACM = ρ*BB*HH*l₂
21+
FACK = EE*BB*HH/l₂
22+
FACB = BB*HH*l₂
23+
24+
MQ = zeros(Num, 4, 4)
25+
MQ[1,1] = FACM*.5
26+
MQ[2,2] = FACM*.5
27+
MQ[3,3] = FACM*8.0
28+
MQ[3,4] = FACM*1.0
29+
MQ[4,3] = FACM*1.0
30+
MQ[4,4] = FACM*2.0
31+
32+
KQ = zeros(Num, 4, 4)
33+
KQ[1,1] = FACK*π^4/24.0*(HH/l₂)^2
34+
KQ[2,2] = FACK*π^4*2.0/3.0*(HH/l₂)^2
35+
KQ[3,3] = FACK*16.0/3.0
36+
KQ[3,4] = -FACK*8.0/3.0
37+
KQ[4,3] = -FACK*8.0/3.0
38+
KQ[4,4] = FACK*7.0/3.0
39+
40+
BQ = zeros(Num, 4, 4)
41+
BQ[1,3] = -FACB*16.0/π^3
42+
BQ[1,4] = FACB*(8.0/π^3-1.0/π)
43+
BQ[2,4] = FACB*0.5/π
44+
BQ[3,1] = FACB*16.0/π^3
45+
BQ[4,1] = -FACB*(8.0/π^3-1.0/π)
46+
BQ[4,2] = -FACB*0.5/π
47+
48+
c1 = zeros(Num, 4)
49+
c2 = zeros(Num, 4)
50+
c12 = zeros(Num, 4)
51+
c21 = zeros(Num, 4)
52+
c1[3] = FACB*2.0/3.0
53+
c1[4] = FACB*1.0/6.0
54+
c2[1] = FACB*2.0/π
55+
c12[3] = l₂*FACB*1.0/3.0
56+
c12[4] = l₂*FACB*1.0/6.0
57+
c21[1] = l₂*FACB*1.0/π
58+
c21[2] = -l₂*FACB*0.5/π
59+
60+
DQ = zeros(Num, 4, 4)
61+
# OPTIONAL DAMPING
62+
# DQ[1,1] = 5.0
63+
# DQ[2,2] = 25.0
64+
# DQ[3,3] = 0.5*2.308375455264791e2
65+
# DQ[3,4] = -0.5*2.62688487992052e2
66+
# DQ[4,3] = -0.5*2.626884879920526e2
67+
# DQ[4,4] = 0.5*4.217421837156818e2
68+
69+
## Setup variables and initial conditions:
70+
71+
# init
72+
# Initial values: 'Close' to smooth motion,
73+
# accelerations and multipliers consistent
74+
# for linear stiffness term and no damping
75+
# (ipar(1) = 0, ipar(2) = 0).
76+
@variables(
77+
t,
78+
ϕ₁(t)=0.0,
79+
ϕ₂(t)=0.0,
80+
x₃(t)=4.500169330000000e-1,
81+
q₁(t)=0.0,
82+
q₂(t)=0.0,
83+
q₃(t)=1.033398630000000e-5,
84+
q₄(t)=1.693279690000000e-5,
85+
dϕ₁(t)= 1.500000000000000e2,
86+
dϕ₂(t)=-7.499576703969453e1,
87+
dx₃(t)=-2.689386719979040e-6,
88+
dq₁(t)= 4.448961125815990e-1,
89+
dq₂(t)= 4.634339319238670e-3,
90+
dq₃(t)=-1.785910760000550e-6,
91+
dq₄(t)=-2.689386719979040e-6,
92+
ddϕ₁(t)= 0.000000000000000e0,
93+
ddϕ₂(t)=-1.344541576709835e-3,
94+
ddx₃(t)=-5.062194924490193e+3,
95+
ddq₁(t)=-6.829725665986310e-5,
96+
ddq₂(t)= 1.813207639590617e-20,
97+
ddq₃(t)=-4.268463266810281e+0,
98+
ddq₄(t)= 2.098339029337557e-1,
99+
λ₁(t) = -6.552727150584648e-8,
100+
λ₂(t) = 3.824589509350831e+2,
101+
λ₃(t) = -4.635908708561371e-9,
102+
)
103+
104+
105+
# init1
106+
# Initial values: 'Close' to smooth motion,
107+
# accelerations and multipliers consistent
108+
# for linear stiffness term and no damping
109+
# (ipar(1) = 0, ipar(2) = 0).
110+
#@variables(
111+
# t,
112+
# ϕ₁(t) = 0.0,
113+
# ϕ₂(t) = 0.0,
114+
# x₃(t) = .450016933,
115+
# q₁(t) = 0.0,
116+
# q₂(t) = 0.0,
117+
# q₃(t) = .103339863e-4,
118+
# q₄(t) = .169327969e-4,
119+
# dϕ₁(t) = .150000000e+3,
120+
# dϕ₂(t) = -.749957670e+2,
121+
# dx₃(t) = -.268938672e-5,
122+
# dq₁(t) = .444896105e0,
123+
# dq₂(t) = .463434311e-2,
124+
# dq₃(t) = -.178591076e-5,
125+
# dq₄(t) = -.268938672e-5,
126+
# ddϕ₁(t) = 0.0,
127+
# ddϕ₂(t) = -1.344541576008661e-3,
128+
# ddx₃(t) = -5.062194923138079e+3,
129+
# ddq₁(t) = -6.833142732779555e-5,
130+
# ddq₂(t) = 1.449382650173157e-8,
131+
# ddq₃(t) = -4.268463211410861e+0,
132+
# ddq₄(t) = 2.098334687947376e-1,
133+
# λ₁(t) = -6.397251492537153e-8,
134+
# λ₂(t) = 3.824589508329281e+2,
135+
# λ₃(t) = -4.376060460948886e-9,
136+
# )
137+
138+
# init2
139+
# Initial values: On rigid motion trajectory,
140+
# leading to strong oscillations.
141+
# accelerations and multipliers consistent
142+
# for linear stiffness term and no damping
143+
# (ipar(1) = 0, ipar(2) = 0).
144+
#@variables(
145+
# t,
146+
# ϕ₁(t) = 0.0,
147+
# ϕ₂(t) = 0.0,
148+
# x₃(t) = .4500e0,
149+
# q₁(t) = 0.0,
150+
# q₂(t) = 0.0,
151+
# q₃(t) = 0.0,
152+
# q₄(t) = 0.0,
153+
# dϕ₁(t) = .150e+3,
154+
# dϕ₂(t) = -.750e+2,
155+
# dx₃(t) = 0.0,
156+
# dq₁(t) = 0.0,
157+
# dq₂(t) = 0.0,
158+
# dq₃(t) = 0.0,
159+
# dq₄(t) = 0.0,
160+
# ddϕ₁(t) = 0.0,
161+
# ddϕ₂(t) = 0.0,
162+
# ddx₃(t) = -3.789473684210526e+3,
163+
# ddq₁(t) = 0.0,
164+
# ddq₂(t) = 0.0,
165+
# ddq₃(t) = 1.924342105263158e+2,
166+
# ddq₄(t) = 1.273026315789474e+3,
167+
# λ₁(t) = 0.0,
168+
# λ₂(t) = 2.863023157894737e+2,
169+
# λ₃(t) = 0.0,
170+
# )
171+
172+
173+
# Define problem equations:
174+
175+
cosp1 = cos(ϕ₁)
176+
cosp2 = cos(ϕ₂)
177+
sinp1 = sin(ϕ₁)
178+
sinp2 = sin(ϕ₂)
179+
cosp12 = cos(ϕ₁-ϕ₂)
180+
sinp12 = sin(ϕ₁-ϕ₂)
181+
182+
D = Differential(t)
183+
P = [ϕ₁, ϕ₂, x₃]
184+
Q = [q₁, q₂, q₃, q₄]
185+
X = [P..., Q...]
186+
# V = D.(P)
187+
V = [dϕ₁, dϕ₂, dx₃]
188+
# QD = D.(Q)
189+
QD = [dq₁, dq₂, dq₃, dq₄]
190+
DX = [V..., QD...]
191+
# DDX = D.(DX)
192+
DDX = [ddϕ₁, ddϕ₂, ddx₃, ddq₁, ddq₂, ddq₃, ddq₄]
193+
194+
ivs = [
195+
# Initial values velocity variables
196+
D(ϕ₁) => Symbolics.getdefaultval(dϕ₁),
197+
D(ϕ₂) => Symbolics.getdefaultval(dϕ₂),
198+
D(x₃) => Symbolics.getdefaultval(dx₃),
199+
D(q₁) => Symbolics.getdefaultval(q₁),
200+
D(q₂) => Symbolics.getdefaultval(q₂),
201+
D(q₃) => Symbolics.getdefaultval(q₃),
202+
D(q₄) => Symbolics.getdefaultval(q₄),
203+
# Initial values acceleration variables
204+
D(DX[1]) => Symbolics.getdefaultval(ddϕ₁),
205+
D(DX[2]) => Symbolics.getdefaultval(ddϕ₂),
206+
D(DX[3]) => Symbolics.getdefaultval(ddx₃),
207+
D(DX[4]) => Symbolics.getdefaultval(dq₁),
208+
D(DX[5]) => Symbolics.getdefaultval(dq₂),
209+
D(DX[6]) => Symbolics.getdefaultval(dq₃),
210+
D(DX[7]) => Symbolics.getdefaultval(dq₄),
211+
D(λ₁) => 0.0,
212+
D(λ₂) => 0.0,
213+
D(λ₃) => 0.0,
214+
]
215+
for I = 1:7
216+
push!(ivs, D(DDX[I]) => 0.0)
217+
end
218+
219+
# Evaluate scalar products and quadratic forms.
220+
c1TQ = dot(c1, Q)
221+
c1TQD = dot(c1, QD)
222+
c2TQ = dot(c2, Q)
223+
c2TQD = dot(c2, QD)
224+
c12TQ = dot(c12, Q)
225+
c12TQD= dot(c12, QD)
226+
MQQ = zeros(Num, length(Q))
227+
KQQ = zeros(Num, length(Q))
228+
DQQD = zeros(Num, length(Q))
229+
QTBQ = zeros(Num, length(Q))
230+
BQQD = zeros(Num, length(Q))
231+
for I = 1:length(Q)
232+
MQQ[I] = dot(MQ[:, I], Q)
233+
KQQ[I] = dot(KQ[:, I], Q)
234+
DQQD[I]= dot(DQ[:, I], QD)
235+
QTBQ[I]= dot(Q, BQ[:, I])
236+
BQQD[I]= dot(BQ[I, :], QD)
237+
end
238+
QTMQQ = dot(Q, MQQ)
239+
QDTMQQ = dot(QD, MQQ)
240+
QDTBQQD = dot(QD, BQQD)
241+
242+
# Compute mass matrix.
243+
AM = zeros(Num, 7, 7) # NP×NP
244+
AM[1,1] = J₁ + m₂*l₁^2
245+
AM[1,2] = .5*l₁*l₂*m₂*cosp12
246+
AM[2,2] = J₂
247+
AM[1,3] = 0.0
248+
AM[2,3] = 0.0
249+
AM[3,1] = 0.0
250+
AM[3,2] = 0.0
251+
AM[3,3] = m₃
252+
AM[1,2] = AM[1,2] + ρ*l₁*(sinp12*c2TQ+cosp12*c1TQ)
253+
AM[2,2] = AM[2,2] + QTMQQ + 2.0*ρ*c12TQ
254+
for I = 1:length(Q)
255+
AM[1,3+I] = ρ*l₁*(-sinp12*c1[I] + cosp12*c2[I])
256+
AM[2,3+I] = ρ*c21[I] + ρ*QTBQ[I]
257+
AM[3,3+I] = 0.0
258+
end
259+
for I = 1:length(Q)
260+
for J = 1:I
261+
AM[3+J,3+I] = MQ[J,I]
262+
end
263+
end
264+
for I = 1:size(AM,1)
265+
for J = I+1:size(AM,2)
266+
AM[J,I] = AM[I,J]
267+
end
268+
end
269+
270+
KU = 4
271+
KV = 0
272+
273+
# Compute constraint matrix.
274+
QKU = KU > 0 ? Q[KU] : Num(0)
275+
QKV = KV > 0 ? Q[KV] : Num(0)
276+
GP = zeros(Num, 3, 7)
277+
GP[1,1] = l₁*cosp1
278+
GP[1,2] = l₂*cosp2 + QKU*cosp2 - QKV*sinp2
279+
GP[1,3] = 0.0
280+
GP[2,1] = l₁*sinp1
281+
GP[2,2] = l₂*sinp2 + QKU*sinp2 + QKV*cosp2
282+
GP[2,3] = 1.0
283+
GP[3,1] = 1.0
284+
GP[3,2] = 0.0
285+
GP[3,3] = 0.0
286+
for I = 1:length(Q)
287+
GP[1,3+I] = 0.0
288+
GP[2,3+I] = 0.0
289+
GP[3,3+I] = 0.0
290+
end
291+
if KU != 0
292+
GP[1,3+KU] = sinp2
293+
GP[2,3+KU] = -cosp2
294+
end
295+
if KV != 0
296+
GP[1,3+KV] = cosp2
297+
GP[2,3+KV] = sinp2
298+
end
299+
300+
# Forces - rigid motion entries.
301+
F = zeros(Num, 7)
302+
F[1] = -.5*l₁*γ*(m₁+2.0*m₂)*cosp1 +
303+
-.5*l₁*l₂*m₂*V[2]*V[2]*sinp12
304+
F[2] = -.5*l₂*γ*m₂*cosp2 +
305+
.5*l₁*l₂*m₂*V[1]*V[1]*sinp12
306+
F[3] = 0.0
307+
# Superposition of flexible motion (term f^e).
308+
F[1] += ρ*l₁*V[2]*V[2]*(-sinp12*c1TQ+cosp12*c2TQ) +
309+
- 2.0*ρ*l₁*V[2]*(cosp12*c1TQD+sinp12*c2TQD)
310+
F[2] += ρ*l₁*V[1]*V[1]*(sinp12*c1TQ-cosp12*c2TQ) +
311+
- 2.0*ρ*V[2]*c12TQD - 2.0*V[2]*QDTMQQ +
312+
- ρ*QDTBQQD - ρ*γ*(cosp2*c1TQ-sinp2*c2TQ)
313+
# Coriolis and gravity terms flexible motion (Gamma).
314+
for I = 1:length(Q)
315+
F[3+I] = V[2]*V[2]*MQQ[I] +
316+
+ ρ*(V[2]*V[2]*c12[I] +
317+
l₁*V[1]*V[1]*(cosp12*c1[I]+sinp12*c2[I]) +
318+
2.0*V[2]*BQQD[I]) +
319+
- ρ*γ*(sinp2*c1[I]+cosp2*c2[I])
320+
end
321+
# Stiffness + damping terms - K q - D q`.
322+
for I = 1:length(Q)
323+
F[3+I] = F[3+I] - KQQ[I] - DQQD[I]
324+
end
325+
326+
#if IPAR[1] == 1
327+
# # Nonlinear stiffness term
328+
# FACK = 0.5*EE*BB*HH/l₂^2*π^2
329+
# FACB = 80.0/(π^2*9.0)
330+
# F[4] -= FACK*(Q[1]*Q[4]-FACB*Q[2]*(-4*Q[3]+2*Q[4]))
331+
# F[5] -= FACK*(4*Q[2]*Q[4]-FACB*Q[1]*(-4*Q[3]+2*Q[4]))
332+
# F[6] -= FACK*4.0*FACB*Q[1]*Q[2]
333+
# F[7] -= FACK*(0.5*Q[1]^2+2*Q[2]^2-2*FACB*Q[1]*Q[2])
334+
#end
335+
336+
# Dynamics part II ( M*w - f + G(T)*lambda ).
337+
DELTA = zeros(Num, 7)
338+
for I = 1:7
339+
DELTA[I] = dot(AM[:,I], DDX) +
340+
- F[I] + GP[1,I]*λ₁+GP[2,I]*λ₂+GP[3,I]*λ₃
341+
end
342+
343+
# Acceleration level constraints.
344+
#ALC = zeros(Num, 3)
345+
#QDKU = KU > 0 ? QD[KU] : Num(0)
346+
#QDKV = KV > 0 ? QD[KV] : Num(0)
347+
#ALC = zeros(Num, 3)
348+
#ALC[1] = -l₁*sinp1*V[1]^2 - (l₂+QKU)*sinp2*V[2]^2 +
349+
# 2.0*V[2]*(cosp2*QDKU-sinp2*QDKV) - cosp2*V[2]^2*QKV
350+
#ALC[2] = l₁*cosp1*V[1]^2 + (l₂+QKU)*cosp2*V[2]^2 +
351+
# 2.0*V[2]*(sinp2*QDKU+cosp2*QDKV) - sinp2*V[2]^2*QKV
352+
#ALC[3] = 0.0
353+
#for I = 1:7
354+
# ALC[1] += GP[1,I]*DDX[I]
355+
# ALC[2] += GP[2,I]*DDX[I]
356+
# ALC[3] += GP[3,I]*DDX[I]
357+
#end
358+
359+
## Velocity level constraints.
360+
#VLC = zeros(Num, 3)
361+
#VLC[1] = 0.0
362+
#VLC[2] = 0.0
363+
#VLC[3] = -Ω
364+
#for I = 1:7
365+
# VLC[1] += GP[1,I]*DX[I]
366+
# VLC[2] += GP[2,I]*DX[I]
367+
# VLC[3] += GP[3,I]*DX[I]
368+
#end
369+
370+
## Position level constraints.
371+
PLC = zeros(Num, 3)
372+
PLC[1] = l₁*sinp1 + l₂*sinp2 + QKU*sinp2 + QKV*cosp2
373+
PLC[2] = x₃ - l₁*cosp1 - l₂*cosp2 + -QKU*cosp2 + QKV*sinp2
374+
PLC[3] = ϕ₁ - Ω*t
375+
376+
eqs = Symbolics.Equation[]
377+
for D in DELTA
378+
push!(eqs, 0 ~ D)
379+
end
380+
for P in PLC
381+
push!(eqs, 0 ~ P)
382+
end
383+
for I = 1:7
384+
push!(eqs, D(X[I]) ~ DX[I])
385+
push!(eqs, D(DX[I]) ~ DDX[I])
386+
end
387+
eqs

0 commit comments

Comments
 (0)