finverse()を用いたことによるベクトル化推奨、配列変換不可エラー
5 views (last 30 days)
Show older comments
既知の二次遅れ系の伝達関数を有するシステムの逆関数を求め、目標信号(のこぎり波)に対してフィードフォワード制御信号を導出するプログラムを作成しております。
T=0.005;
Tr=0.001;
syms t;
SV=2*16*triangularPulse(0,Tr,T,t)-16;
aFreq=3330;
K=50;
ext=0.015
sys=tf(K*aFreq^2,[1,2*ext*aFreq,aFreq^2]);
[num,den]=tfdata(sys);
syms s;
sys_sym=poly2sym(cell2mat(num),s)/poly2sym(cell2mat(den),s);
MV=ilaplace(laplace(SV)*finverse(sys_sym));
fplot(SV,[0 T]);
hold on
fplot(MV,[0 T])
上記を動作したところ、おそらくfinverse起因で下記のエラーが発生しました。ベクトル化するよう示唆されましたが、ベクトル化して離散化するとラプラス変換・逆ラプラス変換不可能(連続データのみ受け付けるため)です。どのような対処が望ましいでしょうか。ご助力頂けますようよろしくお願いいたします。
警告: 関数が配列入力で予期せぬ動作をします。パフォーマンスを向上させるために、入力引数と同じサイズと形状をもつ出力を返すように関数を適切にベクトル化してください。
警告: FunctionLine の更新中にエラーが発生しました。
FunctionLine 更新での関数の評価中に、次のエラーが報告されました: 式を double の配列に変換できません。
3 Comments
Accepted Answer
Kazuya
on 30 Jan 2019
計算される MV を見てみると ilaplace を含んだ結果になっているので、 ilaplace が逆変換を計算できないことが原因ではないでしょうか。逆ラプラス変換ができない式ですか??
ちなみに、
警告: 関数が配列入力で予期せぬ動作をします。パフォーマンスを向上させるために、入力引数と同じサイズと形状をもつ出力を返すように関数を適切にベクトル化してください。
のベクトル化というのは、fplot 関数に与える式に、入力としてベクトルを入れてもちゃんと計算できるようにしてください、ということを意味しています。例えば、
fplot(@(x) sin(x)*cos(x))
でも同じメッセージがでてきますが、
fplot(@(x) sin(x).*cos(x))
ではOKです。
プロットを描く際には、式 sin(x)*cos(x) の x に実数値を代入して、関数値を計算して描くわけですが、その計算時に x に数値のベクトルを入力できるようにしたほうがいいですよ、という意図かと。
の配列演算の項も参照してみてください。
0 Comments
More Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!