Main Content

ODE 솔버 선택하기

상미분 방정식

상미분 방정식(ODE)은 단일 독립 변수 t(주로 시간을 뜻함)에 대한 종속 변수 y의 도함수를 하나 이상 포함합니다. t에 대한 y의 도함수를 나타내기 위해 여기서는 1계 도함수의 경우 y', 2계 도함수의 경우 y'' 등의 표기법을 사용합니다. ODE의 계수(Order)는 방정식에 표시된 y의 도함수의 계수 중 가장 높은 계수와 같습니다.

예를 들어, 다음은 2계 ODE입니다.

y''=9y

초기값 문제에서는 초기 상태에서 시작하여 ODE를 풉니다. 초기 조건 y0과 답을 구하려는 기간 (t0,tf)를 사용하여 해를 반복적으로 구합니다. 각 스텝에서 솔버는 이전 스텝의 결과에 특정 알고리즘을 적용합니다. 그러한 스텝 중 첫 번째 스텝에서 초기 조건은 적분을 진행하는 데 필요한 정보를 제공합니다. 최종 결과는 ODE 솔버가 시간 스텝의 벡터 t=[t0,t1,t2,...,tf]와 각 스텝에 해당하는 해 y=[y0,y1,y2,...,yf]를 반환하는 것입니다.

ODE의 유형

