2010년 7월 23일 금요일

델타함수 그래프 그리기

코사인 함수의 푸리에 변환은 두 델타함수의 합으로 나타난다. 하지만, 그래프로 그리면 델타함수의 피크를 볼 수 없다.
FourierTransform[Cos[1.1 t], t, ω]
% // Plot[#, {ω, -3, 3}] &


코사인 함수의 푸리에 변환으로 얻은 함수에는 그래프로 그리기 어려운 두 가지 이유가 있다. 먼저, 델타함수는 인자를 0으로 만드는 지점에서 무한대로 발산하므로 그래프로 표현하기 어렵다. 관례적으로, 델타함수를 그래프로 그릴 땐 발산 점에서 델타함수의 값을 1로 대체해서 그래프를 그린다. 즉, DiracDeltaDiscreteDelta로 치환하면 된다. 또한, 델타함수는 연속함수가 아니어서 Plot이 발산 점을 찾아내어 그려주지도 못하는데, 이 문제는 발산 점을 포함하는 목록을 만들어서 함수 자료에 발산 점이 꼭 들어가게 하여 해결한다.
FourierTransform[Cos[1.1 t], t, ω]
% /. DiracDelta[x_] :> DiscreteDelta[x]
% // Table[{ω, #}, {ω, -3, 3, 0.001}] & //
 ListPlot[#, Joined -> True] &
이번에도 그래프엔 아무것도 나타나지 않는다. 진법 변환 오차 때문에 발생하는 문제로, DiracDelta[1.1 - (1.099 + 0.011)]를 실행해보면 1이 아닌 0이 나오는 것을 알 수 있다. 컴퓨터는 1.100과 1.099+0.001을 다른 수로 본다. 십진수로 입력한 수는 일단 이진수로 바뀌는데, 십진수 실수 중에는 이진수로 변환했을 때 무한소수가 되는 수가 있다. 예를 들어, 1.100은 이진수로 표현하면 소수점 아래 두 번째부터 다섯 번째까지가 반복하는 무한소수가 된다.
BaseForm[1.100, 2]

컴퓨터는 저장공간의 제약으로 무한소수를 일정 자리에서 버림하여 저장하는데, 이때 입력받은 십진수와 저장된 이진수 사이에 차이가 발생하게 된다. Rationalize를 이용해서 모든 수를 정수로 표현하면 이러한 문제를 없앨 수 있다.
FourierTransform[Cos[1.1 t], t, ω]
% /. DiracDelta[x_] :> 
  Hold@DiscreteDelta@Rationalize@Unevaluated@x
% // Table[{x, # /. ω -> x}, {x, -3, 3, 0.001}] & //
  ReleaseHold // ListPlot[#, Joined -> True] &

댓글 없음:

댓글 쓰기