動的システムモデリング:ODEを解くための数値的手法

はじめに


前の記事でメカニズムの基本を非常に簡単に検討したので、実践に移りましょう。頭で考えると簡単な理論で十分です。



したがって、タスク:
石は、h = 100 mの高さから初速度なしで垂直に投げられます。空気抵抗を無視すると、時間の経過に伴う地球の表面上の石の高さの関数として石の動きの法則が決まります。 10 m / s 2に等しい重力加速度
簡単なタスクですか? はい、初歩的で、分析的ソリューションを備えており、読み書きのできる学生でも簡単に書くことができます。 しかし、この単純なタスクは、私たちにとって非常に明らかな例となります。

1.タスクの形式化


シミュレーションの始まり。 形式化により、進行中のプロセスを説明する数式の受信が理解されます。 この場合、仮定が定式化されます。影響を無視できる要因によるモデルの簡略化のリスト。

仮定は、このタスクに適用可能であり、それに応じて、石は重要なポイントと見なすことができます。 1つの力がこのポイントに適用されます-重力なので、空気抵抗がないという仮定を使用します。

次の仮定は、私たちが石を投げる高さが惑星のサイズと比較して無視できるため、地球が平らであり、したがってその表面の曲率が無視できるためです。 そして、重力は一定であると考えられ、地球の表面に垂直に向けられ、大きさが等しい

P=m\、g



ここで、gは地球の表面での重力加速度です。 次に、石の運動方程式を作成します。 これらの方程式を覚えておいてください

 begincasesm\、 ddotx= sumFkxm\、 ddoty= sumFkym\、 ddotz= sumFkz\終



それらの左側の部分にはまだ興味がありませんが、右側には座標軸上の点に適用される力の投影の合計が含まれています。 x軸とy軸を表面上に配置し、z軸を表面に垂直に上向きにします。 力は1つだけで、x軸とy軸上の投影はゼロに等しく、z軸上の投影は負です。これは、力が軸の方向に向かっているためです。

 begincasesm\、 ddotx=0m\、 ddoty=0m\、 ddotz=m\、g endcases



石の質量は明らかにゼロに等しくないため、結果の方程式の両側を安全に分割できます

 begincases ddotx=0 ddoty=0 ddotz=g endcases



私は気にしません、石の動きが厳密に垂直に発生することを証明していますが、これは正式な観点から行わなければなりません。 最初の2つの方程式の右側のゼロは、これらの軸に沿った移動が不可能であることを意味しません。最初のニュートンの法則を思い出してください。 これについては、次の記事で詳しく説明しますが、今のところ、最終微分方程式を書き出すことで、運動の1次元性を正しく設定します。

 ddotz=g



私たちが成功したという事実は少なからずありません-問題で起こっていることのプロセスの数学的モデル。 パトス?

いや この方程式を分析すると、たとえば、この方程式には質量がないため、石の質量はその運動の法則に影響を与えないと結論付けます。 方程式を解かなくても、私たちはすでにペンと真空中の鉛片を使った実験の有効性を公式に証明しており、彼らはそれを学校で見せたがっています( 月にそれを繰り返した人もいます)。

分析ソリューションを取得するのは簡単です、私も気にしません、それはそうです

zt=h fracg\、t22



しかし、これを数値的に解決する方法は? そして、それはどういう意味ですか-「数値的に」?

2.一階微分方程式の数値積分



最初の注文は何ですか? 前回、運動方程式は2次であると言いました。 すべて正しいのですが、コンピューターで拡散を解くためのほとんどの方法は、1次方程式しか解けません。 2次方程式を直接積分する方法(Verlet法など)がありますが、現在はそうではありません。

第一に、この方程式は、順序を減らすことができるようなタイプです。 右側は未知の関数に依存しないため(zはありません)、そのことを思い出してください。

 ddotz= dotvz



z軸の加速度の投影は、同じz軸の速度の投影の1次導関数に等しくなります。 いいね

 dotvz=g



これが一次方程式です。 この番号は必ずしも通り抜けるわけではありません(コーシーのフォームについては今はお話ししません!)が、この場合はすべて正常です。 座標ではなく、ポイントの速度を検索します。 次は? そして

 fracdvzdt=g



なぜなら、導関数は、関数の無限小増分(速度)と、それを引き起こした引数の無限小増分(時間)の比だからです。 ほんの少しの時間しかかかりません \デt考慮できるほど小さい

 fracdvzdt\約 frac Deltavz Deltat



なに? そして、これは何ですか

 Deltavz=g\、 Deltat



速度が上がりました。 負の増分。 このように、落下する石は同じように加速します! はい、そうです。 その速度、その速度のベクトルは下向きになります。 したがって、z軸上のこのベクトルの投影は負になります。 そうです、絶対値で下向きのベクトルの投影を取得します。 速度の初期値はゼロであり、つまり

vz0=0


速度の増分を計算できるという事実を利用して、0.1秒で速度がどのようになるかを計算します

vz1=vz0g\、 Deltat=010 cdot0.1=1.0


そしてさらに0.1秒後

vz2=vz1g\、 Deltat=1.010 cdot0.1=2.0


そしてさらに0.1秒後

vz3=vz2g\、 Deltat=2.010 cdot0.1=3.0


うーん、それでかなり長い間続けることができますが、1秒の時間間隔に制限します。

