@@ -1779,7 +1779,13 @@ function linearization_function(sys::AbstractSystem, inputs,
1779
1779
else
1780
1780
p = todict (p)
1781
1781
end
1782
- p[get_iv (sys)] = 0.0
1782
+ x0 = merge (defaults_and_guesses (sys), op)
1783
+ if has_index_cache (sys) && get_index_cache (sys) != = nothing
1784
+ sys_ps = MTKParameters (sys, p, x0)
1785
+ else
1786
+ sys_ps = varmap_to_vars (p, parameters (sys); defaults = x0)
1787
+ end
1788
+ p[get_iv (sys)] = NaN
1783
1789
if has_index_cache (initsys) && get_index_cache (initsys) != = nothing
1784
1790
oldps = MTKParameters (initsys, p, merge (guesses (sys), defaults (sys), op))
1785
1791
initsys_ps = parameters (initsys)
@@ -1812,19 +1818,19 @@ function linearization_function(sys::AbstractSystem, inputs,
1812
1818
function (u, p, t)
1813
1819
state = ProblemState (; u, p, t)
1814
1820
if tunable_getter != = nothing
1815
- oldps = SciMLStructures. replace! (
1821
+ SciMLStructures. replace! (
1816
1822
SciMLStructures. Tunable (), oldps, tunable_getter (state))
1817
1823
end
1818
1824
if disc_getter != = nothing
1819
- oldps = SciMLStructures. replace! (
1825
+ SciMLStructures. replace! (
1820
1826
SciMLStructures. Discrete (), oldps, disc_getter (state))
1821
1827
end
1822
1828
if const_getter != = nothing
1823
- oldps = SciMLStructures. replace! (
1829
+ SciMLStructures. replace! (
1824
1830
SciMLStructures. Constants (), oldps, const_getter (state))
1825
1831
end
1826
1832
if nonnum_getter != = nothing
1827
- oldps = SciMLStructures. replace! (
1833
+ SciMLStructures. replace! (
1828
1834
NONNUMERIC_PORTION, oldps, nonnum_getter (state))
1829
1835
end
1830
1836
newu = u_getter (state)
@@ -1843,7 +1849,7 @@ function linearization_function(sys::AbstractSystem, inputs,
1843
1849
end
1844
1850
initfn = NonlinearFunction (initsys)
1845
1851
initprobmap = getu (initsys, unknowns (sys))
1846
- ps = parameters (sys)
1852
+ ps = full_parameters (sys)
1847
1853
lin_fun = let diff_idxs = diff_idxs,
1848
1854
alge_idxs = alge_idxs,
1849
1855
input_idxs = input_idxs,
@@ -1854,9 +1860,20 @@ function linearization_function(sys::AbstractSystem, inputs,
1854
1860
initfn = initfn,
1855
1861
h = build_explicit_observed_function (sys, outputs),
1856
1862
chunk = ForwardDiff. Chunk (input_idxs),
1857
- initialize = initialize
1863
+ sys_ps = sys_ps,
1864
+ initialize = initialize,
1865
+ sys = sys
1858
1866
1859
1867
function (u, p, t)
1868
+ if ! isa (p, MTKParameters)
1869
+ p = todict (p)
1870
+ newps = deepcopy (sys_ps)
1871
+ for (k, v) in p
1872
+ setp (sys, k)(newps, v)
1873
+ end
1874
+ p = newps
1875
+ end
1876
+
1860
1877
if u != = nothing # Handle systems without unknowns
1861
1878
length (sts) == length (u) ||
1862
1879
error (" Number of unknown variables ($(length (sts)) ) does not match the number of input unknowns ($(length (u)) )" )
@@ -2137,17 +2154,16 @@ function linearize(sys, lin_fun; t = 0.0, op = Dict(), allow_input_derivatives =
2137
2154
u0, defs = get_u0 (sys, x0, p)
2138
2155
if has_index_cache (sys) && get_index_cache (sys) != = nothing
2139
2156
if p isa SciMLBase. NullParameters
2140
- p = op
2157
+ p = Dict ()
2141
2158
elseif p isa Dict
2142
2159
p = merge (p, op)
2143
2160
elseif p isa Vector && eltype (p) <: Pair
2144
2161
p = merge (Dict (p), op)
2145
2162
elseif p isa Vector
2146
2163
p = merge (Dict (parameters (sys) .=> p), op)
2147
2164
end
2148
- p2 = MTKParameters (sys, p, merge (Dict (unknowns (sys) .=> u0), x0, guesses (sys)))
2149
2165
end
2150
- linres = lin_fun (u0, p2 , t)
2166
+ linres = lin_fun (u0, p , t)
2151
2167
f_x, f_z, g_x, g_z, f_u, g_u, h_x, h_z, h_u = linres
2152
2168
2153
2169
nx, nu = size (f_u)
0 commit comments