목차
Ⅰ. Mathematica ?
Ⅱ. 시작하기
Ⅲ. Fourier Transform & Laplace Transform
Ⅱ. 시작하기
Ⅲ. Fourier Transform & Laplace Transform
본문내용
] :=
ListPlot[Abs[fld], PlotJoined -> True];
Out[10] :=
이제는 이렇게 노이즈가 제거된 데이터를 InverseFourier라는 함수를 사용해서 역퓨리에 변환시킨다.(In[11])
In[11] :=
infld = InverseFourier[fld];
이렇게 역변환된 데이터를 그래프로 나타내보면 In[12]와 같은데, 이 결과를 In[4]와 비교해보면 이 그래프는 In[4]의 그래프에서 노이즈만을 제거한 것이라는 것을 알 수 있을 것이다.
In[12] :=
flddata = ListPlot[infld, PlotJoined -> True];
Out[12] :=
2. 컨볼루션을 이용한 필터링(Filtering by Convolution)
앞서 퓨리에 변환의 예는, 일단 데이터를 퓨리에 변환시킨 다음 그 결과로부터 원치 않는 부분을 기계적으로 제거하는, 일종의 필터를 만드는 것이었는데 실제로 이러한 필터를 디자인하는 데는 기계적인 방법보다는 콘볼루션이라는 방법을 사용한다. 이 컨볼루션의 원리는 데이터의 퓨리에 변환된 결과와 필터의 퓨리에 변환된 결과를 곱한 다음 그 결과를 다시 역변환하는 것이므로 컨볼루션에 대한 특별한 함수를 만들지 않더라도 Fourier와 InverseFourier라는 두 함수의 조합만으로도 컨볼루션 과정을 수행할 수 있는 것이다. 이 컨볼루션 과정을 요약하면 다음과 같다.
Convolution = InverseFourier[ Fourier[data] Fourier[filter] ]
우선 In[1]과 같은 방법으로 약간의 노이즈가 섞인 데이터를 만들어보자.
In[1] :=
data = Table[ N[BesselJ[1, 10 n/256] + 0.2 (Random[] - 1/2)],
{n, 256}];
그 다음에는 이 데이터를 그래프로 나타내본다.
In[2] :=
dp = ListPlot[data, PlotJoined -> True];
Out[2] :=
이 그래프를 퓨리에 변환시키고 결과를 그래프로 나타내면 다음과 같다.
In[3] := ftdata = Fourier[data];
In[4] :=
ftdp = ListPlot[ Abs[ftdata], PlotJoined -> True,
PlotRange -> All];
Out[4] :=
이번에는 이 데이터에 대한 필터 역할을 할 수 있는 하나의 함수를 만들어보면 다음과 같다.
In[5] := kern = Table[ N[Exp[-200 (n/256)^2]], {n, 256}];
In[5]의 결과를 그래프로 그려보면 In[6]과 같다.
In[6] := kp = ListPlot[ kern, PlotJoined -> True
PlotRange -> All,
PlotStyle -> RGBColor[1, 0, 0]];
Out[6] :=
이번에는 이 필터를 퓨리에 변환하고,
In[7] := ftkern = Fourier[kern];
그 결과를 그래프로 나타내면 In[8]과 같다.
In[8] := ftkp = ListPlot[ Abs[ftkern], PlotJoined -> True
PlotRange -> All,
PlotStyle -> RGBColor[1, 0, 0]];
Out[8] :=
이번에는 원래 데이터의 그래프와 필터를 통한 퓨리에 그래프를 하나의 좌표에 나타내본다.
In[9] := Show[ { ftdp, ftkp} ];
Out[9] :=
그 다음에는 이들 둘을 곱해서 역퓨리에 변환을 하면, 원치않는 노이즈를 제거할 수가 있는데 이 광정을 표현하면 다음 In[10]과 같다.
In[10] :=
conv = InverseFourier[ Fourier[data] Fourier[kern] ];
이렇게 얻어진 결과를 그래프로 나타내보면 In[11]과 같은데, 이 결과를 Out[2]와 비교해보면 노이즈가 상당히 많이 없어진 것을 알수 있다.
In[11] := ListPlot[ Chop[conv], PlotJoined -> True];
Out[11] :=
3. 라플라스 변환(Laplace Transform)
라플라스 변환은 원래가 복잡한 형식의 미분방정식을 일종의 복소평면으로 옮긴 다음, 그곳에서 간단한 대수적인 방법으로 그 문제에 대한 답을 구해내기 위해서 만든 도구인데, Mathematica에서는 LaplaceTransform이라는 함수와 InverseLaplaceTransform이라는 두 함수가 이러한 역할을 담당하고 있다.
이들 두 함수는 내장함수가 아니라, 패키지에 들어 있는 것들이기 때문에 이들을 사용하기 위해서는 우선 In[1]와 같이 LaplaceTransform이라는 패키지부터 불러내야 한다.
In[1] := Need["Calculus`LaplaceTransform`"];
그 다음에는 LaplaceTransform이라는 함수를 사용해서 가장 간단한 상수 하나를 라플라스 변환을 해보기로 하자. In[2]의 의미는 1이라는 상수를 라플라스 변환을 하라는 의미인데, 원래 함수의 독립변수는 't'이고 라플라스 변환된 함수의 독립변수는 's'로 하라는 것이다.
In[2] := LaplaceTransform[1, t, s]
Out[2] :=
1
-
s
좀더 복잡한 수식을 라플라스 변환해보자
In[3] := LaplaceTransform[t^2 E^(a t) + Sin[t], t, s]
Out[3] :=
2 1
--------- + -------
3 2
(-a + s) 1 + s
모든 변환이 다 그렇듯이 라플라스 변환의 경우에도 그 변환이 제대로 수행되었는지 알아볼 수 있는 가장 손쉬운 방법은 변환된 결과를 역변환하여 그 결과를 원래의 함수와 비교해보는 것일 것이다.
여기서도 In[3]에서 얻은 결과를 다시 역변환하여 원래의 수식과 비교해보기로 하자. In[4]의 의미는 In[3]에서 얻어진 라플라스식을 역변환하라는 의미인데, LaplaceTransform과 비교해볼 때 's'와 't'의 위치가 바뀌어 있다는 것을 눈여겨보기 바란다.
In[4] := InverseLaplaceTransform[l, s, t]
Out[4] :=
a t 2
E t + Sin[t]
ListPlot[Abs[fld], PlotJoined -> True];
Out[10] :=
이제는 이렇게 노이즈가 제거된 데이터를 InverseFourier라는 함수를 사용해서 역퓨리에 변환시킨다.(In[11])
In[11] :=
infld = InverseFourier[fld];
이렇게 역변환된 데이터를 그래프로 나타내보면 In[12]와 같은데, 이 결과를 In[4]와 비교해보면 이 그래프는 In[4]의 그래프에서 노이즈만을 제거한 것이라는 것을 알 수 있을 것이다.
In[12] :=
flddata = ListPlot[infld, PlotJoined -> True];
Out[12] :=
2. 컨볼루션을 이용한 필터링(Filtering by Convolution)
앞서 퓨리에 변환의 예는, 일단 데이터를 퓨리에 변환시킨 다음 그 결과로부터 원치 않는 부분을 기계적으로 제거하는, 일종의 필터를 만드는 것이었는데 실제로 이러한 필터를 디자인하는 데는 기계적인 방법보다는 콘볼루션이라는 방법을 사용한다. 이 컨볼루션의 원리는 데이터의 퓨리에 변환된 결과와 필터의 퓨리에 변환된 결과를 곱한 다음 그 결과를 다시 역변환하는 것이므로 컨볼루션에 대한 특별한 함수를 만들지 않더라도 Fourier와 InverseFourier라는 두 함수의 조합만으로도 컨볼루션 과정을 수행할 수 있는 것이다. 이 컨볼루션 과정을 요약하면 다음과 같다.
Convolution = InverseFourier[ Fourier[data] Fourier[filter] ]
우선 In[1]과 같은 방법으로 약간의 노이즈가 섞인 데이터를 만들어보자.
In[1] :=
data = Table[ N[BesselJ[1, 10 n/256] + 0.2 (Random[] - 1/2)],
{n, 256}];
그 다음에는 이 데이터를 그래프로 나타내본다.
In[2] :=
dp = ListPlot[data, PlotJoined -> True];
Out[2] :=
이 그래프를 퓨리에 변환시키고 결과를 그래프로 나타내면 다음과 같다.
In[3] := ftdata = Fourier[data];
In[4] :=
ftdp = ListPlot[ Abs[ftdata], PlotJoined -> True,
PlotRange -> All];
Out[4] :=
이번에는 이 데이터에 대한 필터 역할을 할 수 있는 하나의 함수를 만들어보면 다음과 같다.
In[5] := kern = Table[ N[Exp[-200 (n/256)^2]], {n, 256}];
In[5]의 결과를 그래프로 그려보면 In[6]과 같다.
In[6] := kp = ListPlot[ kern, PlotJoined -> True
PlotRange -> All,
PlotStyle -> RGBColor[1, 0, 0]];
Out[6] :=
이번에는 이 필터를 퓨리에 변환하고,
In[7] := ftkern = Fourier[kern];
그 결과를 그래프로 나타내면 In[8]과 같다.
In[8] := ftkp = ListPlot[ Abs[ftkern], PlotJoined -> True
PlotRange -> All,
PlotStyle -> RGBColor[1, 0, 0]];
Out[8] :=
이번에는 원래 데이터의 그래프와 필터를 통한 퓨리에 그래프를 하나의 좌표에 나타내본다.
In[9] := Show[ { ftdp, ftkp} ];
Out[9] :=
그 다음에는 이들 둘을 곱해서 역퓨리에 변환을 하면, 원치않는 노이즈를 제거할 수가 있는데 이 광정을 표현하면 다음 In[10]과 같다.
In[10] :=
conv = InverseFourier[ Fourier[data] Fourier[kern] ];
이렇게 얻어진 결과를 그래프로 나타내보면 In[11]과 같은데, 이 결과를 Out[2]와 비교해보면 노이즈가 상당히 많이 없어진 것을 알수 있다.
In[11] := ListPlot[ Chop[conv], PlotJoined -> True];
Out[11] :=
3. 라플라스 변환(Laplace Transform)
라플라스 변환은 원래가 복잡한 형식의 미분방정식을 일종의 복소평면으로 옮긴 다음, 그곳에서 간단한 대수적인 방법으로 그 문제에 대한 답을 구해내기 위해서 만든 도구인데, Mathematica에서는 LaplaceTransform이라는 함수와 InverseLaplaceTransform이라는 두 함수가 이러한 역할을 담당하고 있다.
이들 두 함수는 내장함수가 아니라, 패키지에 들어 있는 것들이기 때문에 이들을 사용하기 위해서는 우선 In[1]와 같이 LaplaceTransform이라는 패키지부터 불러내야 한다.
In[1] := Need["Calculus`LaplaceTransform`"];
그 다음에는 LaplaceTransform이라는 함수를 사용해서 가장 간단한 상수 하나를 라플라스 변환을 해보기로 하자. In[2]의 의미는 1이라는 상수를 라플라스 변환을 하라는 의미인데, 원래 함수의 독립변수는 't'이고 라플라스 변환된 함수의 독립변수는 's'로 하라는 것이다.
In[2] := LaplaceTransform[1, t, s]
Out[2] :=
1
-
s
좀더 복잡한 수식을 라플라스 변환해보자
In[3] := LaplaceTransform[t^2 E^(a t) + Sin[t], t, s]
Out[3] :=
2 1
--------- + -------
3 2
(-a + s) 1 + s
모든 변환이 다 그렇듯이 라플라스 변환의 경우에도 그 변환이 제대로 수행되었는지 알아볼 수 있는 가장 손쉬운 방법은 변환된 결과를 역변환하여 그 결과를 원래의 함수와 비교해보는 것일 것이다.
여기서도 In[3]에서 얻은 결과를 다시 역변환하여 원래의 수식과 비교해보기로 하자. In[4]의 의미는 In[3]에서 얻어진 라플라스식을 역변환하라는 의미인데, LaplaceTransform과 비교해볼 때 's'와 't'의 위치가 바뀌어 있다는 것을 눈여겨보기 바란다.
In[4] := InverseLaplaceTransform[l, s, t]
Out[4] :=
a t 2
E t + Sin[t]