Skip to content

Commit 012531a

Browse files
authored
Merge pull request #729 from JuliaControl/mut
Better handling of heterogeneous types in feedback
2 parents ab39ab3 + 0eb1db1 commit 012531a

File tree

1 file changed

+11
-10
lines changed

1 file changed

+11
-10
lines changed

src/connections.jl

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,7 @@ function feedback(sys1::AbstractStateSpace, sys2::AbstractStateSpace;
313313
Wperm=:, Zperm=:, pos_feedback::Bool=false)
314314

315315
timeevol = common_timeevol(sys1,sys2)
316+
T = Base.promote_type(numeric_type(sys1), numeric_type(sys2))
316317

317318
if !(isa(Y1, Colon) || allunique(Y1)); @warn "Connecting single output to multiple inputs Y1=$Y1"; end
318319
if !(isa(Y2, Colon) || allunique(Y2)); @warn "Connecting single output to multiple inputs Y2=$Y2"; end
@@ -359,14 +360,14 @@ function feedback(sys1::AbstractStateSpace, sys2::AbstractStateSpace;
359360

360361
if iszero(s1_D22) || iszero(s2_D22)
361362
αs1_D12 = α*s1_D12
362-
A11 = mul!(Base.copymutable(sys1.A), s1_B2, s2_D22s1_C2, α, 1)
363-
A22 = mul!(Base.copymutable(sys2.A), αs2_B2, s1_D22s2_C2, 1, 1)
364-
C11 = mul!(mutable(s1_C1), αs1_D12, s2_D22s1_C2, 1, 1)
365-
C22 = mul!(mutable(s2_C1), αs2_D12, s1_D22s2_C2, 1, 1)
366-
B11 = mul!(mutable(s1_B1), s1_B2, s2_D22*s1_D21, α, 1)
367-
B22 = mul!(mutable(s2_B1), αs2_B2, s1_D22s2_D21, 1, 1)
368-
D22 = mul!(mutable(s2_D11), αs2_D12, s1_D22s2_D21, 1, 1)
369-
D11 = mul!(mutable(s1_D11), αs1_D12, s2_D22*s1_D21, 1, 1)
363+
A11 = mul!(mutable(copy(sys1.A), T), s1_B2, s2_D22s1_C2, α, 1)
364+
A22 = mul!(mutable(copy(sys2.A), T), αs2_B2, s1_D22s2_C2, 1, 1)
365+
C11 = mul!(mutable(s1_C1, T), αs1_D12, s2_D22s1_C2, 1, 1)
366+
C22 = mul!(mutable(s2_C1, T), αs2_D12, s1_D22s2_C2, 1, 1)
367+
B11 = mul!(mutable(s1_B1, T), s1_B2, s2_D22*s1_D21, α, 1)
368+
B22 = mul!(mutable(s2_B1, T), αs2_B2, s1_D22s2_D21, 1, 1)
369+
D22 = mul!(mutable(s2_D11, T), αs2_D12, s1_D22s2_D21, 1, 1)
370+
D11 = mul!(mutable(s1_D11, T), αs1_D12, s2_D22*s1_D21, 1, 1)
370371
A = [A11 ((s1_B2*s2_C2) .*= α);
371372
s2_B2*s1_C2 A22]
372373

@@ -410,8 +411,8 @@ function feedback(sys1::AbstractStateSpace, sys2::AbstractStateSpace;
410411
return StateSpace(A, B[:, Wperm], C[Zperm,:], D[Zperm, Wperm], timeevol)
411412
end
412413

413-
mutable(x::AbstractArray) = x
414-
mutable(x::StaticArray) = Base.copymutable(x)
414+
mutable(x::AbstractArray, ::Type{T}) where T = convert(Matrix{T}, x)
415+
mutable(x::StaticArray, ::Type{T}) where T = Matrix{T}(x)
415416

416417

417418
"""

0 commit comments

Comments
 (0)