初期値と最終値の制約を持つ結合ODEを解く


11

私の質問の本質は次のとおりです。2つのODEのシステムがあります。1つには初期値制約があり、もう1つには最終値制約があります。これは、いくつかの変数に初期値制約があり、他の変数に最終値制約がある単一のシステムと考えることができます。

詳細は次のとおりです。

私は、線形動的システムを駆動するために、連続時間の有限水平LQRコントローラーを使用しようとしています。Pythonエコシステムを引き続き使用したいと思います。

システムは、形態であるに、被写体X 0 = X 0x˙(t)=Ax(t)+Bu(t)x(0)=x0

LQRソリューションは、x t で線形の最適な制御入力u(t)がu t = K t x t )であるような行列生成します。K(t)x(t)u(t)=K(t)x(t)

ここで、K(t)=R1BTP(t)

そして連続時間リカッチ微分方程式(このことに留意することが解決策である行列です)P(t)P(t)

PTとF=QP˙(t)=ATP(t)P(t)A+P(t)BR1BTP(t)+Q対象P(tf)=Q

B x 0 Q Q f R t fA、、、、、、がすべて与えられます。Bx0QQfRtf

英語:状態で始まる動的システムがあります。LQRコントローラーは、時間と間で使用するフィードバックマトリックスを生成します(は一般に問題の時間と呼ばれます) 0 t f t fx00tftf

2つのODEは一方向でのみ結合されることに注意してください解は依存しません。したがって、問題を解決する1つの方法は、リカッチ方程式を逆にして、最終値の問題を初期値の問題に変え、標準のODE積分器を使用して時間と間の数値解を見つけることです。次に、この数値解を使用してを見つけることができます。これは、x(t)の数値ODEソルバーが必ずしも$ P(t)の数値解法の時間と同じ時間にODEをサンプリングするとは限らないためです。たぶんこれを強制するための賢い方法があるでしょう。x t 0 t f x t P(t)x(t)0tfx(t)

問題を解決するために私が予見するもう1つの方法は、システムを一緒に解決することですが、初期値制約と最終値制約の混在に対処する方法がわかりません。これらの問題を解決するには計算量が多いですか?SciPy / Pythonでできますか?

回答:


8

P(t)t[0,tf]

これを行うには、出力値を補間します。密な出力をサポートするルンゲクッタ法を使用することをお勧めします。たとえば、scipy.integrate.ode.dopri5このような方法に基づいています。したがって、インテグレータに非常に小さなステップを強制することなく、非常に細かい間隔の出力時間を指定できる必要があります(scipyインターフェイスが正しく実装されていると仮定します)。


P(t)P(t)

6

これは2点境界値問題と呼ばれ、よく研究されています。

撮影方法はプログラミングが非常に簡単ですが、数値的には非常に不安定になる場合があります。

これらの問題を解決する標準的な方法は、多重射撃アプローチを使用し、対応する非線形方程式系を標準の非線形ソルバーで解くことです。非線形方程式系のソルバーのリストについては、たとえば、
http://www.mat.univie.ac.at/~neum/glopt/software_l.html#nonlinを参照してください

時間として通常のグリッドの状態を変数として(通常は非常に細かいグリッドは必要ありません)、方程式として境界条件と時間t変数を時間t + h変数にマッピングするマッピングを使用します。これにより、変数と同じ数の方程式が得られます。グリッド上の状態の特定の構成に対してこのマッピングを評価するためのルーチンを提供するだけでよく、非線形ソルバーは他のすべてを行います。(最初の推測が不十分な場合は、おそらく複数の開始点が必要です。)

Wikipedia http://en.wikipedia.org/wiki/Direct_multiple_shooting_methodに は、上記の説明が十分に詳しくない場合、プロセスの有用な説明があります。そこに引用されているStoer / Bulirschの本は、完全な詳細を提供します。


5

Pythonでそれを行う方法はわかりませんが、文献で探したいキーワードは「撮影方法」です。これは、初期値と最終値の両方の制約がある問題を解決するメソッドの名前です。


1

AUTOは2ポイントBVPを解決でき、Pythonインターフェースを備えており、比較的簡単にインストールできます。http://www.ma.hw.ac.uk/~gabriel/auto07/node6.html

最初にP(t)を解き、それを入力として他のODEに送りたい場合は、PyDSToolを使用して設定するのが効率的な方法です。PyDSToolは、任意のプラットフォームにインストールするのは非常に簡単で、参照http://pydstool.sf.netを。デフォルトでは、以前に計算されたソリューションに対して線形補間のみを使用します(したがって、細かい時間分解能で計算します)。ただし、アダプティブインテグレーターを使用しても、PyDSToolを強制的に目的の時点に強制的に移動させることができます(ただし、非効率で不正確になる可能性があります)。ただし、最大タイムステップが十分に小さい場合、2番目のシステムの線形補間と高速積分器(Dopriが組み込まれている)により、このような「通常の」システムでも問題ありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.