時間s速度m / s
0.00.0
0.1-1.0
0.2-2.0
0.3-3.0
0.4-4.0
0.5-5.0
0.6-6.0
0.7-7.0
0.8-8.0
0.9-9.0
1.0-10.0

つまり、式を使用して

vzi+1=vzig\、 Deltat



ポイントの速度の時間依存性が得られました。 そして、あなたがする必要があるのは、現在の瞬間の速度値を取得し、そこに速度が新しい瞬間に受け取る増分を追加することです。 \デt秒。 ここでは、時間の増分を統合ステップと呼びます。 そして、現在の時間に目的の関数の導関数の値にステップを乗じて増分を計算します。 ただ? はい、もちろんです。 そして、私が書いた式には、微分方程式の数値解法のための明示的なオイラー法という名前があります。 これは、計算値の新しい値が以前の値に依存する場合の、いわゆる繰り返し式です。

しかし、地球上のポイントの高さはどうですか? はい、すべて同じです。

 fracdzdt=vz



速度の投影は対応する座標の導関数だからです。 速度はすでにわかっているため、この方程式にオイラー法の式を適用します

zi+1=zi+vzi\、 Deltat



この式に従って、テーブルに別の列を追加します

 beginalignz1=z0+vz0\、 Deltat=100+0.0 cdot0.1=100z2=z1+vz1\、 Deltat=1001.0 cdot0.1=99.9z3=z2+vz2\、 Deltat=99.92.0 cdot0.1=99.7 endalign



などなど

時間s速度m / s高さ、m
0.00.0100.0
0.1-1.0100.0
0.2-2.099.9
0.3-3.099.7
0.4-4.099.4
0.5-5.099.0
0.6-6.098.5
0.7-7.097.9
0.8-8.097.2
0.9-9.096.4
1.0-10.095.5

うーん、まず第一に、速度は時間とともに変化するため、身長はすでに不均等に変化していることがわかります。 現在、デリバティブ自体は時間依存です。 しかし、すでに最初のステップで、何かがおかしいことに気づきました-速度はすでにそこにありますが、高さはまだ100メートルです。 どうして?

これは、各ステップで微分(速度)定数を設定したために発生しました。 このメソッドは、ステップ間でソリューションに何が起こるかについての情報を提供しません。 したがって、誤差が累積し、得られた解と正確な解を比較します

zt=1005\、t2



時間s速度m / s高さ、m正確な解、m
0.00.0100.0100.00
0.1-1.0100.099.95
0.2-2.099.999.80
0.3-3.099.799.55
0.4-4.099.499.20
0.5-5.099.098.75
0.6-6.098.598.20
0.7-7.097.997.55
0.8-8.097.296.80
0.9-9.096.495.95
1.0-10.095.595.00

はい、私たちの石は空中で凍っているようです。 数値解法は分析解法よりも遅れており、さらに考えると、アカウントのエラーが大きくなります。 各ステップでますます大まかな近似を取るため、エラーが累積します。 どうする

まず、ステップを減らすことができます。 10回言ってみましょう \デt=0.01

時間s速度m / s高さ、m正確な解、m
0.00.0100.0100.00
0.1-1.099.9699.95
0.2-2.099.8199.80
0.3-3.099.5799.55
0.4-4.099.2299.20
0.5-5.098.7898.75
0.6-6.098.2398.20
0.7-7.097.5997.55
0.8-8.096.8496.80
0.9-9.096.0095.95
1.0-10.095.0595.00

カウント終了時のエラーは0.05メートルを超えておらず、これは以前の値の10分の1です。 ステップをさらに10倍減らすと、さらに正確なソリューションが得られると想定できます。 実際、このようなテーブルを取得するには、0.1刻みで10ポイントのみの値を表示して、10回ではなく100回の反復が必要です。ステップ0.001では、1000回の反復が必要になり、結果は

時間s速度m / s高さ、m正確な解、m
0.00.0100.0100.00
0.1-1.099.950599.95
0.2-2.099.801099.80
0.3-3.099.551599.55
0.4-4.099.202099.20
0.5-5.098.752598.75
0.6-6.098.203098.20
0.7-7.097.553597.55
0.8-8.096.804096.80
0.9-9.095.954595.95
1.0-10.095.005095.00

これらの計算を手動で実行しようとした場合、高精度が必要な場合にどれだけ単調で時間がかかるかを理解できます。 それが、数値シミュレーションの全盛期がコンピューターの出現と一致した理由です。 これらは、数値に対して多くの単調な操作をすばやく実行するために必要です。

オイラー法は、微分方程式を積分するための最も簡単な既知の方法です。 この単純な例から、メソッドのエラーは積分のステップに正比例することがわかります。これは実際にそうです。 このようなメソッドは、1次精度メソッドと呼ばれます。

たとえば、4次精度のルンゲクッタ法を適用すると、ステップ0.1でも計算の精度が向上します。 しかし、これは別の話です。

おわりに


それについて考えてみてください...私たちは非常に単純な例を見てみました。 私たちはコンピューターさえ使用しませんでしたが、世界の非常に強力なスーパーコンピューターが宇宙の生活の初期段階をシミュレートする仕組みをすでに理解しています。 もちろん、すべてがより複雑ですが、原則は同じです。

あなたが自分の手に渡る強力なツールを想像してください。 これは、コンピューターを使用しない最後の記事です。 オクターブを約束しました。 次回は彼になります。

Source: https://habr.com/ru/post/J349162/


All Articles