入力の1つの値ごとに出力の結果を取得-MATLAB ODE


1

Matlabの質量-ダンパー-システムをシミュレートしていますが、システムへの入力として次のベクトル(1x100)があります。

ut = linspace(0, 10);
u = 5 * sin(2 * ut) + 10.5; % input of our system - external force

次に、この微分方程式を使用して、入力ベクトルの各値の出力値を取得します。

function dx = odefun_4(t,x)
    m = 15;
    b = 0.2;
    k = 2;   
    dx = [x(2); u/m - (b/m)*x(2) - (k/m)*x(1)];    
end

これは私のメイン.mファイルから次のように呼び出されます:

[t,X] = ode45(@odefun_4, [0 10], [0;0])

uベクトルをグローバル変数にしてベクトルを渡そうとしましたが、エラーが表示Dimensions of arrays being concatenated not consistent. されRefineます。ソルバーodesetoptions引数と引数を使用してパラメーターを設定しようとしましたode45が、目的の結果が得られませんでした。本当に助けを借りることができました。


u

滑らかな連続関数。
テオプロトウリス

回答:


1

ut

function dx = odefun_4(t,x)
    m = 15;
    b = 0.2;
    k = 2;
    u = 5 * sin(2 * t) + 10.5;
    dx = [x(2); u/m - (b/m)*x(2) - (k/m)*x(1)];
end

また、Matlabで匿名関数を使用する方が便利な場合もよくあります。たとえば、

m = 15;
b = 0.2;
k = 2;
u = @(t) 5 * sin(2 * t) + 10.5;
odefun_4 = @(t,x) [x(2); u(t)/m - (b/m)*x(2) - (k/m)*x(1)];

まあ、あなたが提案するものはかなりうまくいきます。私の問題は、u(100個の値を持つ)のすべての値に対して、1つの値を出力として取得することです。システムがあり、入力値ごとに1つの出力値が必要です。そのため、100の入力値があるため、100の出力値が必要です。
テオプロトウリス

@TeoProtoulis ode45はこれを許可しません。可変ステップodeソルバーです。ode45に入力する時間ベクトルがであることを指定し、linspace(0, 10)後で潜在的に追加の時間ステップを除外できます。ダイナミクスは線形であるため、一定の時間ステップのサンプリングでのみ機能するlsimも使用できます。
fibonatic
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.