なぜODEの数値解は不安定な平衡から遠ざかるのですか?


15

二重振り子のようなシステムの動作をシミュレートしたいと思います。このシステムは2自由度のロボットマニピュレーターであり、作動しないため、重力の影響を受ける二重振り子のように動作します。二重振り子との唯一の主な違いは、2つの振り子が、質量中心に質量と慣性の特性を持つ2つの剛体で構成されていることです。

基本的ode45に、次のタイプのODEのシステムを解決するためにMatlabでプログラミングしました。

[10000M110M1200100M120M22][x˙1x˙2x˙3x˙4]=[x2V1G1x4V2G2]

ここで、x1は水平に対する最初の物体の角度、x2は最初の物体の角速度です。x3は第1の物体に対する第2の物体の角度であり、x4は第2の物体の角速度です。すべての係数は、作成した関数rhsfMass関数の次のコードで指定されています。

clear all
opts= odeset('Mass',@fMass,'MStateDependence','strong','MassSingular','no','OutputFcn',@odeplot);
sol = ode45(@(t,x) rhs(t,x),[0 5],[pi/2 0 0 0],opts);

function F=rhs(t,x)
    m=[1 1];
    l=0.5;
    a=[0.25 0.25];
    g=9.81;
    c1=cos(x(1));
    s2=sin(x(3));
    c12=cos(x(1)+x(3));
    n1=m(2)*a(2)*l;
    V1=-n1*s2*x(4)^2-2*n1*s2*x(2)*x(4);
    V2=n1*s2*x(2)^2;
    G1=m(1)*a(1)*g*c1+m(2)*g*(l*c1+a(2)*c12);
    G2=m(2)*g*a(2)*c12;

    F(1)=x(2);
    F(2)=-V1-G1;
    F(3)=x(4);
    F(4)=-V2-G2;
    F=F';     
end

function M=fMass(t,x)
    m=[1 1];
    l=0.5;
    Izz=[0.11 0.11];
    a=[0.25 0.25];
    c2=cos(x(3));
    n1=m(2)*a(2)*l;
    M11=m(1)*a(1)^2+Izz(1)+m(2)*(a(2)^2+l^2)+2*n1*c2+Izz(2);
    M12=m(2)*a(2)^2+n1*c2+Izz(2);
    M22=m(2)*a(2)^2+Izz(2);
    M=[1 0 0 0;0 M11 0 M12;0 0 1 0;0 M12 0 M22];
end

システムが完全に垂直な位置で開始されるように、x1(水平に対する最初のボディの角度)の初期条件をどのように設定するかに注意してください。このように、重力のみが作用しているため、明らかな結果は、システムがその位置からまったく移動しないことです。

注:以下のすべての図では、時間に対してソリューションx1およびx3をプロットしました。

ODE45

で6秒間シミュレーションを実行するode45と、問題のない期待されるソリューションが得られます。システムはそのままであり、移動しません。

ここに画像の説明を入力してください

ただし、シミュレーションを10秒間実行すると、システムが不当に動き始めます。

ここに画像の説明を入力してください

ODE23

次にode23、問題を解決するためにシミュレーションを実行しました。私は同じ行動になりますが、今回は1秒後に発散が始まります:

ここに画像の説明を入力してください

ODE15s

次に、シミュレーションを実行しode15sて、問題が持続するかどうかを確認しました。いいえ、システムは100秒の間でも安定しているように見えます。

ここに画像の説明を入力してください

それからまた、ode15s最初の注文であり、いくつかの統合手順しかないことに注意してください。そこでode15s、10秒の間に別のシミュレーションを実行しましたが、精度を上げるためMaxStep0.01サイズを使用しましたが、残念ながら、これはとの両方ode45と同じ結果になりode23ます。

ここに画像の説明を入力してください

通常、これらのシミュレーションの明らかな結果は、システムが混乱しないため、システムが初期位置にとどまることです。なぜこの相違が発生しているのですか?これらのタイプのシステムは本質的に混oticとしているという事実と関係がありますか?これはode、Matlabの関数の通常の動作ですか?


方程式に加えて、a回路図は質問を理解するのに大いに役立つと思います。
ニコグアロ

適切だと思う場合は、回答の1つを受け入れることができます(緑色のボタンがあります)。
Ertxiem-モニカの復活

あなたは言いませんが、プロットされているようだx1x3。(凡例や説明のないグラフについてのドライコメントを挿入してください。)(の絶対値)x2との対数をプロットしてみてくださいx4
エリックタワーズ

回答:


15

ブライアンとエルトシェムによって2つの主要なポイントがすでに作成されていると思います:初期値は不安定な平衡であり、数値計算が実際に正確ではないという事実は、不安定性を引き起こす小さな摂動を提供します。

これがどのように機能するかについてもう少し詳しく説明するには、一般的な初期値問題の形で問題を検討してください

y˙(t)=M1f(t,y(t))
ここで、y(t)=(x1(t),x2(t),x3(t),x4(t))

f(t,y(t))=[x2V1G1x4V2G2]

正確な算術では、f(0,y0)=0y˙(0)=0f~

コードでは、コンピューティングによってそれをテストできます

norm(rhs(0,[pi/2 0 0 0]))

これにより、6.191e-16が得られます-ゼロではありませんが、ほぼゼロです。それはシステムのダイナミクスにどのように影響しますか?

fy0y~0

さらに、ごく短時間のうちに、システムのソリューションは線形化されたシステムのソリューションのようになります

y˙(t)=f(0,y0)+f(0,y0)(y(t)y0)=f(0,y0)(y(t)y0)

ffrhsy0d(t):=y(t)y0d

