<jupyter_start><jupyter_text>現代制御 Topics* システムの状態方程式表現* 状態遷移行列* 安定性* 可制御性* 可観測性* フィードバック* 最適レギュレータ* サーボ系* オブザーバ  システムの状態方程式表現状態，入力，出力ベクトルはそれぞれ, $x(t) \in R^n, u(t) \in R^m, y(t) \in R^r$ とし，定数行列$A \in R^{n\times n}, B \in R^{n\times m}, C \in R^{r\times n}$によって，次のような線形システムが表現される．$$\begin{array}{}\dot{x} &= Ax(t) + Bu(t) \\y &= Cx(t)\end{array}$$<jupyter_code>import numpy as np
class LinearSystem:
    def __init__(self, A, B, C):
        self.A = A
        self.B = B
        self.C = C
        
    def dot(self, x, u):
        return self.A*x + self.B*u
    
    def output(self, x):
        return self.C*x<jupyter_output><empty_output><jupyter_text>状態遷移行列行列指数関数$e^{At}$を状態遷移行列と呼ぶ．その定義は，$$e^{At} = I + At + \frac{1}{2!}A^2t^2 + \cdots + \frac{1}{k!}A^kt^k + \cdots$$となる．状態遷移行列を得る主な方法はラプラス逆変換によるものである．<jupyter_code>def StateTransitionMat(A, t, k=20):
    # Approximation method
    E = np.identity(A.shape[0]) # identity term
    a = np.identity(A.shape[0])
    for i in range(1,k+1):
        a = a*A*t/float(i)
        E += a
        
    return E

A = np.array([[1,0],[0,1]])
print(StateTransitionMat(A, 0.01, 1))
print(StateTransitionMat(A, 0.01, 10))
print(StateTransitionMat(A, 0.01, 100))
print(StateTransitionMat(A, 0.01, 1000))
       
print(StateTransitionMat(A, 0.1, 1000))
print(StateTransitionMat(A, 1.0, 1000))
print(StateTransitionMat(A, 10., 10))
print(StateTransitionMat(A, 10., 100))
print(StateTransitionMat(A, 10., 1000))<jupyter_output>[[ 1.01  0.  ]
 [ 0.    1.01]]
[[ 1.01005017  0.        ]
 [ 0.          1.01005017]]
[[ 1.01005017  0.        ]
 [ 0.          1.01005017]]
[[ 1.01005017  0.        ]
 [ 0.          1.01005017]]
[[ 1.10517092  0.        ]
 [ 0.          1.10517092]]
[[ 2.71828183  0.        ]
 [ 0.          2.71828183]]
[[ 12842.30511464      0.        ]
 [     0.          12842.30511464]]
[[ 22026.46579481      0.        ]
 [     0.          22026.46579481]]
[[ 22026.46579481      0.        ]
 [     0.          22026.46579481]]<jupyter_text>安定性正方行列$A \in R^{n\times n}$の固有値$\lambda \in C$, 固有ベクトル$v \in R^n$は以下の式を満たす．$$Av_i = \lambda_i, i = 1, 2, \cdots, n$$固有値$\lambda_i$の実部が全て負であるとき，そのシステムは安定である．<jupyter_code># 固有値・固有ベクトル計算
import numpy.linalg as LA

A = np.array([[1, 2], [3, 4]])
values, vectors = LA.eig(A)

print(values)
print(vectors) 

# Aの固有値手計算すると，
e1 = (5 + np.sqrt(33))/2.
e2 = (5 - np.sqrt(33))/2.
v1 = np.array([1, (3+np.sqrt(33))/4.])
v1 /= LA.norm(v1)

v2 = np.array([1, (3-np.sqrt(33))/4.])
v2 /= LA.norm(v2)

print (e1)
print (e2)
print (v1)
print (v2)

# numpy.linalgの固有ベクトルは縦に並んでいる<jupyter_output>[-0.37228132  5.37228132]
[[-0.82456484 -0.41597356]
 [ 0.56576746 -0.90937671]]
5.37228132327
-0.372281323269
[ 0.41597356  0.90937671]
[ 0.82456484 -0.56576746]
StarcoderdataJupyterStructuredCleanDedup