計算方法實驗(三):四階龍格-庫塔方法

四階Runge-Kutta數學原理

給定常微分方程初值問題

{dydx=f(x,y),axb y(a)=α      h=baN  \left\{ \begin{matrix} \frac{\text{dy}}{\text{dx}} = f(x,y),a \leq x \leq b \\ \ y(a) = \alpha\text{\;\;\quad\;h} = \frac{b - a}{N} \\ \end{matrix} \right.\

xn=a+nhx_{n} = a + n \cdot hn=0,1,,Nn = 0,1,\cdots,N,利用四階龍格—庫塔方法

K1=hf(xn,yn) K_{1} = hf\left( x_{n},y_{n} \right)

K2=hf(xn+h2,yn+K12) K_{2} = hf\left( x_{n} + \frac{h}{2},y_{n} + \frac{K_{1}}{2} \right)

K3=hf(xn+h2,yn+K22) K_{3} = hf\left( x_{n} + \frac{h}{2},y_{n} + \frac{K_{2}}{2} \right)

K4=hf(xn+h,yn+K3) K_{4} = hf\left( x_{n} + h,y_{n} + K_{3} \right)

yn+1=yn+16(K1+2K2+2K3+K4) y_{n + 1} = y_{n} + \frac{1}{6}(K_{1} + 2K_{2} + 2K_{3} + K_{4})

n=0,1,,N1 n = 0,1,\cdots,N - 1

可逐次求出微分方程初值問題的數值解yny_{n}n=1,2,,Nn = 1,2,\cdots,N

程序流程

核心代碼

#include <cmath>
#include <cstdio>
#include <iostream>
using namespace std;

int n;
double a, b, fa;

double f(double x, double y) { return -y * y; }
double f_(double x) { return 1.0 / (x + 1.0); }

int main() {
    scanf("%lf%lf%lf%d", &a, &b, &fa, &n);
    double x = a, y = fa, h = (b - a) / n;
    for (int i = 1; i <= n; i++) {
        double k1 = h * f(x, y);
        double k2 = h * f(x + h / 2, y + k1 / 2);
        double k3 = h * f(x + h / 2, y + k2 / 2);
        double k4 = h * f(x + h, y + k3);
        x += h;
        y += 1.0 / 6.0 * (k1 + 2 * k2 + 2 * k3 + k4);
        printf("%.2lf\t%lf\t%.2lf\n", x, y, fabs(f_(x) - y));
    }
    return 0;
}

詳細報告

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章