이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.
Z 변환을 사용하여 차분 방정식 풀기
Symbolic Math Toolbox™에서 다음 워크플로로 Z 변환을 사용하여 차분 방정식을 풉니다. Z 변환에 대한 간단한 예제는 ztrans
항목과 iztrans
항목을 참조하십시오.
정의: Z 변환
함수 f(n)의 Z 변환은 다음과 같이 정의됩니다.
개념: 기호 워크플로 사용하기
기호 워크플로에서는 계산을 수치 형식이 아닌 자연적인 기호 형식으로 유지합니다. 이 접근 방식은 해의 속성을 이해하고 정확한 기호 값을 사용하게 해줍니다. 수치 결과가 필요할 때나 기호적으로 진행할 수 없을 때만 기호 변수에 숫자를 대입합니다. 자세한 내용은 수치 연산방식 또는 기호 연산방식 선택하기 항목을 참조하십시오. 일반적으로 단계는 다음과 같습니다.
방정식을 선언합니다.
방정식을 풉니다.
값을 대입합니다.
결과를 플로팅합니다.
결과를 분석합니다.
워크플로: Z 변환을 사용하여 "토끼 증가" 문제 풀기
방정식 선언하기
Z 변환을 사용하여 잘 알려진 "토끼 증가" 문제와 같은 차분 방정식을 풀 수 있습니다. 한 쌍의 토끼가 1년 만에 완전히 자라서 매년 한 쌍의 토끼를 낳는다면, 년 후에 토끼 개체수 은 다음 차분 방정식으로 기술됩니다.
우변이 0
이라고 가정하고 방정식을 표현식으로 선언합니다. n
은 햇수를 나타내므로 n
이 양의 정수라고 가정합니다. 이 가정이 결과를 단순화합니다.
syms p(n) z assume(n>=0 & in(n,"integer")) f = p(n+2) - p(n+1) - p(n)
f =
방정식 풀기
방정식의 Z 변환을 구합니다.
fZT = ztrans(f,n,z)
fZT =
함수 solve
는 기호 변수에 대해서만 방정식을 풉니다. 따라서 solve
를 사용하려면 먼저 ztrans(p(n),n,z)
에 변수 pZT
를 대입합니다.
syms pZT
fZT = subs(fZT,ztrans(p(n),n,z),pZT)
fZT =
pZT
에 대해 방정식을 풉니다.
pZT = solve(fZT,pZT)
pZT =
pZT
의 Z 역변환을 계산하여 을 계산합니다. 결과를 단순화합니다.
pSol = iztrans(pZT,z,n); pSol = simplify(pSol)
pSol =
값 대입하기
결과를 플로팅하려면 먼저 초기 조건의 값에 대입합니다. p(0)
과 p(1)
을 각각 1
과 2
이 되게 합니다.
pSol = subs(pSol,[p(0) p(1)],[1 2])
pSol =
결과 플로팅하기
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
로 표현될 수 있으므로 pSol
을 exp
로 재작성합니다. 추가적인 80
개의 단순화 단계를 수행하는 simplify
를 사용하여 결과를 단순화합니다. 이제 pSol
을 분석할 수 있습니다.
pSol = rewrite(pSol,"exp"); pSol = simplify(pSol,"Steps",80)
pSol =
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 =
pSol
과 pApprox
사이의 근사오차를 플로팅하여 가설을 검증합니다. 예상대로 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