이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

ode15i

완전한 음함수 미분방정식 풀기 — 가변 차수법

설명

예제

[t,y] = ode15i(odefun,tspan,y0,yp0)입니다. 여기서 tspan = [t0 tf]t0에서 tf까지의 구간에서 초기 조건 y0yp0을 사용하여 연립미분방정식 f(t,y,y')=0을 적분합니다. 해 배열 y의 각 행은 열 벡터 t에 반환된 값에 대응합니다.

예제

[t,y] = ode15i(odefun,tspan,y0,yp0,options)odeset 함수를 사용하여 생성된 인수인 options로 정의된 적분 설정도 사용합니다. 예를 들어, 절대 허용오차와 상대 허용오차를 지정하려면 AbsTol 옵션과 RelTol 옵션을 사용하고 야코비 행렬을 제공하려면 Jacobian 옵션을 사용하십시오.

[t,y,te,ye,ie] = ode15i(odefun,tspan,y0,yp0,options)는 이벤트 함수라고 하는 (t,y,y')의 함수가 0인 위치를 추가로 찾습니다. 출력값에서 te는 이벤트 발생 시간이고, ye는 이벤트 발생 시 계산된 해이며, ie는 트리거된 이벤트의 인덱스입니다.

각 이벤트 함수에 대해, 0에서 적분을 종료할지 여부와 영점교차의 방향을 고려할지 여부를 지정합니다. 이를 수행하려면 'Events' 속성을 함수(예: myEventFcn 또는 @myEventFcn)로 설정하고 이에 대응하는 함수 [value,isterminal,direction] = myEventFcn(t,y,yp)를 생성합니다. 자세한 내용은 ODE 이벤트 위치 항목을 참조하십시오.

sol = ode15i(___)deval과 함께 사용하여 구간 [t0 tf] 내의 임의의 점에서 해를 계산할 수 있는 구조체를 반환합니다. 위에 열거된 구문에 나와 있는 입력 인수를 원하는 대로 조합하여 사용할 수 있습니다.

예제

모두 축소

모순 없는 초기 조건을 계산하고 ode15i를 사용하여 음함수 ODE를 풉니다.

바이징거 방정식은 다음과 같습니다.

ty2(y)3-y3(y)2+t(t2+1)y-t2y=0.

이 방정식은 일반 형식 f(t,y,y)=0을 가지므로 ode15i 함수를 사용하여 음함수 미분방정식을 풀 수 있습니다.

방정식 코딩하기

방정식을 ode15i에 적합한 형식으로 코딩하려면 t, y, y에 대한 입력값을 가지며 방정식의 잔차 값을 반환하는 함수를 작성해야 합니다. 함수 @weissinger는 이 방정식을 인코딩합니다. 함수 파일을 확인합니다.

type weissinger
res = t*y^2 * yp^3 - y^3 * yp^2 + t*(t^2 + 1)*yp - t^2 * y;

모순 없는 초기 조건 계산

ode15i 솔버에는 모순 없는 초기 조건이 필요합니다. 즉, 솔버에 입력되는 초기 조건이 다음을 충족해야 합니다.

f(t0,y,y)=0.

모순 있는 초기 조건을 입력하는 것이 가능하며 ode15i는 모순 여부를 검사하지 않으므로 헬퍼 함수 decic를 사용하여 조건을 계산하는 것이 좋습니다. decic는 일부 지정된 변수를 고정 값으로 유지하고 고정되지 않은 변수에 대해 모순 없는 초기값을 계산합니다.

이 경우에는 초기값 y(t0)=32을 고정하고 decic가 도함수 y(t0)에 대해 초기 추측값 y(t0)=0부터 시작하여 모순 없는 초기값을 계산하도록 합니다.

t0 = 1;
y0 = sqrt(3/2);
yp0 = 0;
[y0,yp0] = decic(@weissinger,t0,y0,1,yp0,0)
y0 = 1.2247
yp0 = 0.8165

방정식 풀기

decic가 반환한 모순 없는 초기 조건을 ode15i에 사용하여 시간 구간 [110]에 대해 ODE를 풉니다.

[t,y] = ode15i(@weissinger,[1 10],y0,yp0);

결과 플로팅하기

이 ODE의 엄밀해는 다음과 같습니다.

y(t)=t2+12.

ode15i가 해석적 해 ytrue에 대해 계산한 수치 해 y를 플로팅합니다.

ytrue = sqrt(t.^2 + 0.5);
plot(t,y,'*',t,ytrue,'-o')
legend('ode15i', 'exact')

이 예제에서는 연립 ODE를 완전한 음함수 연립미분대수방정식(DAE)으로 나타냅니다. hb1ode.m에 작성된 로버트슨 문제는 경직성(Stiff) ODE를 푸는 프로그램에서 볼 수 있는 전형적인 테스트 문제입니다. 연립방정식은 다음과 같습니다.

$$\begin{array}{cl} y'_1 &= -0.04y_1 + 10^4 y_2y_3\\ y'_2 &= 0.04y_1 -
10^4 4y_2y_3-(3 \times 10^7)y_2^2\\ y'_3 &= (3 \times
10^7)y_2^2.\end{array}$$

hb1ode는 정상 상태에 대해 초기 조건 $y_1 = 1$, $y_2 = 0$, $y_3 = 0$을 사용하여 이 연립 ODE를 풉니다. 하지만, 이 방정식은 다음과 같은 선형 보존 법칙도 충족합니다.

$$y'_1 + y'_2 + y'_3 = 0.$$

해 및 초기 조건에 대해 다음과 같은 보존 법칙이 성립합니다.

$$y_1 + y_2 + y_3 = 1.$$

이 문제는 보존 법칙을 사용하여 $y_3$의 상태를 결정하는 연립 DAE로 재작성할 수 있습니다. 그렇게 하면 문제를 음함수 연립 DAE로 나타내게 됩니다.

$$\begin{array}{cl} 0 &= y'_1 +0.04y_1 - 10^4 y_2y_3\\ 0 &= y'_2 -0.04y_1
+ 10^4 y_2y_3+(3 \times 10^7)y_2^2\\ 0 &= y_1 + y_2 + y_3 -
1.\end{array}$$

함수 robertsidae는 이 연립 DAE를 담고 있습니다.

function res = robertsidae(t,y,yp)
res = [yp(1) + 0.04*y(1) - 1e4*y(2)*y(3);
   yp(2) - 0.04*y(1) + 1e4*y(2)*y(3) + 3e7*y(2)^2;
   y(1) + y(2) + y(3) - 1];

이 로버트슨 문제 만들기에 대한 전체 예제 코드는 ihb1dae.m에서 확인할 수 있습니다.

허용오차와 $\partial f / \partial y'$의 값을 설정합니다.

options = odeset('RelTol',1e-4,'AbsTol',[1e-6 1e-10 1e-6], ...
   'Jacobian',{[],[1 0 0; 0 1 0; 0 0 0]});

추측값에서 모순 없는 초기 조건을 계산해 내려면 decic를 사용하십시오. 이 문제를 반명시적(semi-explicit) 연립 DAE로 나타내는 hb1dae.mode15s에서 구한 것과 동일한 모순 없는 초기 조건을 갖도록 y0의 처음 두 개의 성분을 수정합니다.

y0 = [1; 0; 1e-3];
yp0 = [0; 0; 0];
[y0,yp0] = decic(@robertsidae,0,y0,[1 1 0],yp0,[],options);

ode15i를 사용하여 연립 DAE를 풉니다.

tspan = [0 4*logspace(-6,6)];
[t,y] = ode15i(@robertsidae,tspan,y0,yp0,options);

해 성분을 플로팅합니다. 두 번째 해 성분이 다른 해 성분보다 상대적으로 작으므로 플로팅하기 전에 이 성분에 1e4를 곱합니다.

y(:,2) = 1e4*y(:,2);
semilogx(t,y)
ylabel('1e4 * y(:,2)')
title('Robertson DAE problem with a Conservation Law, solved by ODE15I')

입력 인수

모두 축소

풀려는 함수로, 적분할 함수를 정의하는 함수 핸들로 지정됩니다.

스칼라 t와 열 벡터 yyp에 대한 함수 f = odefun(t,y,yp)f(t,y,y')에 대응하는, single 또는 double 데이터형의 열 벡터 f를 반환해야 합니다. odefunt, y, yp에 대한 입력값 중 하나가 함수에 사용되지 않는 경우에도 이들에 대한 입력값 3개를 받아야 합니다.

예를 들어, y'y=0을 풀려면 다음 함수를 사용해야 합니다.

function f = odefun(t,y,yp)
f = yp - y;

연립방정식에 대한 odefun의 출력값은 벡터입니다. 각 방정식은 해 벡터의 요소가 됩니다. 예를 들어 다음을 풀려면

y'1y2=0y'2+1=0,

다음 함수를 사용해야 합니다.

function dy = odefun(t,y,yp)
dy = zeros(2,1);
dy(1) = yp(1)-y(2);
dy(2) = yp(2)+1;

함수 odefun에 추가 파라미터를 제공하는 방법에 대한 자세한 내용은 함수를 파라미터화하기 항목을 참조하십시오.

예: @myFcn

데이터형: function_handle

적분 구간으로, 벡터로 지정됩니다. 최소한, tspan은 초기 시간과 최종 시간을 지정하는, 요소를 2개 가진 벡터 [t0 tf]여야 합니다. t0tf 사이 특정 시간에서의 해를 구하려면 [t0,t1,t2,...,tf] 형식의 더 긴 벡터를 사용해야 합니다. tspan의 요소는 모두 증가하거나 모두 감소해야 합니다.

솔버는 초기 시간 tspan(1)y0으로 주어진 초기 조건을 적용하고 tspan(1)에서 tspan(end)까지의 구간에 대해 적분을 계산합니다.

  • tspan이 두 개의 요소 [t0 tf]를 갖는 경우, 솔버는 구간 내 각 내부 적분 스텝에서 계산된 해를 반환합니다.

  • tspan이 세 개 이상의 요소 [t0,t1,t2,...,tf]를 갖는 경우 솔버는 지정된 지점에서 계산된 해를 반환합니다. 하지만, 솔버가 tspan에 지정된 각 지점으로 정확하게 이동하는 것은 아닙니다. 대신에 솔버는 자체 내부 스텝을 사용하여 해를 계산한 다음에 tspan의 요청된 지점에서 해를 계산합니다. 지정된 지점에서 구해진 해는 각 내부 스텝에서 계산된 해와 동일한 정도의 정확성을 가집니다.

    중간 지점을 여러 개 지정해도 계산의 효율성에는 거의 영향을 미치지 않지만 대규모 방정식 시스템의 경우에는 메모리 관리에 영향을 미칠 수 있습니다.

tspan의 값은 다음과 같이 솔버가 InitialStepMaxStep에 적합한 값을 계산하는 데 사용됩니다.

  • tspan에 여러 개의 중간 지점 [t0,t1,t2,...,tf]가 있는 경우 지정된 지점은 문제의 크기를 나타내며, 이는 솔버에서 사용되는 InitialStep의 값에 영향을 미칠 수 있습니다. 따라서, 솔버에서 구한 해는 tspan을 요소를 2개 가진 벡터, 또는 중간 지점을 갖는 벡터로 지정하는지 여부에 따라 달라질 수 있습니다.

  • tspan의 초기값과 최종 값은 최대 스텝 크기 MaxStep을 계산하는 데 사용됩니다. 따라서, tspan에서 초기값이나 최종 값을 변경하면 솔버가 다른 스텝 시퀀스를 사용하게 되어 해가 바뀔 수 있습니다.

예: [1 10]

예: [1 3 5 7 9 10]

데이터형: single | double

y의 초기 조건으로, 벡터로 지정됩니다. y0odefun에 정의된 각 방정식에 대한 초기 조건을 포함하도록 y0odefun의 벡터 출력값과 길이가 동일해야 합니다.

y0yp0의 초기 조건은 모순되지 않아야 합니다. 즉, f(t0,y0,y'0)=0이 되어야 합니다. decic 함수를 사용하여 추측값에 가까운 모순 없는 초기 조건을 계산할 수 있습니다.

데이터형: single | double

y’의 초기 조건으로, 벡터로 지정됩니다. yp0odefun에 정의된 각 변수에 대한 초기 조건을 포함하도록 yp0odefun의 벡터 출력값과 길이가 동일해야 합니다.

y0yp0의 초기 조건은 모순되지 않아야 합니다. 즉, f(t0,y0,y'0)=0이 되어야 합니다. decic 함수를 사용하여 추측값에 가까운 모순 없는 초기 조건을 계산할 수 있습니다.

데이터형: single | double

options 구조체로, 구조체형 배열로 지정됩니다. odeset 함수를 사용하여 options 구조체를 만들거나 수정할 수 있습니다.

각 ODE 솔버와 호환되는 옵션 목록을 보려면 ODE 옵션 요약 항목을 참조하십시오.

예: options = odeset('RelTol',1e-5,'Stats','on','OutputFcn',@odeplot)1e-5의 상대 허용오차를 지정하고, 솔버 통계량 표시를 설정하고, 해가 계산될 때 해를 플로팅하도록 출력 함수 @odeplot을 지정합니다.

데이터형: struct

출력 인수

모두 축소

계산 지점으로, 열 벡터로 반환됩니다.

  • tspan이 두 개의 요소 [t0 tf]를 포함하는 경우 t는 적분이 수행된 내부 계산 지점을 포함합니다.

  • tspan이 세 개 이상의 요소를 포함하는 경우 ttspan과 동일합니다.

해로, 배열로 반환됩니다. y의 각 행은 대응하는 t의 행에 반환된 값에서 계산된 해에 해당합니다.

이벤트 시간으로, 열 벡터로 반환됩니다. te의 이벤트 시간은 ye로 반환되는 해에 대응되며, ie는 발생한 이벤트를 지정합니다.

이벤트 발생 시 계산된 해로, 배열로 반환됩니다. te의 이벤트 시간은 ye로 반환되는 해에 대응되며, ie는 발생한 이벤트를 지정합니다.

트리거된 이벤트 함수의 인덱스로, 열 벡터로 반환됩니다. te의 이벤트 시간은 ye로 반환되는 해에 대응되며, ie는 발생한 이벤트를 지정합니다.

계산할 구조체로, 구조체형 배열로 반환됩니다. 이 구조체를 deval 함수와 함께 사용하여 구간 [t0 tf] 내에 있는 임의의 지점에서 해를 계산합니다. sol 구조체형 배열은 항상 다음 필드를 포함합니다.

구조체 필드설명

sol.x

솔버에서 선택한 스텝으로 구성된 행 벡터입니다.

sol.y

해입니다. 각 열 sol.y(:,i)에는 시간 sol.x(i)에서 계산된 해가 포함됩니다.

sol.solver

솔버 이름입니다.

또한, Events 옵션을 지정한 상태에서 이벤트가 발견되면 sol은 다음 필드도 포함합니다.

구조체 필드설명

sol.xe

이벤트가 발생한 지점입니다. sol.xe(end)는 종료 이벤트(있을 경우)의 정확한 지점을 포함합니다.

sol.ye

sol.xe의 이벤트에 대응하는 해입니다.

sol.ie

Events 옵션에 지정된 함수가 반환하는 벡터에 대한 인덱스입니다. 이러한 값은 솔버가 감지한 이벤트를 나타냅니다.

  • ode15i에 야코비 행렬을 제공하는 것이 안정성과 효율성적인 측면에서 매우 중요합니다. 또는 시스템이 크기가 큰 희소 행렬인 경우 야코비 행렬의 희소성 패턴을 제공하는 것도 솔버에 도움이 됩니다. 양쪽 어느 경우든 Jacobian 옵션이나 JPattern 옵션을 사용하여 행렬을 전달하려면 odeset을 사용하십시오.

알고리즘

ode15i는 차수가 1~5인 후진 미분 공식(BDF)을 기반으로 하는 가변 스텝, 가변 차수(VSVO) 솔버입니다. ode15i는 완전한 음함수 미분방정식과 지수-1 미분대수방정식(DAE)에 사용되도록 설계되었습니다. 헬퍼 함수 decicode15i에 사용하기에 적합한 모순 없는 초기 조건을 계산합니다[1].

참고 문헌

[1] Lawrence F. Shampine, “Solving 0 = F(t, y(t), y′(t)) in MATLAB,” Journal of Numerical Mathematics, Vol.10, No.4, 2002, pp. 291-310.

R2006a 이전에 개발됨