@@ -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
100101end
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)
145147end
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)
174177end
175178
0 commit comments