ブロック線図からボード線図をプロットするにはどうすれば良いですか?
134 ビュー (過去 30 日間)
古いコメントを表示
MathWorks Support Team
2013 年 10 月 25 日
編集済み: MathWorks Support Team
2021 年 3 月 9 日
ブロック線図からボード線図をプロットするにはどうすれば良いか、教えてください。
採用された回答
MathWorks Support Team
2021 年 3 月 9 日
編集済み: MathWorks Support Team
2021 年 3 月 9 日
主に以下に示す1. 2.のようなアプローチ手法があります。またそれぞれのアプローチ手法において、2通りの方法を説明します。現在ご利用のツールにより使い分けて下さい。
※サンプルプログラム・モデルは、"関連ドキュメント"よりダウンロードすることができます。
1. 線形システム、または非線形システムを一旦、線形システムへ近似しボード線図をプロットする方法(サンプル:case1.mdl)
(1) Simulink Control Design(Control System Toolboxが必要)を利用する場合
Simulink Control Designのモデル線形化器(線形解析機能)により容易にボード線図をプロットすることができます。
R2011a 以降をご利用の場合、下記 URL をご覧ください。
始めに、システムの入力ポイントと出力ポイントを設定します。
モデルウィンドウの[ツール]-[制御設計]-[線形解析]メニューを選択します。
プロットタイプを「ボード応答プロット」とし、「モデルの線形化」ボタンをクリックします。(R14以前のリリースをご利用の場合には、LTI Viewerウィンドウの[編集]-[プロットの設定]メニューから、「応答タイプ」で「ボード」を選択します)
LTI Viewerウィンドウへボード線図がプロットされます。
(R14以前のリリースをご利用の場合には、LTI Viewerウィンドウの[Simulink]-[線形化したモデルの取得]メニューを選択します)
(2) Control System Toolboxのみを利用する場合
対象のモデル(ここではcase1.mdl)をオープンし、linmodコマンドにより線形化を行います。線形化されたシステムの入力ポイント、出力ポイントは、モデルのトップ階層に配置されたInport、Outportブロックが基準となります。
>> [num,den] = linmod('case1')
Returning transfer function model
num = 0 0 25.0000
den = 1.0000 1.0000 25.0000
伝達関数の分子係数ベクトルnum、分母係数ベクトルdenが得られます。
bodeコマンドを使って、取得された伝達関数からボード線図を計算、作成します。
>> bode(num,den)
(3) MATLAB/Simulinkのみを利用する場合
対象のモデル(ここではcase1.mdl)をオープンし、linmodコマンドにより線形化を行います。線形化されたシステムの入力ポイント、出力ポイントは、モデルのトップ階層に配置されたInport、Outportブロックが基準となります。
>> [num,den] = linmod('case1')
Returning transfer function model
num = 0 0 25.0000
den = 1.0000 1.0000 25.0000
伝達関数の分子係数ベクトルnum、分母係数ベクトルdenが得られます。
取得された伝達関数から周波数応答を計算し、ボード線図をプロットします。
%---スクリプト例(サンプル:script1.m)---w = logspace(-1,2,100);
j = sqrt(-1);
Gjw = polyval(num,j*w)./polyval(den,j*w);
Mag_dB = 20*log10(abs(Gjw));
Ph = unwrap(angle(Gjw))/(pi/180);
subplot(211)
semilogx(w,Mag_dB)
xlabel('Frequency (rad/s)'); ylabel('Magnitude (dB)');
subplot(212)
semilogx(w,Ph)
xlabel('Frequency (rad/s)'); ylabel('Phase (deg)');
なお、Signal Processing Toolboxが利用可能な場合には、下記 2. の(1)の方法も利用可能です。
2. 非線形システムから直接、ボード線図をプロットする方法(サンプル:case2.mdl)
(1) Signal Processing Toolboxを利用する場合
シミュレーション実行後のシステムへの入力データ、出力データから周波数応答関数を計算し、ボード線図をプロットします。周波数応答関数の計算には、Signal Processing Toolboxの関数tfeを使用します。
まず、システムへの入力部、出力部にTo Workspaceブロックを配置し、シミュレーションデータを収録できるようにしておきます。以下例では、入力データindata、出力データoutdataが、シミュレーション実行後にワークスペースへ保存されます。
周波数応答関数の計算を行い、ボード線図をプロットします。
%--- スクリプト例(サンプル:script2.m) ---[Txy,F] = tfe(indata,outdata,4096,1/0.05,ones(4096,1));
Mag_dB = 20*log10(abs(Txy));
Ph = unwrap(angle(Txy))/(pi/180);
w = 2*pi*F;
subplot(211)
semilogx(w,Mag_dB)
xlabel('Frequency (rad/s)'); ylabel('Magnitude (dB)');
xlim([1 10]); ylim([-10 15]);
subplot(212)
semilogx(w,Ph)
xlabel('Frequency (rad/s)'); ylabel('Phase (deg)');
xlim([1 10]); ylim([-200 0]);
(2) MATLAB/Simulinkのみを利用する場合
シミュレーション実行後のシステムへの入力データ、出力データから周波数応答関数を計算し、ボード線図をプロットします。
まず、システムへの入力部、出力部にTo Workspaceブロックを配置し、シミュレーションデータを収録できるようにしておきます。以下例では、入力データindata、出力データoutdataが、シミュレーション実行後にワークスペースへ保存されます。
周波数応答関数の計算を行い、ボード線図をプロットします。
%---スクリプト例(サンプル:script3.m) ---Pxx = fft(indata,4096);
Pyy = fft(outdata,4096);
Pxy = (Pyy.*conj(Pxx))./(Pxx.*conj(Pxx));
Pxy = Pxy(1:2048);
F = (0:2047)*(1/0.05)/4096;
Mag_dB = 20*log10(abs(Pxy));
Ph = unwrap(angle(Pxy))/(pi/180);
w = 2*pi*F;
subplot(211)
semilogx(w,Mag_dB)
xlabel('Frequency (rad/s)'); ylabel('Magnitude (dB)');
xlim([1 10]); ylim([-10 15]);
subplot(212)
semilogx(w,Ph)
xlabel('Frequency (rad/s)'); ylabel('Phase (deg)');
xlim([1 10]); ylim([-200 0]);
その他の非線形システムのボード線図の描画方法は、関連ソリューション”非線形の Simulink モデルのボード線図を描くにはどうすればよいですか?” を参照ください。
をご参照ください。
0 件のコメント
その他の回答 (0 件)
参考
カテゴリ
Help Center および File Exchange で 時間領域および周波数領域解析 についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!