技術士(総合技術監理・機械部門)のブログ

技術士がお届けする,技術,工学,技術者倫理などの話題

pythonで制御系設計(1’’’)精度がどうか?なんかいやな予感

2021-08-15 11:19:35 | 工学

極配置問題の関数について、以下のリンクでも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信用ならないか!!! ちょっと考えます未熟なのが悪いのか うーん どうしようご指摘あれば教えてください

 

 

 



最新の画像もっと見る

コメントを投稿