MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
C Sharpと数値解析 - ルンゲ・クッタ法のソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
C Sharpと数値解析 - ルンゲ・クッタ法
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == ルンゲ・クッタ法は、微分方程式 <math>\dfrac{dy}{dt} = f(t, y)</math> の数値解法として、カール・ルンゲとマルティン・クッタによって開発された手法である。<br> <br> この手法は、解曲線に沿って複数の点で関数を評価して、それらを適切に組み合わせることにより高精度な近似解を得ることにある。<br> <br> ルンゲ・クッタ法の理論は、テイラー級数展開に基づいており、任意の次数nのルンゲ・クッタ法は、テイラー展開のn次の項まで一致するように設計されている。<br> これにより、刻み幅hに関する誤差を <math>O(h^{n + 1})</math> まで抑えることができる。<br> <br> 一般的なルンゲ・クッタ法の形式は次式となる。<br> <math>y(n + 1) = y(n) + h(b_1 k_1 + b_2 k_2 + \cdots + b_n k_n)</math><br> <br> ここで、<math>k1, k2, \cdots, k_n</math> は各段階での傾きの評価値であり、<math>b1, b2, \cdots, b_n</math> は重み係数である。<br> 各段階での傾きk<sub>i</sub>は、以下に示すように計算される。<br> <math> \begin{align} k1 &= f(t_n, y_n) \\ k2 &= f(t_n + c_2 h, y_n + h(a_{21} k_1)) \\ k3 &= f(t_n + c_3 h, y_n + h(a_{31} k_1 + a_{32} k_2)) \\ \cdots \end{align} </math><br> <br> * 精度制御 *: 高次の方法ほど理論的な精度は高くなるが、実際の問題では丸め誤差の影響も考慮する必要がある。 * 安定性 *: 高次の方法は一般に安定性領域が狭くなる傾向があり、特に硬い方程式では注意が必要である。 * 計算効率 *: 次数が上がるほど関数評価の回数が増加するため、問題に応じて適切な次数を選択する必要がある。 * 適応的ステップサイズ制御 *: より高度な実装では、局所誤差の推定に基づいてステップサイズを動的に調整する機能を組み込むことが一般的である。 <br><br> == N次のルンゲ・クッタ法 == ==== 1次のルンゲ・クッタ法 ==== オイラー法と同等であり、最も単純な形式である。<br> 1点での傾き評価のみを使用するため、精度は低いものの、計算コストは最小限である。<br> <br> ==== 2次のルンゲ・クッタ法 ==== 中点法やホイン法として知られる方法が含まれる。<br> 2点での傾き評価を行い、それらを組み合わせることにより、1次よりも高い精度を得ることができる。<br> <br> ==== 3次のルンゲ・クッタ法 ==== 3点での傾き評価を行い、より高精度な近似を実現する。<br> ただし、4次法と比較すると使用頻度は低い。<br> <br> ==== 4次のルンゲ・クッタ法 ==== 最も広く使われている方法であり、精度と計算効率のバランスが優れている。<br> 4点での傾き評価を行い、これらを適切な重みで組み合わせる。<br> <br> ==== 高次のルンゲ・クッタ法 ==== 5次以上の高次の方法も存在するが、計算コストの増加に対する精度の向上が比較的小さいため、特殊な用途を除いてあまり使用されていない。<br> <br><br> == ルンゲ・クッタ法の種類 == ==== 埋め込み型ルンゲ・クッタ法 ==== 異なる次数の方法を組み合わせることにより、効率的な誤差推定を可能にする手法である。<br> <br> ====陰的ルンゲ・クッタ法 ==== 硬い方程式に対して、より優れた安定性を持つ変種である。<br> <br> ==== シンプレクティック・ルンゲ・クッタ法 ==== ハミルトン系の数値解法として、エネルギー保存等の幾何学的性質を保持する特殊な形式である。<br> <br><br> == 4次のルンゲ・クッタ法 == <syntaxhighlight lang="c#"> using System; using System.Collections.Generic; /// <summary> /// 4次のルンゲクッタ法による微分方程式ソルバ /// </summary> public class RungeKutta { private readonly Func<double, double, double> _function; private readonly double _stepSize; /// <summary> /// コンストラクタ /// </summary> /// <param name="function">微分方程式の右辺を表す関数 f(t, y)</param> /// <param name="stepSize">計算のステップサイズ</param> public RungeKutta(Func<double, double, double> function, double stepSize) { _function = function; _stepSize = stepSize; } /// <summary> /// 指定された区間で微分方程式を解く /// </summary> /// <param name="t0">開始時刻</param> /// <param name="y0">初期値</param> /// <param name="tEnd">終了時刻</param> /// <returns>計算結果の時刻と解のペアのリスト</returns> public List<(double Time, double Value)> Solve(double t0, double y0, double tEnd) { var result = new List<(double Time, double Value)>(); var t = t0; var y = y0; // 初期値を結果リストに追加 result.Add((t, y)); // 終了時刻に達するまで計算を続ける while (t < tEnd) { // 4次のルンゲ・クッタ法による1ステップの計算 var k1 = _function(t, y); var k2 = _function(t + _stepSize / 2, y + _stepSize * k1 / 2); var k3 = _function(t + _stepSize / 2, y + _stepSize * k2 / 2); var k4 = _function(t + _stepSize, y + _stepSize * k3); // 次のステップの値を計算 y += _stepSize * (k1 + 2 * k2 + 2 * k3 + k4) / 6; t += _stepSize; // 結果をリストに追加 result.Add((t, y)); } return result; } } </syntaxhighlight> <br> <syntaxhighlight lang="c#"> // 例 減衰を表す微分方程式 : y' = -2y Func<double, double, double> f = (t, y) => -2 * y; // 4次のルンゲ・クッタ法による解法 var rk = new RungeKutta(f, stepSize: 0.1); var rkSolution = rk.Solve(t0: 0, y0: 1, tEnd: 5); </syntaxhighlight> <br><br> {{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux |image=/resources/assets/MochiuLogo_Single_Blue.png }} __FORCETOC__ [[カテゴリ:C_Sharp]]
C Sharpと数値解析 - ルンゲ・クッタ法
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse