|
1 | 1 | using ModelingToolkit
|
2 |
| -using DiffEqBase, StaticArrays |
| 2 | +using DiffEqBase, StaticArrays, LinearAlgebra |
3 | 3 |
|
4 | 4 | @variables t y(t)[1:10]
|
5 | 5 | y = collect(y)
|
6 | 6 | D = Differential(t)
|
7 | 7 |
|
| 8 | +# Stiff |
8 | 9 | sa1sys = let
|
9 | 10 | sa1eqs = [D(y[1]) ~ -0.5 * y[1], D(y[2]) ~ -y[2], D(y[3]) ~ -100*y[3], D(y[4]) ~ -90*y[4]]
|
10 | 11 | ODESystem(sa1eqs, t, name = :sa1)
|
@@ -162,3 +163,307 @@ sd6sys = let
|
162 | 163 | end
|
163 | 164 |
|
164 | 165 | sd6prob = ODEProblem{false}(sd6sys, [y[1] => 1.0; y[2:3] .=> 0.0], (0, 1.0), dt = 3.3e-8, cse = true)
|
| 166 | + |
| 167 | +se1sys = let |
| 168 | + Γ = 100 |
| 169 | + se1eqs = [D(y[1]) ~ y[2], |
| 170 | + D(y[2]) ~ y[3], |
| 171 | + D(y[3]) ~ y[4], |
| 172 | + D(y[4]) ~ (y[1]^2 - sin(y[1]) - Γ^4) * y[1] + (y[2] * y[3] / (y[1]^2 + 1) - 4 * Γ^3) * y[2] + (1 - 6 * Γ^2) * y[3] + (10 * exp(-y[4]^2) - 4Γ) * y[4] + 1 |
| 173 | + ] |
| 174 | + |
| 175 | + ODESystem(se1eqs, t, name = :se1) |
| 176 | +end |
| 177 | + |
| 178 | +se1prob = ODEProblem{false}(se1sys, y .=> 0.0, (0, 1.0), dt = 6.8e-3, cse = true) |
| 179 | + |
| 180 | +se2sys = let |
| 181 | + se2eqs = [D(y[1]) ~ y[2], |
| 182 | + D(y[2]) ~ 5 * (1 - y[1]^2) * y[2] - y[1] |
| 183 | + ] |
| 184 | + |
| 185 | + ODESystem(se2eqs, t, name = :se2) |
| 186 | +end |
| 187 | + |
| 188 | +se2prob = ODEProblem{false}(se2sys, [y[1] => 2.0, y[2] => 0.0], (0, 1.0), dt = 1e-3, cse = true) |
| 189 | + |
| 190 | +se3sys = let |
| 191 | + se3eqs = [D(y[1]) ~ -(55 + y[3]) * y[1] + 65 * y[2], |
| 192 | + D(y[2]) ~ 0.0785 * (y[1] - y[2]), |
| 193 | + D(y[3]) ~ 0.1 * y[1] |
| 194 | + ] |
| 195 | + |
| 196 | + ODESystem(se3eqs, t, name = :se3) |
| 197 | +end |
| 198 | + |
| 199 | +se3prob = ODEProblem{false}(se3sys, [y[1:2] .=> 1.0; y[3] => 0.0], (0, 500.0), dt = 0.02, cse = true) |
| 200 | + |
| 201 | +se4sys = let y = y |
| 202 | + y = y[1:4] |
| 203 | + U = ones(4, 4) |
| 204 | + U[diagind(U)] .= -1 |
| 205 | + U ./= 2 |
| 206 | + Z = U * y |
| 207 | + G = U' * [(Z[1]^2 - Z[2]^2) / 2, Z[1] * Z[2], Z[3]^2, Z[4]^2] |
| 208 | + A = [-10 -10 0 0; 10 -10 0 0; 0 0 1000 0; 0 0 0 0.01] |
| 209 | + se4eqs = D.(y) .~ -(U' * A * Z) + G |
| 210 | + |
| 211 | + ODESystem(se4eqs, t, name = :se4) |
| 212 | +end |
| 213 | + |
| 214 | +se4prob = ODEProblem{false}(se4sys, [y[1] => 0.0; y[2] => -2.0; y[3:4] .=> -1.0], (0, 1000.0), dt = 1e-3, cse = true) |
| 215 | + |
| 216 | +se5sys = let |
| 217 | + se5eqs = [ |
| 218 | + D(y[1]) ~ -7.89e-10 * y[1] - 1.1e7 * y[1] * y[3], |
| 219 | + D(y[2]) ~ 7.89e-10 * y[1] - 1.13e9 * y[2] * y[3], |
| 220 | + D(y[3]) ~ 7.89e-10 * y[1] - 1.1e7 * y[1] * y[3] + 1.13e3 * y[4] - 1.13e9 * y[2] * y[3], |
| 221 | + D(y[4]) ~ 1.1e7 * y[1] * y[3] - 1.13e3 * y[4], |
| 222 | + ] |
| 223 | + |
| 224 | + ODESystem(se5eqs, t, name = :se5) |
| 225 | +end |
| 226 | + |
| 227 | +se5prob = ODEProblem{false}(se5sys, [y[1] => 1.76e-3; y[2:4] .=> 0.0], (0, 1000.0), dt = 1e-3, cse = true) |
| 228 | + |
| 229 | +sf1sys = let |
| 230 | + k = exp(20.7 - 1500 / y[1]) |
| 231 | + sf1eqs = [ |
| 232 | + D(y[1]) ~ 1.3 * (y[3] - y[1]) + 10400 * k * y[2], |
| 233 | + D(y[2]) ~ 1880 * [y[4] - y[2] * (1 + k)], |
| 234 | + D(y[3]) ~ 1752 - 269 * y[3] + 267 * y[1], |
| 235 | + D(y[4]) ~ 0.1 + 320 * y[2] - 321 * y[4], |
| 236 | + ] |
| 237 | + |
| 238 | + ODESystem(sf1eqs, t, name = :sf1) |
| 239 | +end |
| 240 | + |
| 241 | +sf1prob = ODEProblem{false}(sf1sys, [y[1] => 761.0; y[2] => 0.0; y[3] => 600.0; y[4] => 0.1], (0, 1000.0), dt = 1e-4, cse = true) |
| 242 | + |
| 243 | +sf2sys = let |
| 244 | + sf2eqs = [ |
| 245 | + D(y[1]) ~ -y[1] - y[1] * y[2] + 294 * y[2], |
| 246 | + D(y[2]) ~ y[1] * (1 - y[2]) / 98 - 3 * y[2] |
| 247 | + ] |
| 248 | + |
| 249 | + ODESystem(sf2eqs, t, name = :sf2) |
| 250 | +end |
| 251 | + |
| 252 | +sf2prob = ODEProblem{false}(sf2sys, [y[1] => 1.0; y[2] => 0.0], (0, 240.0), dt = 1e-2, cse = true) |
| 253 | + |
| 254 | +sf3sys = let |
| 255 | + sf3eqs = [ |
| 256 | + D(y[1]) ~ -1e7 * y[2] * y[1] + 10 * y[3], |
| 257 | + D(y[2]) ~ -1e7 * y[2] * y[1] - 1e7 * y[2] * y[5] + 10 * y[3] + 10 * y[4], |
| 258 | + D(y[3]) ~ 1e7 * y[2] * y[1] - 1.001e4 * y[3] + 1e-3 * y[4], |
| 259 | + D(y[4]) ~ 1e4 * y[3] - 10.001 * y[4] + 1e7 * y[2] * y[5], |
| 260 | + D(y[5]) ~ 10 * y[4] - 1e7 * y[2] * y[5], |
| 261 | + ] |
| 262 | + |
| 263 | + ODESystem(sf3eqs, t, name = :sf3) |
| 264 | +end |
| 265 | + |
| 266 | +sf3prob = ODEProblem{false}(sf3sys, [y[1] => 4e-6; y[2] => 1e-6; y[3:5] .=> 0.0], (0, 100.0), dt = 1e-6, cse = true) |
| 267 | + |
| 268 | +sf4sys = let |
| 269 | + sf4eqs = [ |
| 270 | + D(y[1]) ~ 77.27 * (y[2] - y[1] * y[2] + y[1] - 8.375e-6 * y[1]^2), |
| 271 | + D(y[2]) ~ (-y[2] - y[1] * y[2] + y[3]) / 77.27, |
| 272 | + D(y[3]) ~ 0.161 * (y[1] - y[3]), |
| 273 | + ] |
| 274 | + |
| 275 | + ODESystem(sf4eqs, t, name = :sf4) |
| 276 | +end |
| 277 | + |
| 278 | +sf4prob = ODEProblem{false}(sf4sys, [y[1] => 4.0; y[2] => 1.1; y[3] => 4.0], (0, 300.0), dt = 1e-3, cse = true) |
| 279 | + |
| 280 | +sf5sys = let |
| 281 | + sf5eqs = [ |
| 282 | + D(y[1]) ~ 1e11 * (-3 * y[1] * y[2] + 0.0012 * y[4] - 9 * y[1] * y[3]), |
| 283 | + D(y[2]) ~ -3e11 * y[1] * y[2] + 2e7 * y[4], |
| 284 | + D(y[3]) ~ 1e11 * (-9 * y[1] * y[3] + 0.001 * y[4]), |
| 285 | + D(y[4]) ~ 1e11 * (3 * y[1] * y[2] - 0.0012 * y[4] + 9 * y[1] * y[3]), |
| 286 | + ] |
| 287 | + |
| 288 | + ODESystem(sf5eqs, t, name = :sf5) |
| 289 | +end |
| 290 | + |
| 291 | +sf5prob = ODEProblem{false}(sf5sys, [y[1] => 3.365e-7; y[2] => 8.261e-3; y[3] => 1.642e-3; y[4] => 9.38e-6], (0, 100.0), dt = 1e-7, cse = true) |
| 292 | + |
| 293 | +# Non-stiff |
| 294 | +na1sys = let y = y[1] |
| 295 | + na1eqs = D(y) ~ -y |
| 296 | + |
| 297 | + ODESystem(na1eqs, t, name = :na1) |
| 298 | +end |
| 299 | + |
| 300 | +na1prob = ODEProblem{false}(na1sys, [y[1] => 1], (0, 20.0), cse = true) |
| 301 | + |
| 302 | +na2sys = let y = y[1] |
| 303 | + na2eqs = D(y) ~ -y^3/2 |
| 304 | + |
| 305 | + ODESystem(na2eqs, t, name = :na2) |
| 306 | +end |
| 307 | + |
| 308 | +na2prob = ODEProblem{false}(na2sys, [y[1] => 1], (0, 20.0), cse = true) |
| 309 | + |
| 310 | +na3sys = let y = y[1] |
| 311 | + na3eqs = D(y) ~ y * cos(t) |
| 312 | + |
| 313 | + ODESystem(na3eqs, t, name = :na3) |
| 314 | +end |
| 315 | + |
| 316 | +na3prob = ODEProblem{false}(na3sys, [y[1] => 1], (0, 20.0), cse = true) |
| 317 | + |
| 318 | +na4sys = let y = y[1] |
| 319 | + na4eqs = D(y) ~ y/4 * (1 - y/20) |
| 320 | + |
| 321 | + ODESystem(na4eqs, t, name = :na4) |
| 322 | +end |
| 323 | + |
| 324 | +na4prob = ODEProblem{false}(na4sys, [y[1] => 1], (0, 20.0), cse = true) |
| 325 | + |
| 326 | +na5sys = let y = y[1] |
| 327 | + na5eqs = D(y) ~ (y - t) / (y + t) |
| 328 | + |
| 329 | + ODESystem(na5eqs, t, name = :na5) |
| 330 | +end |
| 331 | + |
| 332 | +na5prob = ODEProblem{false}(na5sys, [y[1] => 4], (0, 20.0), cse = true) |
| 333 | + |
| 334 | +nb1sys = let |
| 335 | + nb1eqs = [ |
| 336 | + D(y[1]) ~ 2 * (y[1] - y[1] * y[2]), |
| 337 | + D(y[2]) ~ -(y[2] - y[1] * y[2]), |
| 338 | + ] |
| 339 | + |
| 340 | + ODESystem(nb1eqs, t, name = :nb1) |
| 341 | +end |
| 342 | + |
| 343 | +nb1prob = ODEProblem{false}(nb1sys, [y[1] => 1.0, y[2] => 3], (0, 20.0), cse = true) |
| 344 | + |
| 345 | +nb2sys = let |
| 346 | + nb2eqs = [ |
| 347 | + D(y[1]) ~ -y[1] + y[2], |
| 348 | + D(y[2]) ~ y[1] - 2y[2] + y[3], |
| 349 | + D(y[3]) ~ y[2] - y[3], |
| 350 | + ] |
| 351 | + |
| 352 | + ODESystem(nb2eqs, t, name = :nb2) |
| 353 | +end |
| 354 | + |
| 355 | +nb2prob = ODEProblem{false}(nb2sys, [y[1] => 2.0, y[2] => 0.0, y[3] => 1.0], (0, 20.0), cse = true) |
| 356 | + |
| 357 | +nb3sys = let |
| 358 | + nb3eqs = [ |
| 359 | + D(y[1]) ~ -y[1], |
| 360 | + D(y[2]) ~ y[1] - y[2]^2, |
| 361 | + D(y[3]) ~ y[2]^2, |
| 362 | + ] |
| 363 | + |
| 364 | + ODESystem(nb3eqs, t, name = :nb3) |
| 365 | +end |
| 366 | + |
| 367 | +nb3prob = ODEProblem{false}(nb3sys, [y[1] => 1.0; y[2:3] .=> 0.0], (0, 20.0), cse = true) |
| 368 | + |
| 369 | +nb4sys = let |
| 370 | + r = sqrt(y[1]^2 + y[2]^2) |
| 371 | + nb4eqs = [ |
| 372 | + D(y[1]) ~ -y[2] - (y[1] * y[3]) / r, |
| 373 | + D(y[2]) ~ y[1] - (y[2] * y[3]) / r, |
| 374 | + D(y[3]) ~ y[1] / r, |
| 375 | + ] |
| 376 | + |
| 377 | + ODESystem(nb4eqs, t, name = :nb4) |
| 378 | +end |
| 379 | + |
| 380 | +nb4prob = ODEProblem{false}(nb4sys, [y[1] => 3.0; y[2:3] .=> 0.0], (0, 20.0), cse = true) |
| 381 | + |
| 382 | +nb5sys = let |
| 383 | + nb5eqs = [ |
| 384 | + D(y[1]) ~ y[2] * y[3], |
| 385 | + D(y[2]) ~ -y[1] * y[3], |
| 386 | + D(y[3]) ~ -0.51 * y[1] * y[2], |
| 387 | + ] |
| 388 | + |
| 389 | + ODESystem(nb5eqs, t, name = :nb5) |
| 390 | +end |
| 391 | + |
| 392 | +nb5prob = ODEProblem{false}(nb5sys, [y[1] => 0.0; y[2:3] .=> 1.0], (0, 20.0), cse = true) |
| 393 | + |
| 394 | +nc1sys = let y = y |
| 395 | + n = 10 |
| 396 | + y = y[1:n] |
| 397 | + A = Bidiagonal(fill(-1, n), fill(1, n-1), :L) |
| 398 | + nc1eqs = D.(y) .~ A * y |
| 399 | + ODESystem(nc1eqs, t, name = :nc1) |
| 400 | +end |
| 401 | + |
| 402 | +nc1prob = ODEProblem{false}(nc1sys, [y[1] => 1.0; y[2:10] .=> 0.0], (0, 20.0), cse = true) |
| 403 | + |
| 404 | +nc2sys = let y = y |
| 405 | + n = 10 |
| 406 | + y = y[1:n] |
| 407 | + A = Bidiagonal([-1:-1:-n+1; 0], collect(1:n-1), :L) |
| 408 | + nc2eqs = D.(y) .~ A * y |
| 409 | + ODESystem(nc2eqs, t, name = :nc2) |
| 410 | +end |
| 411 | + |
| 412 | +nc2prob = ODEProblem{false}(nc2sys, [y[1] => 1.0; y[2:10] .=> 0.0], (0, 20.0), cse = true) |
| 413 | + |
| 414 | +nc3sys = let y = y |
| 415 | + n = 10 |
| 416 | + y = y[1:n] |
| 417 | + A = SymTridiagonal(fill(-2, n), fill(1, n - 1)) |
| 418 | + nc3eqs = D.(y) .~ A * y |
| 419 | + ODESystem(nc3eqs, t, name = :nc3) |
| 420 | +end |
| 421 | + |
| 422 | +nc3prob = ODEProblem{false}(nc3sys, [y[1] => 1.0; y[2:10] .=> 0.0], (0, 20.0), cse = true) |
| 423 | + |
| 424 | +@variables y(t)[1:51] |
| 425 | +y = collect(y) |
| 426 | +nc4sys = let y = y |
| 427 | + n = 51 |
| 428 | + y = y[1:n] |
| 429 | + A = SymTridiagonal(fill(-2, n), fill(1, n - 1)) |
| 430 | + nc4eqs = D.(y) .~ A * y |
| 431 | + ODESystem(nc4eqs, t, name = :nc4) |
| 432 | +end |
| 433 | + |
| 434 | +nc4prob = ODEProblem{false}(nc4sys, [y[1] => 1.0; y[2:51] .=> 0.0], (0, 20.0), cse = true) |
| 435 | + |
| 436 | +@variables y(t)[1:3, 1:5] |
| 437 | +y = collect(y) |
| 438 | +nc5sys = let |
| 439 | + k_2 = 2.95912208286 |
| 440 | + m_0 = 1.00000597682 |
| 441 | + ms = [0.000954786104043 |
| 442 | + 0.000285583733151 |
| 443 | + 0.0000437273164546 |
| 444 | + 0.0000517759138449 |
| 445 | + 0.00000277777777778] |
| 446 | + |
| 447 | + r = [sum(i->y[i, j]^2, 1:3) for j in 1:5] |
| 448 | + d = [sqrt(sum(i->(y[i, k] - y[i, j])^2, 1:3)) for k in 1:5, j in 1:5] |
| 449 | + ssum(i, j) = sum(1:5) do k |
| 450 | + k == j && return 0 |
| 451 | + ms[k] * (y[i, k] - y[i, j]) / d[j, k]^3 |
| 452 | + end |
| 453 | + nc5eqs = [D(D(y[i, j])) .~ k_2 * (-(m_0 + ms[j]) * y[i, j])/r[j]^3 + ssum(i, j) for i in 1:3, j in 1:5] |
| 454 | + structural_simplify(ODESystem(nc5eqs, t, name = :nc5)) |
| 455 | +end |
| 456 | + |
| 457 | +ys = [3.42947415189, 3.35386959711, 1.35494901715, |
| 458 | + 6.64145542550, 5.97156957878, 2.18231499728, |
| 459 | + 11.2630437207, 14.6952576794, 6.27960525067, |
| 460 | + -30.1552268759, 1.65699966404, 1.43785752721, |
| 461 | + -21.1238353380, 28.4465098142, 15.3882659679,] |
| 462 | +ys′ = [-0.557160570446, 0.505696783289, 0.230578543901, |
| 463 | + -0.415570776342, 0.365682722812, 0.169143213293, |
| 464 | + -0.325325669158, 0.189706021964, 0.087726532278, |
| 465 | + -0.0240476254170, -0.287659532608, -0.117219543175, |
| 466 | + -0.176860753121, -0.216393453025, -0.0148647893090,] |
| 467 | +y0 = y .=> reshape(ys, 3, 5) |
| 468 | +y0′ = D.(y) .=> reshape(ys′, 3, 5) |
| 469 | +nc5prob = ODEProblem{false}(nc5sys, [y0; y0′], (0, 20.0), cse = true) |
0 commit comments