d˙(t)=f(0,y0)d(t).

手でヤコビアンを計算するのが面倒なので、自動微分を使用して適切な近似値を取得しました。

J:=f(0,y0)=[01009.8102.4525000012.452502.45250]

あなたの方程式が

d˙(t)=Jd(t),d(0)=y~0y0

最後のステップが必要です:ヤコビアンの固有値分解を計算することができます

J=QDQ1

DJQde(t):=Q1d(t)

e˙(t)=De(t),e(0)=Q1d0.

D

e˙i(t)=λiei(t),ei(0)=ith component of Q1d0

i=1,2,3,4λ1=3.2485

e1(t)=e1(0)e3.2485t.

d(0)=0e(0)=Q1d(0)=0e1(0)=0e1(0)


16

π/2π/2


4
(科学表記法で出力された値を見て)状態変数を注意深く監視すると、平衡状態から離れる最初の非常に遅い動きを見ることができるはずです。
ブライアンボー

これは理にかなっており、実際、システムを下向きの垂直位置(安定した平衡点)で開始すると、システムはまったく動きません。少なくとも1000秒のシミュレーションでは、非常に長い時間を考慮します。 。
jrojasqu

6
x1sin(0)cos(0)sin(pi/2)cos(pi/2)rhs(t,[0,0,0 0] == [0,0,0,0]

π/2

1
θ=0 1016

4

関数で計算された力の成分を見てください。

他の答えが言ったように、の値を表すことができないため、それらは決して正確にゼロになることはないでしょう。πように、コンピューターの算術正確にトリガー関数を計算するルーチンます。

1016開始時には)その不安定な平衡位置からシステムを離れて移動します。

a=1.0a=a+1016


4

最初の仮定は、初期位置が運動エネルギーがゼロの安定した平衡状態(つまり、ポテンシャルエネルギーの最小値)にあり、システムが平衡状態から離れ始めたことでした。
物理的には起こりえないので(古典的なメカニズムを考えると)、2つのことが思い浮かびました:

  1. π/2π/2

  2. 2つ目は、移動の方程式に何らかの問題がある可能性があることです(おそらくどこかにタイプミスがあるのでしょうか?)。方程式を明示的に書いてください。おそらく、角速度がゼロであると仮定して、奇妙なものがあるかどうかを確認し、各振り子の初期位置の関数として角加速度をプロットできます。


1
π

2
ところで、楽しみのために、システムを不安定な垂直位置に保ちたい場合は、座標の原点を変更して、上向きのゼロに等しい角度にすることができます。
Ertxiem-モニカを

@Ertxiemのもう1つのオプションは、ピンに小さな摩擦を導入して、数値エラーを引き起こすことです。
svavil

π

物理的には起こりえないので –不安定な平衡状態にあるという洞察を考えると、私はこれに幾分挑戦します。物理的なシステム(過度の摩擦なし)は不安定な平衡状態にとどまりません。より一般的には、実際のシステムをシミュレートする場合、システムが不安定な平衡状態に陥るのを避けることを望みます(ただし、そこに到達したとしても)。これは機能であり、バグではありません。(これにはまれな例外があります。たとえば、免疫学における感染していない状態は、維持できる不安定な平衡です。)
Wrzlprmft

0

二重振り子の詳細を検索する必要があります。それらは、私たちが「カオスシステム」と呼ぶものです。わずかに異なる初期条件から開始する単純なルールに従って動作しますが、ソリューションは非常に速く分岐します。この種のシステムの数値シミュレーションを行うことは簡単ではありません。見てみましょう次のビデオを問題に多くの洞察を得るために。

単純または二重振り子の場合、システムの総エネルギーの式を書くことができます。摩擦力が無視されると仮定すると、この総エネルギーは分析システムによって保存されます。数値的には、これはまったく別の問題です。

二重振り子を試す前に、単純な振り子を試してください。小さな次数のルンゲクッタ法の場合、数値シミュレーションでは一定のままではなく、システムのエネルギーが増大することに気付くでしょう(これはシミュレーションで行われることです:何もせずに動きます)。これを防ぐには、より高次のRKメソッドを使用できます(ode45は4次、8次のRKはより適切に機能します)。数値シミュレーションがエネルギーを節約するように設計された「シンプレクティック法」と呼ばれる他の方法があります。一般に、初期化と比較してエネルギーが大幅に増加したらすぐにシミュレーションを停止する必要があります。

そして、二重振り子に行く前に、単純な振り子を理解してください。


2
ただし、これはシステムが無秩序であることではありません。非カオス系でも不安定な平衡状態を保つことができます。たとえば、単一の振り子が「頭の上」にある場合、問題で説明したのと同じ振る舞いを示します。
ダニエル

1
また、小さな次数のRKMでエネルギーが増加することも事実ではありません。暗黙のオイラーは1次であり、まったく逆の動作を示します。
ダニエル

@BeniBogoselシンプレクティックな方法に言及しましたが、これは明らかに私の例ではエネルギーが保存されていないためです。しかし、ここで実装できる特定のシンプレクティック法を示していただけますか?
jrojasqu

@jrojasquなぜあなたのシステムでエネルギーが節約されないと言うのですか?
Ertxiem-モニカの復活

@Ertxiemによって提供される出力を使用してシステムの総機械的エネルギー(運動エネルギーとポテンシャルエネルギー)を計算すると、ode45ゼロから始まり、時間とともに増加する値を取得します。値は最初の数秒では非常に小さくなっていますが、それでも一貫してゼロから大きくなります。上記の回答で扱われた問題のためだと思いますπなど)。
jrojasqu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.