Main Content

decic

ode15i에 대한 모순 없는 초기 조건(consistent Initial Condition) 계산

설명

예제

[y0_new,yp0_new] = decic(odefun,t0,y0,fixed_y0,yp0,fixed_yp0)은 완전 음함수 odefun의 초기 조건에 대한 추측값으로 y0yp0을 사용하고, fixed_y0fixed_yp0으로 지정된 성분을 고정된 값으로 유지한 후 고정되지 않은 성분에 대한 값을 계산합니다. 그 결과로 모순 없는 초기 조건의 전체 세트가 반환됩니다. 새 값인 yo_newyp0_newodefun(t0,y0_new,yp0_new) = 0을 충족하므로 ode15i에 초기 조건으로 사용하는 데 적합합니다.

[y0_new,yp0_new] = decic(odefun,t0,y0,fixed_y0,yp0,fixed_yp0,options)는 옵션 구조체 options를 사용하여 AbsTolRelTol에 대한 값도 지정합니다. odeset을 사용하여 옵션 구조체를 만듭니다.

[y0_new,yp0_new,resnrm] = decic(___)odefun(t0,y0_new,yp0_new)의 노름을 resnrm으로 반환합니다. 노름이 너무 큰 듯한 경우 options를 사용하여 상대 허용오차 RelTol(디폴트 값: 1e-3)을 줄입니다.

예제

모두 축소

다음과 같은 음함수 연립방정식이 있다고 가정해 보겠습니다.

0=2y1-y20=y1+y2

이러한 방정식은 변수에 대한 모순 없는 초기 조건을 간단히 읽어 들일 수 있을 정도로 매우 간단합니다. 예를 들어, y1=1로 고정하는 경우 두 번째 방정식에 따라 y2=-1이 되고, 첫 번째 방정식에 따라 y1=-1/2이 됩니다. 이러한 y1, y1, y2 값은 방정식을 충족하므로 모순이 없습니다.

y1=1로 값을 고정한 상태로 decic를 통해 이들 값을 확인하여 방정식에 대한 모순 없는 초기 조건을 계산합니다. 추측값으로 y0 = [1 0]yp0 = [0 0]을 사용합니다. 이들 값은 방정식을 충족하지 않으므로 모순됩니다.

odefun = @(t,y,yp) [2*yp(1)-y(2); y(1)+y(2)];
t0 = 0;
y0 = [1 0];
yp0 = [0 0];
[y0,yp0] = decic(odefun,t0,y0,[1 0],yp0,[])
y0 = 2×1

     1
    -1

yp0 = 2×1

   -0.5000
         0

모순 없는 초기 조건을 계산하고 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
function res = weissinger(t,y,yp)
%WEISSINGER  Evaluate the residual of the Weissinger implicit ODE
%
%   See also ODE15I.

%   Jacek Kierzenka and Lawrence F. Shampine
%   Copyright 1984-2014 The MathWorks, Inc.

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에 사용하여 시간 구간 [1 10]에 대해 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')

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent ode15i, exact.

입력 인수

모두 축소

풀려는 함수로, 함수 핸들로 지정되며 적분될 함수를 정의합니다. odefunode15i를 사용하여 풀려는 음함수 연립미분방정식을 나타냅니다.

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

예를 들어, 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

초기 시간으로, 스칼라로 지정됩니다. decic는 초기 시간을 사용하여 odefun(t0,y0_new,yp0_new) = 0을 충족하는 모순 없는 초기 조건을 계산합니다.

데이터형: single | double

y 성분에 대한 초기 추측값으로, 벡터로 지정됩니다. y0의 각 요소는 odefun으로 정의된 연립방정식에서 하나의 종속 변수 yn에 대한 초기 조건을 지정합니다.

데이터형: single | double

