ODE 솔버 선택하기
상미분 방정식
상미분 방정식(ODE)은 단일 독립 변수 t(주로 시간을 뜻함)에 대한 종속 변수 y의 도함수를 하나 이상 포함합니다. t에 대한 y의 도함수를 나타내기 위해 여기서는 1계 도함수의 경우 , 2계 도함수의 경우 등의 표기법을 사용합니다. ODE의 계수(Order)는 방정식에 표시된 y의 도함수의 계수 중 가장 높은 계수와 같습니다.
예를 들어, 다음은 2계 ODE입니다.
초기값 문제에서는 초기 상태에서 시작하여 ODE를 풉니다. 초기 조건 과 답을 구하려는 기간 를 사용하여 해를 반복적으로 구합니다. 각 스텝에서 솔버는 이전 스텝의 결과에 특정 알고리즘을 적용합니다. 그러한 스텝 중 첫 번째 스텝에서 초기 조건은 적분을 진행하는 데 필요한 정보를 제공합니다. 최종 결과는 ODE 솔버가 시간 스텝의 벡터 와 각 스텝에 해당하는 해 를 반환하는 것입니다.
ODE의 유형
MATLAB®의 ODE 솔버는 다음 유형의 1계 ODE를 풉니다.
형식의 양함수 ODE.
형식의 선형 음함수 ODE. 여기서 는 정칙 질량 행렬입니다. 질량 행렬은 시간 또는 상태 종속적이거나, 상수 행렬일 수 있습니다. 선형 음함수 ODE에는 y의 1계 도함수의 일차 결합이 포함되며, 이 일차 결합은 질량 행렬에 인코딩됩니다.
선형 음함수 ODE는 항상 양함수 형식 로 변환할 수 있습니다. 그러나 ODE 솔버에 질량 행렬을 직접 지정하면, 번거롭고 많은 계산이 필요할 수 있는 이러한 변환을 피할 수 있습니다.
의 일부 성분이 누락된 방정식을 미분대수 방정식(DAE)이라고 하며, 연립 DAE에는 대수 변수가 일부 포함되어 있습니다. 대수 변수는 방정식에 도함수가 표시되지 않는 종속 변수입니다. 연립 DAE는 방정식을 미분하여 대수 변수를 제거함으로써 상응하는 1계 연립 ODE로 바꿀 수 있습니다. DAE를 ODE로 바꾸는 데 필요한 미분 횟수를 미분 지수(Differential Index)라고 합니다.
ode15s
솔버와ode23t
솔버는 지수-1 DAE를 풀 수 있습니다.형식의 완전 음함수 ODE. 완전 음함수 ODE는 양함수 형식으로 바꿀 수 없으며, 일부 대수 변수를 포함할 수도 있습니다.
ode15i
솔버는 지수-1 DAE를 포함한 완전 음함수 문제용으로 설계되었습니다.
일부 유형의 문제에 대해서는 odeset
함수를 사용하여 options 구조체를 생성하는 방식으로 솔버에 추가 정보를 제공할 수 있습니다.
연립 ODE
풀려는 연립 ODE 방정식의 개수를 원하는 대로 지정할 수 있으며, 원칙적으로 방정식의 개수는 사용 가능한 컴퓨터 메모리에 의해서만 제한됩니다. 연립방정식에 n개의 방정식이 있는 경우,
방정식을 인코딩하는 함수는 의 값에 대응하는 n개의 요소를 갖는 벡터를 반환합니다. 예를 들어, 다음과 같이 두 개로 이루어진 연립방정식이 있다고 가정하겠습니다.
이러한 방정식을 인코딩하는 함수는 다음과 같습니다.
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계 연립방정식으로 바꿔야 합니다.
이러한 대입의 결과로, 다음과 같이 n개의 1계 방정식으로 구성된 연립방정식이 생성됩니다.
예를 들어, 다음과 같은 3계 ODE가 있다고 가정하겠습니다.
다음과 같이 대입법을 사용하면
상응하는 1계 시스템이 다음과 같이 생성됩니다.
이 연립방정식에 대한 코드는 다음과 같습니다.
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 방정식이 있다고 가정하겠습니다.
여기서 입니다. 이 방정식을 풀려면 실수부와 허수부를 각각 다른 해 성분으로 분리한 다음 각 결과를 마지막에 다시 결합해야 합니다. 이는 개념적으로 다음과 같습니다.
예를 들어, ODE가 인 경우 함수 파일을 사용하여 방정식을 나타낼 수 있습니다.
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
, ode89
및 ode113
이 ode45
보다 더 효율적일 수 있습니다.
일부 ODE 문제는 경직성(Stiff)을 보이거나 계산하기 어렵습니다. 경직성은 정확히 정의하기 곤란한 용어지만, 일반적으로 문제의 어느 부분에서 스케일링에 차이가 있는 경우 발생합니다. 예를 들어, 2개의 해 성분이 서로 크게 다른 시간 스케일에서 변하고 있는 ODE는 경직성 방정식일 수 있습니다. 비경직성 솔버(예: ode45
)가 문제를 풀 수 없거나 속도가 매우 느린 경우 이 문제를 경직성 문제로 여길 수 있습니다. 비경직성 솔버의 속도가 매우 느린 경우에는 ode15s
등의 경직성 솔버를 대신 사용해 보십시오. 경직성 솔버를 사용하면 야코비 행렬(Jacobian Matrix)이나 그 희소성 패턴을 제공하여 안정성과 효율성을 향상시킬 수 있습니다.
다음 표에는 각각의 솔버를 언제 사용할 수 있는지에 대한 일반적인 지침이 나와 있습니다.
솔버 | 문제 유형 | 정확도 | 사용하는 경우 |
---|---|---|---|
ode45 | 비경직성(Nonstiff) | 중간 | 대부분의 경우 사용할 수 있습니다. 다른 솔버보다 |
ode23 | 낮음 | 허용오차가 엄격하지 않거나 반경직성이 있는 문제의 경우 | |
ode113 | 낮음 ~ 높음 | 엄격한 허용오차를 가지는 문제에서나 ODE 함수를 계산하는 데 시간이 많이 걸리는 경우 | |
ode78 | 높음 | 정확도 요구 사항이 높은 매끄러운 해를 갖는 문제에서는 | |
ode89 | 높음 | 긴 시간 구간에 대해 적분을 수행하거나 허용오차를 특히 엄격하게 할 때는 매우 매끄러운 문제에서 | |
ode15s | 경직성(Stiff) | 낮음 ~ 중간 |
|
ode23s | 낮음 | 엄격하지 않은 허용오차를 가지는 문제에서는
질량 행렬이 있는 경우 이 행렬은 상수 행렬이어야 합니다. | |
ode23t | 낮음 | 반경직성 문제이고 수치 감쇠가 없는 해가 필요한 경우
| |
ode23tb | 낮음 |
| |
ode15i | 완전 음함수 | 낮음 | 완전 음함수 문제 f(t,y,y’) = 0과 지수 1의 미분대수 방정식(DAE)에는 |
각 솔버를 사용하는 경우에 대한 자세한 내용과 추가 권장 사항은 [5] 항목을 참조하십시오.
ODE 예제와 파일에 대한 요약
대부분의 ODE 문제에서 좋은 출발점이 될 수 있는 여러 예제 파일이 있습니다. 예제를 쉽게 찾아 실행할 수 있는 미분 방정식 예제 앱을 실행하려면 다음을 입력하십시오.
odeexamples
편집을 위해 개별 예제 파일을 열려면 다음을 입력하십시오.
edit exampleFileName.m
예제를 실행하려면 다음을 입력하십시오.
exampleFileName
다음 표에는 사용할 수 있는 ODE 예제 파일 및 DAE 예제 파일과, 이러한 예제 파일에서 사용하는 솔버 및 옵션 목록이 나와 있습니다. 일부 예제에 대해서는 링크가 포함되어 있으며, 이러한 예제는 문서에도 직접 퍼블리시되어 있습니다.
예제 파일 | 사용된 솔버 | 지정된 옵션 | 설명 | 문서 링크 |
---|---|---|---|---|
amp1dae | ode23t |
| 경직성 미분대수 방정식(Stiff DAE) — 상수 특이 질량 행렬을 사용하는 전기 회로 | 경직성(Stiff) 트랜지스터 미분대수 방정식 풀기 |
ballode | ode23 |
| 단순한 이벤트 위치 — 튀어 오르는 공 | ODE 이벤트 위치 |
batonode | ode45 |
| 시간/상태 종속 질량 행렬에 대한 ODE — 바통 운동 | 공중으로 던져진 바통의 운동 방정식 풀기 |
brussode | ode15s |
| 대규모 경직성 문제 — 화학 반응의 확산(브뤼셀레이터) | 경직성(Stiff) ODE 풀기 |
burgersode | ode15s |
| 상태 종속성이 강한 질량 행렬에 대한 ODE — 이동 메시 기법을 사용하여 해를 구하는 버거스 방정식(Burgers' equation) | 상태 종속성이 강한 질량 행렬에 대한 ODE 풀기 |
fem1ode | ode15s |
| 시간 종속 질량 행렬의 경직성(Stiff) 문제 — 유한 요소법 | — |
fem2ode | ode23s |
| 상수 질량 행렬의 경직성(Stiff) 문제 — 유한 요소법 | — |
hb1ode | ode15s | — | 상당히 긴 구간에 대해 해를 구하는 경직성 ODE 문제 — 로버트슨(Robertson) 화학 반응 | — |
hb1dae | ode15s |
| 보존 법칙에 기반을 둔 경직성 선형 음함수 DAE — 로버트슨 화학 반응 | 로버트슨 문제(Robertson Problem)를 반명시적(Semi-Explicit) 미분대수방정식(DAE)으로 풀기 |
ihb1dae | ode15i |
| 경직성 완전 음함수 DAE — 로버트슨 화학 반응 | 음함수 미분대수방정식(DAE)으로 로버트슨 문제(Robertson Problem) 풀기 |
iburgersode | ode15i |
| 음함수 연립 ODE — 버거스 방정식 | — |
kneeode | ode15s |
| 비음(Non-negativity) 제약 조건이 적용된 "무릎 문제(Knee Problem)" | 음이 아닌 ODE 해 |
orbitode | ode45 |
| 복잡한 이벤트 위치 — 제한된 3체(Three Body) 문제 | ODE 이벤트 위치 |
rigidode | ode45 | — | 비경직성(Nonstiff) 문제 — 외부 힘이 작용하지 않을 때의 강체에 대한 오일러(Euler) 방정식 | 비경직성(Nonstiff) ODE 풀기 |
vdpode | ode15s |
| 파라미터화가 가능한 반데르폴 방정식(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.