Skip to content

Commit 9293132

Browse files
committed
inverse scaling
1 parent dbce83a commit 9293132

File tree

1 file changed

+12
-9
lines changed

1 file changed

+12
-9
lines changed

src/descriptor.jl

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,12 @@ function baltrunc2(sys::LTISystem; residual=false, n=missing, scaleY=1.0, scaleU
9191
# Apply scaling if needed
9292
Ts = isdiscrete(sys) ? sys.Ts : 0
9393
A, B, C, D = ssdata(sys)
94-
sys_scaled = ss(A, B*scaleU, scaleY*C, scaleY*D*scaleU, Ts)
94+
# Divide by scaling factors to normalize to ~[-1,1]
95+
sys_scaled = ss(A, B / scaleU, C / scaleY, scaleY \ D / scaleU, Ts)
9596
sysr, hs = DescriptorSystems.gbalmr(dss(sys_scaled); matchdc=residual, ord=n, kwargs...)
96-
# Inverse scaling after reduction
97+
# Multiply by scaling factors to restore original units
9798
Ar, Br, Cr, Dr = ssdata(ss(sysr))
98-
sys_final = ss(Ar, Br/scaleU, Cr/scaleY, Dr/(scaleY*scaleU), Ts)
99+
sys_final = ss(Ar, Br * scaleU, scaleY * Cr, scaleY * Dr * scaleU, Ts)
99100
sys_final, hs
100101
end
101102

@@ -116,7 +117,8 @@ function baltrunc_coprime(sys, info=nothing; residual=false, n=missing, factoriz
116117
# Apply scaling if needed
117118
Ts = isdiscrete(sys) ? sys.Ts : 0
118119
A, B, C, D = ssdata(sys)
119-
sys_scaled = ss(A, B*scaleU, scaleY*C, scaleY*D*scaleU, Ts)
120+
# Divide by scaling factors to normalize to ~[-1,1]
121+
sys_scaled = ss(A, B / scaleU, scaleY \ C, scaleY \ D / scaleU, Ts)
120122
if info !== nothing && hasproperty(info, :NM)
121123
@unpack N, M, NM = info
122124
else
@@ -139,8 +141,8 @@ function baltrunc_coprime(sys, info=nothing; residual=false, n=missing, factoriz
139141
Br = BN - BM * (DMi * DN)
140142
Dr = (DMi * DN)
141143

142-
# Inverse scaling after reduction
143-
sys_final = ss(Ar, Br/scaleU, Cr/scaleY, Dr/(scaleY*scaleU), Ts)
144+
# Multiply by scaling factors to restore original units
145+
sys_final = ss(Ar, Br * scaleU, scaleY * Cr, scaleY * Dr * scaleU, Ts)
144146
sys_final, hs, (; NM, N, M, NMr)
145147
end
146148

@@ -156,7 +158,8 @@ function baltrunc_unstab(sys::LTISystem, info=nothing; residual=false, n=missing
156158
# Apply scaling if needed
157159
Ts = isdiscrete(sys) ? sys.Ts : 0
158160
A, B, C, D = ssdata(sys)
159-
sys_scaled = ss(A, B*scaleU, scaleY*C, scaleY*D*scaleU, Ts)
161+
# Divide by scaling factors to normalize to ~[-1,1]
162+
sys_scaled = ss(A, B / scaleU, scaleY \ C, scaleY \ D / scaleU, Ts)
160163
if info !== nothing && hasproperty(info, :stab)
161164
@unpack stab, unstab = info
162165
else
@@ -167,9 +170,9 @@ function baltrunc_unstab(sys::LTISystem, info=nothing; residual=false, n=missing
167170
error("The model contains $(nx_unstab) poles outside the stability region, the reduced-order model must be of at least this order.")
168171
end
169172
sysr, hs = DescriptorSystems.gbalmr(stab; matchdc=residual, ord=n-nx_unstab, kwargs...)
170-
# Inverse scaling after reduction
173+
# Multiply by scaling factors to restore original units
171174
Ar, Br, Cr, Dr = ssdata(ss(sysr + unstab))
172-
sys_final = ss(Ar, Br/scaleU, Cr/scaleY, Dr/(scaleY*scaleU), Ts)
175+
sys_final = ss(Ar, Br * scaleU, scaleY * Cr, scaleY * Dr * scaleU, Ts)
173176
sys_final, hs, (; stab, unstab)
174177
end
175178

0 commit comments

Comments
 (0)