Skip to content

Commit 2959df8

Browse files
committed
Working towards #84 and #85
Also changed the check for matrix singularity
1 parent 217ccf6 commit 2959df8

File tree

1 file changed

+12
-9
lines changed

1 file changed

+12
-9
lines changed

control/statesp.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555
dot, empty, exp, eye, matrix, ones, pi, poly, poly1d, roots, shape, sin, \
5656
zeros, squeeze
5757
from numpy.random import rand, randn
58-
from numpy.linalg import inv, det, solve
58+
from numpy.linalg import solve, eigvals, matrix_rank
5959
from numpy.linalg.linalg import LinAlgError
6060
from scipy.signal import lti, cont2discrete
6161
# from exceptions import Exception
@@ -405,7 +405,7 @@ def freqresp(self, omega):
405405
def pole(self):
406406
"""Compute the poles of a state space system."""
407407

408-
return roots(poly(self.A))
408+
return eigvals(self.A)
409409

410410
def zero(self):
411411
"""Compute the zeros of a state space system."""
@@ -452,21 +452,24 @@ def feedback(self, other=1, sign=-1):
452452
D2 = other.D
453453

454454
F = eye(self.inputs) - sign * D2 * D1
455-
if abs(det(F)) < 1.e-6:
455+
if matrix_rank(F) != self.inputs:
456456
raise ValueError("I - sign * D2 * D1 is singular.")
457457

458-
E = inv(F)
459-
T1 = eye(self.outputs) + sign * D1 * E * D2
460-
T2 = eye(self.inputs) + sign * E * D2 * D1
458+
# Precompute F\D2 and F\C2 (E = inv(F))
459+
E_D2 = solve(F, D2)
460+
E_C2 = solve(F, C2)
461+
462+
T1 = eye(self.outputs) + sign * D1 * E_D2
463+
T2 = eye(self.inputs) + sign * E_D2 * D1
461464

462465
A = concatenate(
463466
(concatenate(
464-
(A1 + sign * B1 * E * D2 * C1, sign * B1 * E * C2), axis=1),
467+
(A1 + sign * B1 * E_D2 * C1, sign * B1 * E_C2), axis=1),
465468
concatenate(
466-
(B2 * T1 * C1, A2 + sign * B2 * D1 * E * C2), axis=1)),
469+
(B2 * T1 * C1, A2 + sign * B2 * D1 * E_C2), axis=1)),
467470
axis=0)
468471
B = concatenate((B1 * T2, B2 * D1 * T2), axis=0)
469-
C = concatenate((T1 * C1, sign * D1 * E * C2), axis=1)
472+
C = concatenate((T1 * C1, sign * D1 * E_C2), axis=1)
470473
D = D1 * T2
471474

472475
return StateSpace(A, B, C, D, dt)

0 commit comments

Comments
 (0)