Main Content

상수 지연을 갖는 DDE

이 예제에서는 dde23을 사용하여 상수 지연을 갖는 DDE 시스템(지연 미분 방정식)을 푸는 방법을 보여줍니다.

연립방정식은 다음과 같습니다.

y1(t)=y1(t-1)y2(t)=y1(t-1)+y2(t-0.2)y3(t)=y2(t).

t0에 대한 내역 함수는 상수 y1(t)=y2(t)=y3(t)=1입니다.

방정식에서 시간 지연은 y 항에만 존재하고 지연 자체는 상수이므로 방정식의 형식은 상수 지연 연립방정식입니다.

MATLAB®에서 이 연립방정식을 풀려면 상수 지연을 갖는 시스템을 위한 지연 미분 방정식 솔버 dde23을 호출하기 전에 방정식, 지연 및 내역을 코딩해야 합니다. 필요한 함수를 이 예제와 같이 파일 끝에 로컬 함수로 포함시킬 수도 있고, MATLAB 경로에 있는 디렉터리에 이름이 지정된 별도의 파일로 저장할 수도 있습니다.

지연 코딩하기

먼저 연립방정식에서 지연을 정의하는 벡터를 만듭니다. 이 시스템에는 두 개의 다른 지연이 있습니다.

  • 첫 번째 성분 y1(t-1)의 지연 1.

  • 두 번째 성분 y2(t-0.2)의 지연 0.2.

dde23은 지연에 대한 벡터 인수를 받으며 벡터의 각 요소는 하나의 성분에 대한 상수 지연입니다.

lags = [1 0.2];

방정식 코딩하기

이제 방정식을 코딩하는 함수를 만듭니다. 이 함수는 시그니처 dydt = ddefun(t,y,Z)를 사용해야 합니다. 여기서,

  • t는 시간입니다(독립 변수).

  • y는 해입니다(종속 변수).

  • Z(:,j)는 지연 y(t-τj)의 근삿값을 계산하며, 여기서 상수 지연 τjlags(j)로 지정됩니다.

이 입력값은 솔버에 의해 자동으로 함수로 전달되지만 변수 이름에 따라 방정식 코딩 방식이 달라집니다. 이 경우:

  • Z(:,1) y1(t-1)

  • Z(:,2) y2(t-0.2)

function dydt = ddefun(t,y,Z)
  ylag1 = Z(:,1);
  ylag2 = Z(:,2);

  dydt = [ylag1(1); 
          ylag1(1)+ylag2(2); 
          y(2)];
end

참고: 모든 함수는 예제 끝에 로컬 함수로 포함되어 있습니다.

해 내역 코딩하기

다음으로 해 내역을 정의하는 함수를 만듭니다. 해 내역은 시간 tt0에 대한 해입니다.

function s = history(t)
  s = ones(3,1);
end

방정식 풀기

마지막으로 적분 구간 [t0 tf]를 정의하고 dde23 솔버를 사용하여 DDE를 풉니다.

tspan = [0 5];
sol = dde23(@ddefun, lags, @history, tspan);

해 플로팅하기

해 구조체 sol에는 솔버가 취하는 내부 시간 스텝과 그러한 각 시간에서의 해를 포함하는 sol.x 필드와 sol.y 필드가 있습니다. (특정 지점의 해가 필요한 경우 deval을 사용하여 특정 지점의 해를 구할 수 있습니다.)

시간에 대해 세 개의 해 성분을 플로팅합니다.

plot(sol.x,sol.y,'-o')
xlabel('Time t');
ylabel('Solution y');
legend('y_1','y_2','y_3','Location','NorthWest');

Figure contains an axes object. The axes object with xlabel Time t, ylabel Solution y contains 3 objects of type line. These objects represent y_1, y_2, y_3.

로컬 함수(Local Function)

여기 나열된 함수는 DDE 솔버 dde23이 해를 계산하기 위해 호출하는 로컬 헬퍼 함수입니다. 또는 이러한 함수를 MATLAB 경로에 있는 디렉터리에 고유의 파일로 저장할 수도 있습니다.

function dydt = ddefun(t,y,Z) % equation being solved
  ylag1 = Z(:,1);
  ylag2 = Z(:,2);

  dydt = [ylag1(1); 
          ylag1(1)+ylag2(2); 
          y(2)];
end
%-------------------------------------------
function s = history(t) % history function for t <= 0
  s = ones(3,1);
end
%-------------------------------------------

참고 항목

| | |

관련 항목