고정된 값으로 유지할 y 성분으로, 1과 0으로 구성된 벡터나 []로 지정됩니다.

  • y0(i)에 대한 추측값의 변경이 허용되지 않는 경우 fixed_y0(i) = 1을 설정합니다.

  • 항목을 변경할 수 있는 경우 fixed_y0 = []을 설정합니다.

성분 고정 시에는 length(yp0)개를 초과하여 고정할 수 없습니다. 특정 문제에 따라 y0 또는 yp0의 특정 성분을 고정하는 것이 가능하지 않은 경우도 있습니다. 따라서 필요한 성분 이외의 성분은 고정하지 않는 것이 좋습니다.

y' 성분에 대한 초기 추측값으로, 벡터로 지정됩니다. yp0의 각 요소는 odefun으로 정의된 연립방정식에서 한 개의 미분된 종속 변수 y'n에 대한 초기 조건을 지정합니다.

데이터형: single | double

고정된 값으로 유지할 y' 성분으로, 1과 0으로 구성된 벡터나 []로 지정됩니다.

  • yp0(i)에 대한 추측값의 변경이 허용되지 않는 경우 fixed_yp0(i) = 1을 설정합니다.

  • 항목을 변경할 수 있는 경우 fixed_yp0 = []을 설정합니다.

성분 고정 시에는 length(yp0)개를 초과하여 고정할 수 없습니다. 특정 문제에 따라 y0 또는 yp0의 특정 성분을 고정하는 것이 가능하지 않은 경우도 있습니다. 따라서 필요한 성분 이외의 성분은 고정하지 않는 것이 좋습니다.

options 구조체로, 구조체형 배열로 지정됩니다. odeset 함수를 사용하여 options 구조체를 만들거나 수정할 수 있습니다. decic 함수에 사용할 수 있는 관련 옵션으로는 RelTolAbsTol이 있습니다. 이들 옵션은 초기 조건을 계산하는 데 사용되는 오차 임계값을 제어합니다.

예: options = odeset('RelTol',1e-5)

데이터형: struct

출력 인수

모두 축소

y0에 대한 모순 없는 초기 조건으로, 벡터로 반환됩니다. resnrm의 값이 작으면 yo_newyp0_newodefun(t0,y0_new,yp0_new) = 0을 충족하므로 ode15i에 초기 조건으로 사용하는 데 적합합니다.

yp0에 대한 모순 없는 초기 조건으로, 벡터로 반환됩니다. resnrm의 값이 작으면 yo_newyp0_newodefun(t0,y0_new,yp0_new) = 0을 충족하므로 ode15i에 초기 조건으로 사용하는 데 적합합니다.

잔차의 노름으로, 벡터로 반환됩니다. resnrmodefun(t0,y0_new,yp0_new)의 노름입니다.

  • resnrm의 값이 작은 경우 이는 decicodefun(t0,y0_new,yp0_new) = 0을 충족하는 모순 없는 초기 조건을 성공적으로 계산했음을 나타냅니다.

  • resnrm의 값이 크면 options 입력값을 사용하여 오차 임계값 RelTolAbsTol을 조정해 보십시오.

  • ihb1dae 예제 파일과 iburgersode 예제 파일은 ode15i를 사용하여 해를 구하기 전에 decic를 사용하여 모순 없는 초기 조건을 계산합니다. edit ihb1daeedit iburgersode를 입력하여 코드를 봅니다.

  • decic를 추가로 사용하여 ode15sode23t로 해를 구하는 DAE에 대한 모순 없는 초기 조건을 계산할 수 있습니다. 이렇게 하려면 다음 단계를 따르십시오.

    1. 완전 음함수 형식인 f(t,y,y') = 0으로 연립방정식을 다시 작성합니다.

    2. decic를 호출하여 방정식에 대한 모순 없는 초기 조건을 계산합니다.

    3. 솔버 호출 시 초기 조건으로 y0_new를 지정하고 odesetInitialSlope 옵션 값으로 yp_new를 지정합니다.

버전 내역

R2006a 이전에 개발됨

참고 항목

| |