Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

단일 PDE 풀기

이 예제에서는 단일 PDE의 해를 정식화, 계산 및 플로팅하는 방법을 보여줍니다.

다음과 같은 편미분 방정식을 보겠습니다.

π2ut=2ux2.

방정식은 시간 t0에 대한 구간 0x1에서 정의되었습니다. t=0에서 해는 다음과 같은 초기 조건을 충족합니다.

u(x,0)=sin(πx).

또한 x=0x=1에서 해는 다음과 같은 경계 조건을 충족합니다.

u(0,t)=0,

πe-t+ux(1,t)=0.

MATLAB에서 이 방정식을 풀려면 방정식, 초기 조건 및 경계 조건을 코딩하고 적합한 해 메시를 선택한 후에 솔버 pdepe를 호출해야 합니다. 필요한 함수를 이 예제와 같이 파일 끝에 로컬 함수로 포함시킬 수도 있고, MATLAB 경로에 있는 디렉터리에 이름이 지정된 별도의 파일로 저장할 수도 있습니다.

방정식 코딩하기

방정식을 코딩하려면 먼저 pdepe 솔버에서 요구하는 형식으로 방정식을 다시 작성해야 합니다. pdepe에서 요구하는 표준 형식은 다음과 같습니다.

c(x,t,u,ux)ut=x-mx(xmf(x,t,u,ux))+s(x,t,u,ux).

이 표준 형식으로 작성된 PDE는 다음과 같습니다.

π2ut=x0x(x0ux)+0.

방정식을 적절한 형식으로 작성하면 관련 항을 다음과 같이 파악할 수 있습니다.

m=0

c(x,t,u,ux)=π2

f(x,t,u,ux)=ux

s(x,t,u,ux)=0

이제 방정식을 코딩하는 함수를 만들 수 있습니다. 이 함수에는 시그니처 [c,f,s] = pdex1pde(x,t,u,dudx)가 있어야 합니다.

  • x는 독립적 공간 변수입니다.

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

  • uxt에 따라 미분되는 종속 변수입니다.

  • dudx는 편미분 공간 도함수 u/x입니다.

  • 출력값 c, fspdepe에서 요구하는 표준 PDE 방정식 형식의 계수에 대응합니다. 이 계수는 입력 변수 x, t, ududx를 사용해 코딩됩니다.

그 결과, 이 예제의 방정식은 다음과 같은 함수로 표현할 수 있습니다.

function [c,f,s] = pdex1pde(x,t,u,dudx)
c = pi^2;
f = dudx;
s = 0;
end

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

초기 조건 코딩하기

이제 초기 조건을 반환하는 함수를 작성합니다. 초기 조건은 첫 번째 시간 값 tspan(1)에서 적용됩니다. 이 함수에는 시그니처 u0 = pdex1ic(x)가 있어야 합니다.

대응하는 함수는 다음과 같습니다.

function u0 = pdex1ic(x)
u0 = sin(pi*x);
end

경계 조건 코딩하기

이제 경계 조건을 계산하는 함수를 작성합니다. 구간 axb에 있는 문제의 경우, 경계 조건은 모든 t, 그리고 x=a 또는 x=b에 적용됩니다. 솔버에서 요구하는 경계 조건의 표준 형식은 다음과 같습니다.

p(x,t,u)+q(x,t)f(x,t,u,ux)=0.

경계 조건을 이 표준 형식으로 다시 작성하고 계수 값을 파악해 봅니다.

x=0인 경우, 방정식은 다음과 같습니다.

u(0,t)=0u+0ux=0.

계수는 다음과 같습니다.

  • p(0,t,u)=u

  • q(0,t)=0

x=1인 경우, 방정식은 다음과 같습니다.

πe-t+ux(1,t)=0πe-t+1ux(1,t)=0.

계수는 다음과 같습니다.

  • p(1,t,u)=πe-t

  • q(1,t)=1

경계 조건 함수는 f(x,t,u,ux)로 표현되고 이 항은 이미 메인 PDE 함수에 정의되어 있으므로, 경계 조건 함수에서는 방정식의 이 부분을 지정하지 않아도 됩니다. 각 경계에서 p(x,t,u)q(x,t)만 지정하면 됩니다.

