Main Content

Z 변환을 사용하여 차분 방정식 풀기

Symbolic Math Toolbox™에서 다음 워크플로로 Z 변환을 사용하여 차분 방정식을 풉니다. Z 변환에 대한 간단한 예제는 ztrans 항목과 iztrans 항목을 참조하십시오.

정의: Z 변환

함수 f(n)의 Z 변환은 다음과 같이 정의됩니다.

F(z)=n=0f(n)zn.

개념: 기호 워크플로 사용하기

기호 워크플로에서는 계산을 수치 형식이 아닌 자연적인 기호 형식으로 유지합니다. 이 접근 방식은 해의 속성을 이해하고 정확한 기호 값을 사용하게 해줍니다. 수치 결과가 필요할 때나 기호적으로 진행할 수 없을 때만 기호 변수에 숫자를 대입합니다. 자세한 내용은 수치 연산방식 또는 기호 연산방식 선택하기 항목을 참조하십시오. 일반적으로 단계는 다음과 같습니다.

  1. 방정식을 선언합니다.

  2. 방정식을 풉니다.

  3. 값을 대입합니다.

  4. 결과를 플로팅합니다.

  5. 결과를 분석합니다.

워크플로: Z 변환을 사용하여 "토끼 증가" 문제 풀기

방정식 선언하기

Z 변환을 사용하여 잘 알려진 "토끼 증가" 문제와 같은 차분 방정식을 풀 수 있습니다. 한 쌍의 토끼가 1년 만에 완전히 자라서 매년 한 쌍의 토끼를 낳는다면, n년 후에 토끼 개체수 p(n)은 다음 차분 방정식으로 기술됩니다.

p(n+2)=p(n+1)+p(n)

우변이 0이라고 가정하고 방정식을 표현식으로 선언합니다. n은 햇수를 나타내므로 n이 양의 정수라고 가정합니다. 이 가정이 결과를 단순화합니다.

syms p(n) z
assume(n>=0 & in(n,"integer"))
f = p(n+2) - p(n+1) - p(n)
f = p(n+2)-p(n+1)-p(n)

방정식 풀기

방정식의 Z 변환을 구합니다.

fZT = ztrans(f,n,z)
fZT = zp(0)-zztrans(p(n),n,z)-zp(1)+z2ztrans(p(n),n,z)-z2p(0)-ztrans(p(n),n,z)

함수 solve는 기호 변수에 대해서만 방정식을 풉니다. 따라서 solve를 사용하려면 먼저 ztrans(p(n),n,z)에 변수 pZT를 대입합니다.

syms pZT
fZT = subs(fZT,ztrans(p(n),n,z),pZT)
fZT = zp(0)-pZT-zp(1)-pZTz-z2p(0)+pZTz2

pZT에 대해 방정식을 풉니다.

pZT = solve(fZT,pZT)
pZT = 

-zp(1)-zp(0)+z2p(0)-z2+z+1

pZT의 Z 역변환을 계산하여 p(n)을 계산합니다. 결과를 단순화합니다.

pSol = iztrans(pZT,z,n);
pSol = simplify(pSol)
pSol = 

2-1n/2p(1)cos(nπ2+asin(12i))+22-n55+1n-1σ15-221-n51-5n-1σ15where  σ1=p(0)2-p(1)

값 대입하기

결과를 플로팅하려면 먼저 초기 조건의 값에 대입합니다. p(0)p(1)을 각각 12이 되게 합니다.

pSol = subs(pSol,[p(0) p(1)],[1 2])
pSol = 

4-1n/2cos(nπ2+asin(12i))-322-n55+1n-110+321-n51-5n-15

결과 플로팅하기

pSol을 플로팅하여 시간에 따른 토끼 개체수의 증가를 보여줍니다.

nValues = 1:10;
pSolValues = subs(pSol,n,nValues);
pSolValues = double(pSolValues);
pSolValues = real(pSolValues);
stem(nValues,pSolValues)
title("Rabbit Population")
xlabel("Years (n)")
ylabel("Population p(n)")
grid on

결과 분석하기

이 플롯을 보면 해가 기하급수적으로 증가하는 것처럼 나타납니다. 그러나 해 pSol에는 많은 항이 포함되어 있으므로 이 동작을 발생시키는 항을 구하려면 분석이 필요합니다.

pSol의 모든 함수는 exp로 표현될 수 있으므로 pSolexp로 재작성합니다. 추가적인 80개의 단순화 단계를 수행하는 simplify를 사용하여 결과를 단순화합니다. 이제 pSol을 분석할 수 있습니다.

pSol = rewrite(pSol,"exp");
pSol = simplify(pSol,"Steps",80)
pSol = 

22n5-1n+21-5n2n-655+1n52n5+1-651-5n52n5-1

pSol을 시각적으로 검토합니다. pSol은 항들의 합이라는 점을 알 수 있습니다. 각 항은 n이 증가함에 따라 증가하거나 감소할 수 있는 비율입니다. 각 항에 대해 몇 가지 방법으로 이 가설을 확인할 수 있습니다.

  • limit을 사용하여 n = Inf에서의 극한이 0 또는 Inf에 가까워지는지 확인합니다.

  • 증가하는 n에 대한 항을 플로팅하고 동작을 확인합니다.

  • 큰 값 n에서 값을 계산합니다.

문제를 단순화하기 위해 세 번째 방법을 사용해 봅니다. n = 100에서 항을 계산한 다음, 그 방법을 검증합니다. 먼저 children을 사용하여 개별 항을 구하고 n에 값을 대입하고 double형으로 변환합니다.

pSolTerms = children(pSol);
pSolTerms = [pSolTerms{:}];
pSolTermsDbl = subs(pSolTerms,n,100);
pSolTermsDbl = double(pSolTermsDbl)
pSolTermsDbl = 1×4
1021 ×

    1.5841    0.0000   -0.6568   -0.0000

결과를 보면 어떤 항은 0이고 다른 항은 크기가 큼을 알 수 있습니다. 크기가 큰 항이 지수 동작을 발생시킨다는 가설을 세웁니다. 이 항들로 pSol의 근사치를 계산합니다.

idx = abs(pSolTermsDbl)>1; % use arbitrary cutoff
pApprox = pSolTerms(idx);
pApprox = sum(pApprox)
pApprox = 

22n5-1n-655+1n52n5+1

pSolpApprox 사이의 근사오차를 플로팅하여 가설을 검증합니다. 예상대로 n이 증가함에 따라 오차는 0에 가까워집니다. 이 결과는 기호 계산이 문제를 분석하는 데 어떻게 도움이 되는지 보여줍니다.

Perror = pSol - pApprox;
nValues = 1:30;
Perror = subs(Perror,n,nValues);
stem(nValues,Perror)
xlabel("Years (n)")
ylabel("Error (pSol - pApprox)")
title("Error in Approximation")

참고 문헌

[1] Andrews, L.C., Shivamoggi, B.K., Integral Transforms for Engineers and Applied Mathematicians, Macmillan Publishing Company, New York, 1986

[2] Crandall, R.E., Projects in Scientific Computation, Springer-Verlag Publishers, New York, 1994

[3] Strang, G., Introduction to Applied Mathematics, Wellesley-Cambridge Press, Wellesley, MA, 1986