C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で微分方程式を数値的に解く!オイラー法の基本と実装方法

本記事では、初期値 y(x0) = y0 を持つ微分方程式 f(x, y) = dy/dx が与えられたとき、その解をオイラー法(Euler Method)を用いて求める方法を解説します。C++による実装例もあわせて紹介します。

オイラー法とは

オイラー法は「前進オイラー法(Forward Euler Method)」とも呼ばれる手法で、微分方程式の解を初期値をもとに近似的に求めるための一次精度の数値計算法です。解析的に解けない複雑な微分方程式でも、コンピュータを使えば数値的に近似解を得られるのが大きな魅力です。

微分方程式 f(x, y) = dy / dx に対して、オイラー法は次のように定義されます。

y(n+1) = y(n) + h × f( x(n), y(n) )

ここで h は刻み幅(ステップサイズ)と呼ばれ、次のように計算します。

h = (x(n) − x(0)) / n

つまり、現在の点における傾き(導関数の値)を使って、少しずつ先の y の値を予測しながら解を追いかけていくのがオイラー法の基本的な考え方です。

C++での実装例

以下のプログラムは、オイラー法の動作を示すサンプルコードです。

#include <iostream>
using namespace std;

float equation(float x, float y) {
    return (x + y);
}

void solveEquationEulers(float x0, float y, float h, float x) {
    float temp = 0.0;

    while (x0 < x) {
        temp = y;
        y = y + h * equation(x0, y);
        x0 = x0 + h;
    }
    cout<<"The solution of the differential equation at x = "<< x <<" is f(x, y) = "<<y;
}

int main()
{
    float x0 = 0;
    float y0 = 1;
    float h = 0.5;
    float x = 0.1;
    solveEquationEulers(x0, y0, h, x);
    return 0;
}

プログラムのポイント

  • equation関数: 微分方程式 f(x, y) = x + y を表しています。問題に応じてこの部分を変更するだけで、別の微分方程式にも対応できます。
  • solveEquationEulers関数: 初期値 x0 から目標地点 x まで、刻み幅 h ずつ進みながら反復計算を行い、y の値を更新していきます。
  • main関数: 初期条件 x0 = 0、y0 = 1、刻み幅 h = 0.5、目標地点 x = 0.1 を設定して計算を実行します。

実行結果

The solution of the differential equation at x = 0.1 is f(x, y) = 1.5

このように、オイラー法を使うことで微分方程式の数値解を簡単に求めることができます。ただし、オイラー法は一次精度のため誤差が大きくなりやすいという特徴があります。より高精度な解が必要な場合は、ルンゲ・クッタ法(Runge-Kutta Method)などの高次の数値解法を検討するとよいでしょう。

  1. C++で学ぶクイックソート(QuickSort)の仕組みと実装方法

    クイックソートとはクイックソート(Quicksort)は、比較に基づいて未ソートのリスト(配列)を並べ替えるソートアルゴリズムの一つです。「パーティション交換ソート(partition exchange sort)」とも呼ばれます。クイックソートは安定ソートではありません。これは、等しい値を持つ要素同士の相対的な順序が保持されないためです。ただし、配列に対してごくわずかな追加メモリだけで動作するため、メモリ効率に優れています。選択ソートと非常に似ていますが、常に最悪のパーティションを選んでしまうわけではない点が異なり、より洗練された形の選択ソートと捉えることもできます。クイックソートは最も効率

  2. C++で覆面算パズルを解く方法|バックトラッキングによる全探索アルゴリズムを徹底解説

    覆面算(暗号算術)パズルとは? 覆面算(Crypt-Arithmetic Problem)とは、単語を構成する各アルファベットに0〜9の数字を割り当て、算式が正しく成立するようにするパズルです。異なる文字には必ず異なる数字が対応し、10進法の数字は0〜9の10種類しかないため、使用できる文字は最大10種類という制約があります。 典型的な例として、「BASE」と「BALL」という2つの単語が与えられ、その足し算の答えとして「GAMES」が与えられるケースがあります。各文字に適切な数字を割り当てれば、BASE+BALL=GAMES という等式が実際に成立します。 入力と出力 入力 このアルゴリズ