경계 함수는 함수 시그니처 [pl,ql,pr,qr] = pdex1bc(xl,ul,xr,ur,t)를 사용해야 합니다.

  • 입력값 xlul은 왼쪽 경계의 ux에 대응합니다.

  • 입력값 xrur은 오른쪽 경계의 ux에 대응합니다.

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

  • 출력값 plql은 왼쪽 경계(이 문제의 경우 x=0)의 p(x,t,u)q(x,t)에 대응합니다.

  • 출력값 prqr은 오른쪽 경계(이 문제의 경우 x=1)의 p(x,t,u)q(x,t)에 대응합니다.

이 예제의 경계 조건은 다음과 같은 함수로 표현됩니다.

function [pl,ql,pr,qr] = pdex1bc(xl,ul,xr,ur,t)
pl = ul;
ql = 0;
pr = pi * exp(-t);
qr = 1;
end

해 메시 선택하기

방정식을 풀기 전에 pdepe가 해를 계산할 메시 점 (t,x)를 지정해야 합니다. 벡터 tx로 점을 지정합니다. 벡터 tx는 솔버에서 각각 다른 역할을 수행합니다. 특히, 해에 대한 비용과 정확도는 벡터 x의 길이에 크게 종속됩니다. 하지만, 이 계산은 벡터 t의 값에 훨씬 덜 민감합니다.

이 문제의 경우, 공간 구간 [0,1]에 균일한 간격으로 배치된 20개 지점과 시간 구간 [0,2]에 있는 t의 5개 값으로 구성된 메시를 사용합니다.

x = linspace(0,1,20);
t = linspace(0,2,5);

방정식 풀기

마지막으로 대칭 m, PDE 방정식, 초기 조건, 경계 조건, xt에 대한 메시를 사용하여 방정식을 풉니다.

m = 0;
sol = pdepe(m,@pdex1pde,@pdex1ic,@pdex1bc,x,t);

pdepe는 3차원 배열 sol로 해를 반환합니다. 여기서 sol(i,j,k)t(i)x(j)에서 구한 해의 k번째 성분 uk에 대한 근삿값을 계산합니다. u0이 각 해 성분에 초기 조건을 지정하므로, sol의 크기는 length(t)×length(x)×length(u0)입니다. 이 문제의 경우 u에 성분이 하나뿐이므로 sol은 5×20 행렬이지만, 일반적으로 명령 u = sol(:,:,k)를 사용하여 k번째 해 성분을 추출할 수 있습니다.

sol에서 첫 번째 해 성분을 추출합니다.

u = sol(:,:,1);

해 플로팅하기

해의 곡면 플롯을 만듭니다.

surf(x,t,u)
title('Numerical solution computed with 20 mesh points')
xlabel('Distance x')
ylabel('Time t')

다음과 같이 이 문제의 해석적 해를 얻을 수 있도록 초기 조건과 경계 조건이 선택되었습니다.

u(x,t)=e-tsin(πx).

동일한 메시 점으로 해석적 해를 플로팅합니다.

surf(x,t,exp(-t)'*sin(pi*x))
title('True solution plotted with 20 mesh points')
xlabel('Distance x')
ylabel('Time t')

이제 t의 최종 값 tf에서 수치 해와 해석적 해를 비교합니다. 이 예제에서는 tf=2입니다.

plot(x,u(end,:),'o',x,exp(-t(end))*sin(pi*x))
title('Solution at t = 2')
legend('Numerical, 20 mesh points','Analytical','Location','South')
xlabel('Distance x')
ylabel('u(x,2)')

로컬 함수(Local Function)

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

function [c,f,s] = pdex1pde(x,t,u,dudx) % Equation to solve
c = pi^2;
f = dudx;
s = 0;
end
%----------------------------------------------
function u0 = pdex1ic(x) % Initial conditions
u0 = sin(pi*x);
end
%----------------------------------------------
function [pl,ql,pr,qr] = pdex1bc(xl,ul,xr,ur,t) % Boundary conditions
pl = ul;
ql = 0;
pr = pi * exp(-t);
qr = 1;
end
%----------------------------------------------

참고 항목

관련 항목