|
795 | 795 | defs = Dict(s1.dx => 0.0, D(s1.x) => s1.x, s1.x => 0.0)
|
796 | 796 | @test isequal(ModelingToolkit.defaults(s2), defs)
|
797 | 797 | end
|
| 798 | + |
| 799 | +# https://github.com/SciML/ModelingToolkit.jl/issues/1705 |
| 800 | +let |
| 801 | + x0 = 0.0 |
| 802 | + v0 = 1.0 |
| 803 | + |
| 804 | + kx = -1.0 |
| 805 | + kv = -1.0 |
| 806 | + |
| 807 | + tf = 10.0 |
| 808 | + |
| 809 | + ## controller |
| 810 | + |
| 811 | + function pd_ctrl(; name) |
| 812 | + @parameters kx kv |
| 813 | + @variables t u(t) x(t) v(t) |
| 814 | + |
| 815 | + eqs = [u ~ kx * x + kv * v] |
| 816 | + ODESystem(eqs; name) |
| 817 | + end |
| 818 | + |
| 819 | + @named ctrl = pd_ctrl() |
| 820 | + |
| 821 | + ## double integrator |
| 822 | + |
| 823 | + function double_int(; name) |
| 824 | + @variables t u(t) x(t) v(t) |
| 825 | + D = Differential(t) |
| 826 | + |
| 827 | + eqs = [D(x) ~ v, D(v) ~ u] |
| 828 | + ODESystem(eqs; name) |
| 829 | + end |
| 830 | + |
| 831 | + @named sys = double_int() |
| 832 | + |
| 833 | + ## connections |
| 834 | + |
| 835 | + connections = [sys.u ~ ctrl.u, ctrl.x ~ sys.x, ctrl.v ~ sys.v] |
| 836 | + |
| 837 | + @named connected = ODESystem(connections) |
| 838 | + @named sys_con = compose(connected, sys, ctrl) |
| 839 | + |
| 840 | + sys_alias = alias_elimination(sys_con) |
| 841 | + D = Differential(t) |
| 842 | + true_eqs = [0 ~ sys.v - D(sys.x) |
| 843 | + 0 ~ ctrl.kv * D(sys.x) + ctrl.kx * sys.x - D(sys.v)] |
| 844 | + @test isequal(full_equations(sys_alias), true_eqs) |
| 845 | + true_obs = [ctrl.x ~ sys.x |
| 846 | + sys.u ~ D(sys.v) |
| 847 | + ctrl.u ~ D(sys.v) |
| 848 | + ctrl.v ~ D(sys.x)] |
| 849 | + @test isequal(observed(sys_alias), true_obs) |
| 850 | + |
| 851 | + sys_simp = structural_simplify(sys_con) |
| 852 | + D = Differential(t) |
| 853 | + true_eqs = [D(sys.v) ~ ctrl.kv * sys.v + ctrl.kx * sys.x |
| 854 | + D(sys.x) ~ sys.v] |
| 855 | + @test isequal(full_equations(sys_simp), true_eqs) |
| 856 | + true_obs = [ctrl.x ~ sys.x |
| 857 | + sys.u ~ D(sys.v) |
| 858 | + ctrl.v ~ sys.v |
| 859 | + ctrl.u ~ ctrl.kv * ctrl.v + ctrl.kx * sys.x] |
| 860 | + @test isequal(observed(sys_simp), true_obs) |
| 861 | +end |
0 commit comments