|
| 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