極配置問題の関数について、以下のリンクでもpython control.place
とmatlabの違いについて示されています。
https://github.com/python-control/python-control/issues/117
設計された固有値を見ると
scilab--
--> [Ke]=ppol(Abb',Aab',L)'
Ke =
14.4 0.6
0. 15.7
--> spec(Abb-Ke*Aab)
ans =
-16. + 0.i
-15. + 0.i
で意図した極配置にはなっています。
ちなみにmatlabの結果で計算すると
--> Kee=Ke+[0 0;0.3 0] :matlabの結果を作成
Kee =
14.4 0.6
0.3 15.7
--> spec(Abb-Kee*Aab)
ans =
-16.
-15.
と実数での固有値となります。
これらの違いはアルゴリズムの違いとしてしか説明できませんので 上記LINKではcontrol.placeではないものを推奨しています。
では、pythonでもう一度やってみます。
import sys
sys.path.append('/Users/muranokenichi/opt/anaconda3/lib/python3.8/site-packages')
from control.matlab import *
import matplotlib.pyplot as plt
import numpy as np
import scipy as sc
from scipy import linalg
def hermitian(arr):
return np.conjugate(arr.T)
A=np.array([[0,0,1,0],[0,0,0,1],[-36,36,-0.6,0.6],[18,-18,0.3,-0.3]])
B=np.array([[0],[0],[1],[0]])
J=np.array([-2+2j*np.sqrt(3),-2-2j*np.sqrt(3),-10,-10])
K=acker(A,B,J)
print(K)
Aab=hermitian(np.array([[1,0],[0,1]]))
Abb=hermitian(np.array([[-0.6,0.6],[0.3,-0.3]]))
L=np.array([-15,-16])
Ke=hermitian(place(Abb,Aab,L))
print(Ke)
eigen_val, eigen_vec = np.linalg.eig(Abb-Ke*Aab)
print('eigen control place ',eigen_val)
Keeg=sc.signal.place_poles(Abb,Aab,L)
Kee=hermitian(Keeg.gain_matrix)
print(Kee)
print('eigen scipy',Keeg.computed_poles)
eigen_val, eigen_vec = np.linalg.eig(Abb-Kee*Aab)
print('eigen scipy pole func',eigen_val)
結果は
[[130.44444444 -41.55555556 23.1 15.41851852]] [[15.4 0.6] [ 0.3 14.7]] eigen control place [-15.9 -15.1] [[15.4 0.6] [ 0.3 14.7]] ← controlと同じ結果 eigen scipy [-16. -15.]← 固有値が違う eigen scipy pole func [-16.15574385 -14.84425615]←これも違うありゃー 精度悪い結果 (注:使い方には自信がありません)これはpython信用ならないか!!! ちょっと考えます未熟なのが悪いのか うーん どうしようご指摘あれば教えてください
※コメント投稿者のブログIDはブログ作成者のみに通知されます