Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 미분방정식 풀기 – 오일러 방법(Euler Method)의 원리와 구현

이 문제에서는 초기값 y(x0) = y0이 주어진 미분방정식 f(x, y) = dy/dx가 입력으로 제공됩니다. 우리의 목표는 미분방정식을 풀기 위한 수치 해석 기법 중 하나인 오일러 방법(Euler Method)을 사용하여 이 방정식의 해를 구하는 것입니다.

오일러 방법(Euler Method)이란?

오일러 방법은 순방향 오일러 방법(Forward Euler Method)이라고도 불리며, 주어진 초기값을 바탕으로 미분방정식의 근사해를 구하는 1차 정확도(first-order)의 수치 해석 알고리즘입니다.

미분방정식 f(x, y) = dy/dx에 대해 오일러 방법은 다음과 같이 정의됩니다.

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

여기서 h는 스텝 크기(step size)를 의미하며, 다음과 같이 계산됩니다.

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

알고리즘 동작 원리

오일러 방법은 현재 지점의 함수값과 기울기를 이용해 다음 지점의 함수값을 선형적으로 예측하는 방식입니다. 즉, 현재 점 (x(n), y(n))에서의 기울기 f(x(n), y(n))에 스텝 크기 h를 곱한 만큼 y값을 증가시켜 다음 점 (x(n+1), y(n+1))을 구합니다. 이 과정을 목표 지점 x에 도달할 때까지 반복하면 됩니다.

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 = y + h * f(x0, y)를 적용해 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

위 실행 결과에서 볼 수 있듯이, 프로그램은 첫 번째 반복에서 y = 1 + 0.5 × f(0, 1) = 1 + 0.5 × 1 = 1.5를 계산하고, 그다음 x0 값이 목표 지점보다 커지므로 반복이 종료되어 최종 해를 출력합니다.

마무리

오일러 방법은 구현이 간단하고 직관적이어서 수치 해석을 처음 배울 때 가장 먼저 접하는 기법입니다. 다만 스텝 크기 h가 클수록 오차가 누적되어 정확도가 떨어질 수 있으므로, 더 높은 정밀도가 필요하다면 스텝 크기를 줄이거나 개선된 오일러 방법, 룽게-쿠타(Runge-Kutta) 방법 등의 고차 기법을 활용하는 것이 좋습니다.