2017-06-23 8 views
0

Matlabでode45を使ってDDEを解こうとしています。私の質問は、私がこの方程式を解く方法についてです。私が正しいかどうかわからない、あるいは間違っているので、代わりにdde23を使うべきです。ode45 Matlabを使って遅延微分方程式を解く

xdot(t)=Ax+BU(t-td)+E(t) & U(t-td)=Kx(t-td) & K=constant 

通常、私は私の式に遅れを持っていないとき、私はode45を使用してこの問題を解決: は、私は次の式を持っています。今度は私の方程式を遅らせて、再び結果を得るためにode45を使っています。私は各ステップでU(t-td)の正確な量を持っており、その量を置き換えて方程式を解く。

私の解決策は正しいですか、それともdde23を使うべきですか?

+1

'U'は決して' x'に依存しますか?そうでなければ、それは未知の関数の時間シフト値を伴わなければならないので、DDEではない。 – LutzL

+0

はい、Uはxをデペンドします。しかし、私が述べたように、U(t-td)の正確な値は分かっています。 U = Kx(t-td)であり、Kは定数である。 – Cena

+0

@セナ:これを反映するためにあなたの質問を編集してください。 – Wrzlprmft

答えて

2

あなたがここに二つの問題があります。

  1. ode45は、適応ステップサイズでソルバーです。これは、サンプリングステップが実際の統合ステップと必ずしも同等ではないことを意味します。その代わりに、インテグレータはサンプリングステップを必要な精度でいくつかの積分ステップに分割します(詳細については、Scientific Computingのthis questionを参照)。 したがって、たとえそうであっても、統合の各ステップで正確な遅延値Uを提供できない場合があります。

    ただし、サンプリングのステップが十分に小さい場合、実際にサンプリングステップごとに1つのタイムステップがあります。この理由は、必要以上に時間ステップを小さくして(したがって、計算時間を無駄にする)、適応型統合を効果的に無効にするためです。

  2. ode45のような高次Runge-Kutta法は、各積分ステップで導関数の値を利用するだけでなく、その間で評価します(また、いいえ、その間の時間ステップ)。

    たとえば、遅延と積分のステップがtd = 16であるとします。積分ステップをt = 32からt = 48にするには、t = 32-16 = 16およびt = 48-16 = 32だけでなくt = 40-16 = 24でもUを評価する必要があります。次のように言うかもしれません:さて、すべての時点で統合ステップを持つように統合してみましょう。しかし、これらの統合ステップでは、t = 16からt = 24に統合する場合は、t = 0、t = 4、およびt = 8でUを評価する必要があります。より小さい時間ステップの絶え間ないカスケードが得られます。原因問題2へ

、一段の積分器が、任意で、過去からの正確な状態を提供することは不可能である - 使用して、あなたのケースではおそらく良いアイデアではありません。このため、DDEを複数ステップ積分器に統合する場合は、過去の値を取得するために何らかの補間を使用することが不可欠です。 dde23は、これを高度な方法で良好な補間を使用して行います。

インテグレーションステップでUを提供する場合は、基本的にpiecewise-constant interpolationを実行しています。これは最悪の補間方法であり、非常に小さな積分ステップを使用する必要があります。あなたが本当にしたい場合にこれを行うことができますが、より洗練された区分的立方晶エルミート補間を用いたdde23は、はるかに大きな時間ステップで動作し、適応的に統合することができるため、はるかに高速になります。また、何らかの形で間違いを起こす可能性は低いです。最後に、dde23は、あなたがそのようなことをしている場合、非常に小さな遅延(統合ステップよりも小さい)を処理できます。

+0

これも重要な欠点の1つです。ステップサイズが遅延のサイズよりも大きくなった場合、これは 'ode45'を使用していても暗黙的になります。だから、ピカードの反復やアンダーソンの加速など、この暗黙の方程式を解くようにする必要があります。 'ode45'はこれをしませんので、最大タイムステップが' td'よりも小さくなるようにオプションを設定する必要があります。それ以外の場合、解決策はまったく正しくありません。言うまでもなく、DDEソルバーでDDEを解くだけです。 –

+0

@ChrisRackauckas:それは私が逃した(そして追加した)ディテールですが、私はそれが "重要"であるとは反対します。ほとんどの実用的な状況では、あなたは遅延のない状態に置き換えることができるので、そのような小さな遅延はありません。もちろん、これは状態依存の遅延でも起こりますが、 'dde23'はとにかくIIRCをサポートしていません。また、問題の状況では、まだ存在しない状態にアクセスしようとすると、かなり簡単な問題に遭遇します。 – Wrzlprmft