중립(Neutral) 유형의 DDE
이 예제에서는 ddensd
를 사용하여 중립 DDE(지연 미분 방정식)를 푸는 방법을 보여줍니다. 여기서 지연은 도함수 항에 나타납니다. 문제는 원래 Paul의 문헌 [1]에 나와 있습니다.
방정식은 다음과 같습니다.
.
내역 함수는 에 대해 입니다.
방정식의 항에 시간 지연이 있기 때문에 방정식을 중립 DDE라고 합니다. 시간 지연이 항에만 있는 경우에는 시간 지연의 형식에 따라 방정식은 상수 DDE이거나 상태 종속 DDE가 됩니다.
MATLAB®에서 이 방정식을 풀려면 지연 미분 방정식 솔버 ddensd
를 호출하기 전에 방정식, 지연 및 내역을 코딩해야 합니다. 이 함수를 이 예제와 같이 파일 끝에 로컬 함수로 포함시킬 수도 있고, MATLAB 경로에 있는 디렉터리에 별도의 파일로 저장할 수도 있습니다.
지연 코딩하기
먼저 방정식의 지연을 정의하는 함수를 작성합니다. 방정식에서 지연이 있는 첫 번째 항은 입니다.
function dy = dely(t,y) dy = t/2; end
방정식에서 지연이 있는 다른 항은 입니다.
function dyp = delyp(t,y) dyp = t-pi; end
이 예제에서는 에 대한 하나의 지연과 에 대한 하나의 지연만 존재합니다. 지연이 더 있는 경우에는 함수가 스칼라 대신 벡터를 반환하도록 동일한 함수 파일에서 지연을 추가할 수 있습니다.
참고: 모든 함수는 예제 끝에 로컬 함수로 포함되어 있습니다.
방정식 코딩하기
이제 방정식을 코딩하는 함수를 만듭니다. 이 함수는 시그니처 yp = ddefun(t,y,ydel,ypdel)
을 사용해야 합니다. 여기서,
t
는 시간입니다(독립 변수).y
는 해입니다(종속 변수).ydel
은 에 대한 지연을 포함합니다.ypdel
은 에 대한 지연을 포함합니다.
이 입력값은 자동으로 솔버에 의해 함수로 전달되지만 변수 이름에 따라 방정식 코딩 방식이 달라집니다. 이 경우:
ydel
ypdel
function yp = ddefun(t,y,ydel,ypdel) yp = 1 + y - 2*ydel^2 - ypdel; end
해 내역 코딩하기
다음으로 해 내역을 정의하는 함수를 만듭니다. 해 내역은 시간 에 대한 해입니다.
function y = history(t) y = cos(t); end
방정식 풀기
마지막으로 적분 구간 를 정의하고 ddensd
솔버를 사용하여 DDE를 풉니다.
tspan = [0 pi]; sol = ddensd(@ddefun, @dely, @delyp, @history, [0,pi]);
해 플로팅하기
해 구조체 sol
에는 솔버가 취하는 내부 시간 스텝과 그러한 각 시간에서의 해를 포함하는 sol.x
필드와 sol.y
필드가 있습니다. 그러나 deval
을 사용하여 특정 지점에서 해를 구할 수 있습니다.
0
과 pi
사이에서 간격이 균일한 점 100개에서의 해를 구합니다.
tn = linspace(0,pi,20); yn = deval(sol,tn);
해석적 해에 대해 계산된 해와 내역을 플로팅합니다.
th = linspace(-pi,0); yh = history(th); ta = linspace(0,pi); ya = cos(ta); plot(th,yh,tn,yn,'o',ta,ya) legend('History','Numerical','Analytical','Location','NorthWest') xlabel('Time t') ylabel('Solution y') title('Example of Paul with 1 Equation and 2 Delay Functions') axis([-3.5 3.5 -1.5 1.5])
로컬 함수(Local Function)
여기 나열된 함수는 DDE 솔버 ddensd
가 해를 계산하기 위해 호출하는 로컬 헬퍼 함수입니다. 또는 이러한 함수를 MATLAB 경로에 있는 디렉터리에 고유의 파일로 저장할 수도 있습니다.
function yp = ddefun(t,y,ydel,ypdel) % equation being solved yp = 1 + y - 2*ydel^2 - ypdel; end %------------------------------------------- function dy = dely(t,y) % delay for y dy = t/2; end %------------------------------------------- function dyp = delyp(t,y) % delay for y' dyp = t-pi; end %------------------------------------------- function y = history(t) % history function for t < 0 y = cos(t); end %-------------------------------------------
참고 문헌
[1] Paul, C.A.H. “A Test Set of Functional Differential Equations.” Numerical Analysis Reports. No. 243. Manchester, UK: Math Department, University of Manchester, 1994.
참고 항목
ddensd
| ddesd
| dde23
| deval