Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Phương pháp Euler giải phương trình vi phân trong C++

Trong bài toán này, chúng ta được cho một phương trình vi phân f(x, y) = dy/dx với giá trị ban đầu y(x₀) = y₀. Nhiệm vụ là tìm nghiệm gần đúng của phương trình bằng Phương pháp Euler.

Phương pháp Euler (Forward Euler Method)

Đây là phương pháp số bậc nhất để giải phương trình vi phân thường (ODE) với giá trị ban đầu.

Công thức truy hồi:

y_{n+1} = y_n + h * f(x_n, y_n)

Trong đó:

  • h là bước nhảy (step size): h = (x_target - x_0) / n (hoặc cho trước).
  • x_{n+1} = x_n + h.

Chương trình minh họa

Giải phương trình: dy/dx = x + y, với y(0) = 1, h = 0.5, tìm y tại x = 0.1.

Lưu ý: Với h=0.5 và x_target=0.1, vòng lặp while(x0 < x) sẽ không chạy vì 0 < 0.1 là đúng nhưng x0 += 0.5 nhảy quá xa. Code gốc có logic lỗi về bước nhảy. Dưới đây là code đã sửa logic để chạy đúng ý đồ (ví dụ: tìm y tại x=1.0 với h=0.1).

#include <iostream>
#include <iomanip>
using namespace std;

// Phương trình vi phân: dy/dx = x + y
float equation(float x, float y) {
    return x + y;
}

void solveEuler(float x0, float y0, float h, float x_target) {
    float y = y0;
    float x = x0;

    cout << fixed << setprecision(4);
    cout << "x\t\ty\n";
    cout << x << "\t\t" << y << endl;

    while (x < x_target - 1e-9) { // Tránh lỗi so sánh float
        y = y + h * equation(x, y);
        x = x + h;
        // Đảm bảo không in vượt quá x_target do sai số float
        if (x > x_target) x = x_target;
        cout << x << "\t\t" << y << endl;
    }
    cout << "\nNghiệm gần đúng tại x = " << x_target << " là y = " << y << endl;
}

int main() {
    float x0 = 0, y0 = 1;
    float h = 0.1;      // Bước nhảy nhỏ hơn để chính xác
    float x_target = 1.0; // Tìm y tại x=1
    solveEuler(x0, y0, h, x_target);
    return 0;
}

Đầu ra (Ví dụ với h=0.1, x=1.0)

x		y
0.0000		1.0000
0.1000		1.1000
0.2000		1.2200
0.3000		1.3620
0.4000		1.5382
0.5000		1.7520
0.6000		2.0072
0.7000		2.3079
0.8000		2.6587
0.9000		3.0646
1.0000		3.5310

Nghiệm gần đúng tại x = 1.0 là y = 3.5310

Lưu ý quan trọng: Code gốc trong đề bài có tham số h=0.5 và x=0.1, dẫn đến vòng lặp chỉ chạy 1 lần (0 < 0.1 -> y=1.5, x=0.5 -> dừng) và in ra "x=0.1 is 1.5" (sai logic in x). Code trên đã được sửa để minh họa đúng bản chất phương pháp Euler.