MATLAB®의 ODE 솔버는 다음 유형의 1계 ODE를 풉니다.

  • y'=f(t,y) 형식의 양함수 ODE.

  • M(t,y)y'=f(t,y) 형식의 선형 음함수 ODE. 여기서 M(t,y)는 정칙 질량 행렬입니다. 질량 행렬은 시간 또는 상태 종속적이거나, 상수 행렬일 수 있습니다. 선형 음함수 ODE에는 y의 1계 도함수의 선형 결합이 포함되며, 이 선형 결합은 질량 행렬에 인코딩됩니다.

    선형 음함수 ODE는 항상 양함수 형식 y'=M1(t,y)f(t,y)로 변환할 수 있습니다. 그러나 ODE 솔버에 질량 행렬을 직접 지정하면, 번거롭고 많은 계산이 필요할 수 있는 이러한 변환을 피할 수 있습니다.

  • y'의 일부 성분이 누락된 방정식을 미분대수 방정식(DAE)이라고 하며, 연립 DAE에는 대수 변수가 일부 포함되어 있습니다. 대수 변수는 방정식에 도함수가 표시되지 않는 종속 변수입니다. 연립 DAE는 방정식을 미분하여 대수 변수를 제거함으로써 상응하는 1계 연립 ODE로 바꿀 수 있습니다. DAE를 ODE로 바꾸는 데 필요한 미분 횟수를 미분 지수(Differential Index)라고 합니다. ode15s 솔버와 ode23t 솔버는 지수-1 DAE를 풀 수 있습니다.

  • f(t,y,y')=0 형식의 완전 음함수 ODE. 완전 음함수 ODE는 양함수 형식으로 바꿀 수 없으며, 일부 대수 변수를 포함할 수도 있습니다. ode15i 솔버는 지수-1 DAE를 포함한 완전 음함수 문제용으로 설계되었습니다.

연립 ODE

풀려는 연립 ODE 방정식의 개수를 원하는 대로 지정할 수 있으며, 원칙적으로 방정식의 개수는 사용 가능한 컴퓨터 메모리에 의해서만 제한됩니다. 연립방정식에 n개의 방정식이 있는 경우,

(y'1y'2y'n)=(f1(t,y1,y2,...,yn)f2(t,y1,y2,...,yn)fn(t,y1,y2,...,yn)),

방정식을 인코딩하는 함수는 y'1,y'2,,y'n의 값에 대응하는 n개의 요소를 갖는 벡터를 반환합니다. 예를 들어, 다음과 같이 두 개로 이루어진 연립방정식이 있다고 가정하겠습니다.

{y'1=y2y'2=y1y22.

이러한 방정식을 인코딩하는 함수는 다음과 같습니다.

function dy = myODE(t,y)
  dy(1) = y(2);
  dy(2) = y(1)*y(2)-2;
end

고계 ODE(Higher-Order ODE)

MATLAB ODE 솔버는 1계 방정식만 풉니다. 따라서 고계 ODE는 일반적인 대입법을 사용하여 상응하는 1계 연립방정식으로 바꿔야 합니다.

y1=yy2=y'y3=y''yn=y(n1).

이러한 대입의 결과로, 다음과 같이 n개의 1계 방정식으로 구성된 연립방정식이 생성됩니다.

{y'1=y2y'2=y3y'n=f(t,y1,y2,...,yn).

예를 들어, 다음과 같은 3계 ODE가 있다고 가정하겠습니다.

y'''y''y+1=0.

다음과 같이 대입법을 사용하면

y1=yy2=y'y3=y''

상응하는 1계 시스템이 다음과 같이 생성됩니다.

{y'1=y2y'2=y3y'3=y1y31.

이 연립방정식에 대한 코드는 다음과 같습니다.

function dydt = f(t,y)
  dydt(1) = y(2);
  dydt(2) = y(3);
  dydt(3) = y(1)*y(3)-1;
end

복소 ODE(Complex ODE)

다음과 같은 복소 ODE 방정식이 있다고 가정하겠습니다.

y'=f(t,y),

여기서 y=y1+iy2입니다. 이 방정식을 풀려면 실수부와 허수부를 각각 다른 해 성분으로 분리한 다음 각 결과를 마지막에 다시 결합해야 합니다. 이는 개념적으로 다음과 같습니다.

yv=[Real(y)Imag(y)]fv=[Real(f(t,y))Imag(f(t,y))].

예를 들어, ODE가 y'=yt+2i인 경우 함수 파일을 사용하여 방정식을 나타낼 수 있습니다.

function f = complexf(t,y)
  f = y.*t + 2*i;
end

이때, 실수부와 허수부를 분리하는 코드는 다음과 같습니다.

function fv = imaginaryODE(t,yv)
  % Construct y from the real and imaginary components
  y = yv(1) + i*yv(2);            

  % Evaluate the function
  yp = complexf(t,y);             

  % Return real and imaginary in separate components
  fv = [real(yp); imag(yp)]; 
end     

솔버를 실행하여 해를 구할 경우, 각 해 성분에 초기 조건을 제공하도록 초기 조건 y0도 실수부와 허수부로 분리됩니다.

y0 = 1+i;
yv0 = [real(y0); imag(y0)];
tspan = [0 2];
[t,yv] = ode45(@imaginaryODE, tspan, yv0);

해를 구한 후에는 실수부와 허수부를 결합하여 최종 결과를 구합니다.

y = yv(:,1) + i*yv(:,2);

기본적인 솔버 선택

ode45는 대부분의 ODE 문제에서 잘 동작하며, 일반적으로 첫 번째로 선택하는 솔버가 됩니다. 그러나, 정확도 요구 사항이 더 느슨하거나 더 엄격한 문제의 경우 ode23, ode78, ode89ode113ode45보다 더 효율적일 수 있습니다.

일부 ODE 문제는 경직성(Stiff)을 보이거나 계산하기 어렵습니다. 경직성은 정확히 정의하기 곤란한 용어지만, 일반적으로 문제의 어느 부분에서 스케일링에 차이가 있는 경우 발생합니다. 예를 들어, 2개의 해 성분이 서로 크게 다른 시간 스케일에서 변하고 있는 ODE는 경직성 방정식일 수 있습니다. 비경직성 솔버(예: ode45)가 문제를 풀 수 없거나 속도가 매우 느린 경우 이 문제를 경직성 문제로 여길 수 있습니다. 비경직성 솔버의 속도가 매우 느린 경우에는 ode15s 등의 경직성 솔버를 대신 사용해 보십시오. 경직성 솔버를 사용하면 야코비 행렬(Jacobian Matrix)이나 그 희소성 패턴을 제공하여 안정성과 효율성을 향상시킬 수 있습니다.

ode 객체를 사용하여 문제의 속성에 따라 솔버 선택을 자동화할 수 있습니다. 어떤 솔버를 사용해야 할지 잘 모르는 경우 다음 표를 참조하십시오. 이 표에는 각 솔버를 언제 사용할 수 있는지에 대한 일반적인 지침이 나와 있습니다.

솔버문제 유형정확도사용하는 경우
ode45비경직성(Nonstiff)중간

대부분의 경우 사용할 수 있습니다. 다른 솔버보다 ode45를 가장 먼저 시도해 봐야 합니다.

ode23낮음

허용오차가 엄격하지 않거나 반경직성이 있는 문제의 경우 ode23ode45보다 더 효율적일 수 있습니다.

ode113낮음 ~ 높음

엄격한 허용오차를 가지는 문제에서나 ODE 함수를 계산하는 데 시간이 많이 걸리는 경우 ode113ode45보다 더 효율적일 수 있습니다.

ode78높음

정확도 요구 사항이 높은 매끄러운 해를 갖는 문제에서는 ode78ode45보다 더 효율적일 수 있습니다.

ode89높음

긴 시간 구간에 대해 적분을 수행하거나 허용오차를 특히 엄격하게 할 때는 매우 매끄러운 문제에서 ode89ode78보다 더 효율적일 수 있습니다.

ode15s경직성(Stiff)낮음 ~ 중간

ode45가 실패하거나 비효율적이고, 풀려는 문제가 경직성 문제인 것 같은 경우 ode15s를 사용해 보십시오. 미분대수 방정식(DAE)을 푸는 경우에도 ode15s를 사용하십시오.

ode23s낮음

엄격하지 않은 허용오차를 가지는 문제에서는 ode23sode15s보다 더 효율적일 수 있습니다. 이 솔버는 ode15s가 효과적이지 않은 일부 경직성 문제를 풀 수 있습니다.

ode23s는 각 스텝에서 야코비 행렬을 계산하므로, odeset을 통해 야코비 행렬을 제공하면 효율성과 정확도를 최대화할 수 있습니다.

질량 행렬이 있는 경우 이 행렬은 상수 행렬이어야 합니다.

ode23t낮음

반경직성 문제이고 수치 감쇠가 없는 해가 필요한 경우 ode23t를 사용하십시오.

ode23t는 미분대수 방정식(DAE)을 풀 수 있습니다.

ode23tb낮음

ode23s와 마찬가지로, ode23tb 솔버는 엄격하지 않은 허용오차를 가지는 문제에서 ode15s보다 더 효율적일 수 있습니다.

ode15i완전 음함수낮음

완전 음함수 문제 f(t,y,y’) = 0과 지수 1의 미분대수 방정식(DAE)에는 ode15i를 사용하십시오.

각 솔버를 사용하는 경우에 대한 자세한 내용과 추가 권장 사항은 [5] 항목을 참조하십시오.

ODE 예제와 파일에 대한 요약

대부분의 ODE 문제에서 좋은 출발점이 될 수 있는 여러 예제 파일이 있습니다. 예제를 쉽게 찾아 실행할 수 있는 미분 방정식 예제 앱을 실행하려면 다음을 입력하십시오.

odeexamples

편집을 위해 개별 예제 파일을 열려면 다음을 입력하십시오.

edit exampleFileName.m

예제를 실행하려면 다음을 입력하십시오.

exampleFileName

다음 표에는 사용할 수 있는 ODE 예제 파일 및 DAE 예제 파일과, 이러한 예제 파일에서 사용하는 솔버 및 옵션 목록이 나와 있습니다. 일부 예제에 대해서는 링크가 포함되어 있으며, 이러한 예제는 문서에도 직접 퍼블리시되어 있습니다.

예제 파일사용된 솔버지정된 옵션설명문서 링크
amp1daeode23t
  • 'Mass'

경직성 미분대수 방정식(Stiff DAE) — 상수 특이 질량 행렬을 사용하는 전기 회로

경직성(Stiff) 트랜지스터 미분대수 방정식 풀기
ballodeode23
  • 'Events'

  • 'OutputFcn'

  • 'OutputSel'

  • 'Refine'

  • 'InitialStep'

  • 'MaxStep'

단순한 이벤트 위치 — 튀어 오르는 공

ODE 이벤트 위치
batonodeode45
  • 'Mass'

시간/상태 종속 질량 행렬에 대한 ODE — 바통 운동

공중으로 던져진 바통의 운동 방정식 풀기
brussodeode15s
  • 'JPattern'

  • 'Vectorized'

대규모 경직성 문제 — 화학 반응의 확산(브뤼셀레이터)

경직성(Stiff) ODE 풀기
burgersodeode15s
  • 'Mass'

  • 'MStateDependence'

  • 'JPattern'

  • 'MvPattern'

  • 'RelTol'

  • 'AbsTol'

상태 종속성이 강한 질량 행렬에 대한 ODE — 이동 메시 기법을 사용하여 해를 구하는 버거스 방정식(Burgers' equation)

상태 종속성이 강한 질량 행렬에 대한 ODE 풀기
fem1odeode15s
  • 'Mass'

  • 'MStateDependence'

  • 'Jacobian'

시간 종속 질량 행렬의 경직성(Stiff) 문제 — 유한 요소법

fem2odeode23s
  • 'Mass'

상수 질량 행렬의 경직성(Stiff) 문제 — 유한 요소법

hb1odeode15s

상당히 긴 구간에 대해 해를 구하는 경직성 ODE 문제 — 로버트슨(Robertson) 화학 반응

hb1daeode15s
  • 'Mass'

  • 'RelTol'

  • 'AbsTol'

  • 'Vectorized'

보존 법칙에 기반을 둔 경직성 선형 음함수 DAE — 로버트슨 화학 반응

로버트슨 문제(Robertson Problem)를 반명시적(Semi-Explicit) 미분대수 방정식(DAE)으로 풀기
ihb1daeode15i
  • 'RelTol'

  • 'AbsTol'

  • 'Jacobian'

경직성 완전 음함수 DAE — 로버트슨 화학 반응

음함수 미분대수 방정식(DAE)으로 로버트슨 문제(Robertson Problem) 풀기
iburgersodeode15i
  • 'RelTol'

  • 'AbsTol'

  • 'Jacobian'

  • 'JPattern'

음함수 연립 ODE — 버거스 방정식

kneeodeode15s
  • 'NonNegative'

비음(Non-negativity) 제약 조건이 적용된 "무릎 문제(Knee Problem)"

음이 아닌 ODE 해
orbitodeode45
  • 'RelTol'

  • 'AbsTol'

  • 'Events'

  • 'OutputFcn'

복잡한 이벤트 위치 — 제한된 3체(Three Body) 문제

ODE 이벤트 위치
rigidodeode45

비경직성(Nonstiff) 문제 — 외부 힘이 작용하지 않을 때의 강체에 대한 오일러(Euler) 방정식

비경직성(Nonstiff) ODE 풀기
vdpodeode15s
  • 'Jacobian'

파라미터화가 가능한 반데르폴 방정식(van der Pol equation)(μ가 더 큰 경우의 경직성)

경직성(Stiff) ODE 풀기

참고 문헌

[1] Shampine, L. F. and M. K. Gordon, Computer Solution of Ordinary Differential Equations: the Initial Value Problem, W. H. Freeman, San Francisco, 1975.

[2] Forsythe, G., M. Malcolm, and C. Moler, Computer Methods for Mathematical Computations, Prentice-Hall, New Jersey, 1977.

[3] Kahaner, D., C. Moler, and S. Nash, Numerical Methods and Software, Prentice-Hall, New Jersey, 1989.

[4] Shampine, L. F., Numerical Solution of Ordinary Differential Equations, Chapman & Hall, New York, 1994.

[5] Shampine, L. F. and M. W. Reichelt, “The MATLAB ODE Suite,” SIAM Journal on Scientific Computing, Vol. 18, 1997, pp. 1–22.

[6] Shampine, L. F., Gladwell, I. and S. Thompson, Solving ODEs with MATLAB, Cambridge University Press, Cambridge UK, 2003.

참고 항목

| |

관련 항목

외부 웹사이트