Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม

วิธี Runge-Kutta อันดับ 4 สำหรับสมการเชิงอนุพันธ์

บทนำ

วิธี Runge-Kutta ใช้สำหรับแก้สมการเชิงอนุพันธ์ธรรมดา (Ordinary Differential Equations - ODE) ใช้ฟังก์ชัน dy/dx สำหรับ x และ y และต้องการค่าเริ่มต้นของ y คือ y(0) วิธีนี้หาค่าประมาณของ y สำหรับ x ที่กำหนด สูตรที่ต้องปฏิบัติตามมีดังนี้:

วิธี Runge-Kutta อันดับ 4 สำหรับสมการเชิงอนุพันธ์

โดยที่ h คือความสูงของช่วง

หมายเหตุ: จากสูตรเหล่านี้ สามารถใช้ k1 และ k2 แรกเพื่อหาคำตอบ Runge-Kutta อันดับ 2 สำหรับ ODE ได้

อินพุตและเอาต์พุต

Input: x0 และ f(x0): 0 และ 0, ค่า x = 0.4, ค่า h = 0.1
Output: คำตอบของสมการเชิงอนุพันธ์: 0.0213594

อัลกอริทึม

rungeKutta(x0, y0, x, h)
Input: ค่า x และ y เริ่มต้น, ค่า x เป้าหมาย, และความสูงช่วง h
Output: ค่า y สำหรับค่า x

Begin
    iteration := (x - x0)/h
    y = y0
    for i := 1 to iteration, do
        k1 := h*f(x0, y)
        k2 := h*f((x0 + h/2), (y + k1/2))
        k3 := h*f((x0 + h/2), (y + k2/2))
        k4 := h*f((x0 + h), (y + k3))
        y := y + (1/6)*(k1 + 2k2 + 2k3 + k4)
        x0 := x0 + h
    done
    return y
End

ตัวอย่างโค้ด (C++)

#include <iostream>
using namespace std;

double diffOfy(double x, double y) {
    return ((x*x) + (y*y));  // ฟังก์ชัน x^2 + y^2
}

double rk4thOrder(double x0, double y0, double x, double h) {
    int iteration = int((x - x0) / h);  // คำนวณจำนวนรอบการทำซ้ำ
    double k1, k2, k3, k4;
    double y = y0;  // เริ่มต้น y คือ f(x0)
    
    for (int i = 1; i <= iteration; i++) {
        k1 = h * diffOfy(x0, y);
        k2 = h * diffOfy((x0 + h/2), (y + k1/2));
        k3 = h * diffOfy((x0 + h/2), (y + k2/2));
        k4 = h * diffOfy((x0 + h), (y + k3));
        y += double((1.0/6.0) * (k1 + 2*k2 + 2*k3 + k4));  // อัปเดต y ด้วย delta y
        x0 += h;  // อัปเดต x0 ด้วย h
    }
    return y;  // ค่า f(x)
}

int main() {
    double x0, y0, x, h;
    cout << "Enter x0 and f(x0): "; cin >> x0 >> y0;
    cout << "Enter x: "; cin >> x;
    cout << "Enter h: "; cin >> h;
    cout << "Answer of differential equation: " << rk4thOrder(x0, y0, x, h);
}

ผลลัพธ์

Enter x0 and f(x0): 0 0
Enter x: 0.4
Enter h: 0.1
Answer of differential equation: 0.0213594