質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

6798閲覧

python control での lsim の使い方

退会済みユーザー

退会済みユーザー

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/07/20 08:56

pid制御によるランダム信号の除去

python controlでpid制御のシミュレーションを行おうとしています。
系にステップ応答を入力した際に制御パラメータを色々と変え、過渡応答がどのようになるのかを確かめることはできました。

次に、入力としてランダムな信号を入れて、フィードバック制御により偏差をうまく減らせるか、を確かめたいのですが、どういうコードにすれば良いかが分かりません。

よろしくお願いします

発生している問題・エラーメッセージ

Parameter ``U``: Wrong shape (rows, columns): (881,). Expected: (300,) or (1, 300).

該当のソースコード

python

1 2import numpy as np 3from control.matlab import * 4import matplotlib.pyplot as plt 5import scipy 6import sympy as sp 7from scipy import signal 8 9#むだ時間 10num_delay, den_delay=pade(0.001,3) 11P_pade=tf(num_delay,den_delay) 12 13 14 15#ボード線図、伝達関数のグラフの体裁を整える 16def linestyle_generator(): 17 linestyle=['-', '--', '-.', ':'] 18 lineID=0 19 while True: 20 yield linestyle[lineID] 21 lineID=(lineID+1) % len(linestyle) 22 23def plot_set(fig_ax, *args): 24 fig_ax.set_xlabel(args[0]) 25 fig_ax.set_ylabel(args[1]) 26 fig_ax.grid(ls=':') 27 if len(args)==3: 28 fig_ax.legend(loc=args[2]) 29 30def bodeplot_set(fig_ax,*args): 31 fig_ax[0].grid(which="both",ls=':') 32 fig_ax[0].set_ylabel('Gain [dB]') 33 34 fig_ax[1].grid(which="both", ls=':') 35 fig_ax[1].set_xlabel('$\omega$ [rad/s]') 36 fig_ax[1].set_ylabel('Phase [deg]') 37 38 if len(args)>0: 39 fig_ax[1].legend(loc=args[0]) 40 if len(args)>1: 41 fig_ax[0].legend(loc=args[1]) 42 43 44# 伝達関数の定義 45omega_n=1259.56 46zeta=0.704116 47k=0.974673 48L=0.0004 49 50 51P3=tf([k*omega_n**2],[1,2*zeta*omega_n,omega_n**2])*P_pade 52 53 54ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 55 56#P制御(成功例) 57 58kp=(0.6,0.8,1.2) 59ref=1 60 61LS=linestyle_generator() 62fig, ax=plt.subplots() 63for i in range(3): 64 Kp=tf([0,kp[i]],[0,1]) 65 Gyr=feedback(1,P3*Kp) 66 67 y,t=step(Gyr, np.arange(0,0.03,0.0001)) #ここを変えたい 68 69 pltargs={'ls' : next(LS), 'label' : '$k_p$='+str(kp[i])} 70 ax.plot(t,y*ref, **pltargs) 71 72ax.axhline(ref , color="k",linewidth=0.5) 73plot_set(ax, 't', 'y','best') 74 75 76 77 78 79 80#p制御(うまくいかない) 81 82kp=(0.6,0.8,1.2) 83ref=1 84 85LS=linestyle_generator() 86fig, ax=plt.subplots() 87for i in range(3): 88 Kp=tf([0,kp[i]],[0,1]) 89 Gyr=feedback(1,P3*Kp) 90 91 y,t=lsim(Gyr,x_1,dt)#変更後 92 93 pltargs={'ls' : next(LS), 'label' : '$k_p$='+str(kp[i])} 94 ax.plot(t,y*ref, **pltargs) 95 96ax.axhline(ref , color="k",linewidth=0.5) 97plot_set(ax, 't', 'y','best')

試したこと

最初は x_1,t_1 としていたのですが、「time values must be equally spaced.」というエラーが出たので、t_1のデータの各要素の差分をとって(np.diff)それを平均したものをdtとしました。

補足情報(FW/ツールのバージョンなど)

x_1,t_1というのは、ランダム信号のデータです。(位置、時間幅)

とりあえず上記のプログラミングはp制御のみです。

参考図書:『pythonによる制御工学入門』

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下のようなコードでできるかと思います。

python

1 2#時刻配列 3dt =np.linspace(0, 0.03, 100) 4#各時刻の入力配列(スカラーの場合同じ値を入力し続ける) 5x_1=10 6 7kp=(0.6,0.8,1.2) 8ref=1 9 10LS=linestyle_generator() 11fig, ax=plt.subplots() 12for i in range(3): 13 Kp=tf([0,kp[i]],[0,1]) 14 Gyr=feedback(1,P3*Kp) 15 16 y,t,x=lsim(Gyr,x_1,dt)#状態ベクトルxを左辺に追加 17 18 pltargs={'ls' : next(LS), 'label' : '$k_p$='+str(kp[i])} 19 ax.plot(t,y*ref, **pltargs) 20 21ax.axhline(ref , color="k",linewidth=0.5) 22plot_set(ax, 't', 'y','best')

参考記事:PythonControlで正弦波に対する応答を求める。

投稿2019/07/24 02:05

amahara_waya

総合スコア1029

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/08/27 13:57

ありがとうございます! 無事動きました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問