이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.
푸리에 급수
푸리에 급수 모델 소개
푸리에 급수는 주기 신호를 나타내는 사인 함수와 코사인 함수의 합입니다. 푸리에 급수는 삼각 함수 형식 또는 지수 함수 형식으로 표현됩니다. 이 툴박스는 다음과 같은 형식의 삼각 푸리에 급수를 제공합니다.
여기서 a0은 데이터의 상수(절편) 항을 모델링하고 i = 0 코사인 항과 연관이 있으며, w는 신호의 기본주파수이고, n은 급수에 있는 항(고조파)의 개수이고, 1 ≤ n ≤ 8입니다.
푸리에 급수에 대한 자세한 내용은 푸리에 해석과 필터링 항목을 참조하십시오.
대화형 방식으로 푸리에 모델 피팅하기
cftool
을 입력하여 곡선 피팅 앱을 엽니다. 또는 앱 탭에서 곡선 피팅을 클릭합니다.곡선 피팅 앱에서 곡선 데이터(X 데이터와 Y 데이터 또는 인덱스에 대한 Y 데이터만)를 선택합니다.
곡선 피팅 앱은 디폴트 곡선 피팅인
다항식
을 만듭니다.모델 유형을
다항식
에서푸리에
로 변경합니다.
다음 옵션을 지정할 수 있습니다.
항의 개수를 선택합니다(
1
부터8
까지).결과 창에서 모델 항, 계수의 값, 적합도 통계량을 확인할 수 있습니다.
(선택 사항) 피팅 옵션을 클릭하여 계수 시작값과 제약 조건 경계를 지정하거나 알고리즘 설정을 변경합니다.
이 툴박스는 현재 데이터 세트에 따라 푸리에 급수 모델을 위한 최적화된 시작점을 계산합니다. 피팅 옵션 대화 상자에서 사용자가 직접 값을 지정하여 시작점을 재정의할 수 있습니다.
설정에 대한 자세한 내용은 피팅 옵션 및 최적화된 시작점 지정하기 항목을 참조하십시오.
라이브러리에 있는 푸리에 피팅과 사용자 지정 수식을 비교하는 예제는 Custom Nonlinear ENSO Data Analysis 항목을 참조하십시오.
fit 함수를 사용하여 푸리에 모델 피팅하기
이 예제에서는 fit
함수를 사용하여 푸리에 모델을 데이터에 피팅하는 방법을 보여줍니다.
푸리에 라이브러리 모델은 fit
함수와 fittype
함수의 입력 인수입니다. 모델 유형을 fourier
로 지정하고, 항의 개수(예: 'fourier1'
부터 'fourier8'
까지)를 지정합니다.
이 예제에서는 ENSO(El Nino-Southern Oscillation) 데이터를 피팅합니다. ENSO 데이터는 이스터 아일랜드와 호주 다윈 간의 월별 평균 기압 차이로 이루어져 있습니다. 이 차이로 인해 남반구에서 무역풍이 붑니다.
ENSO 데이터는 확실히 주기적이며, 이는 푸리에 급수로 설명될 수 있음을 의미합니다. 푸리에 급수 모델을 사용하여 주기성을 찾아보겠습니다.
2항 푸리에 모델 피팅하기
데이터를 불러와서 2항 푸리에 모델을 피팅합니다.
load enso; f = fit(month,pressure,'fourier2')
f = General model Fourier2: f(x) = a0 + a1*cos(x*w) + b1*sin(x*w) + a2*cos(2*x*w) + b2*sin(2*x*w) Coefficients (with 95% confidence bounds): a0 = 10.63 (10.23, 11.03) a1 = 2.923 (2.27, 3.576) b1 = 1.059 (0.01593, 2.101) a2 = -0.5052 (-1.086, 0.07532) b2 = 0.2187 (-0.4202, 0.8576) w = 0.5258 (0.5222, 0.5294)
plot(f,month,pressure)
a2
와 b2
에 대한 신뢰한계는 영점을 교차합니다. 일차항의 경우, 해당 계수가 0과 다르다는 사실을 확신할 수 없으므로 피팅에 도움이 되지 않습니다. 이것은 2항 모델이 1항 모델보다 더 낫지 않을 확률이 큼을 의미합니다.
주기 측정하기
w
항은 주기의 측도입니다. sin()
과 cos()
의 주기는 2*pi
이므로 2*pi/w
는 월 단위 주기로 변환됩니다.
w = f.w
w = 0.5258
2*pi/w
ans = 11.9497
w
는 12개월에 매우 가깝습니다. 이는 1년 주기를 나타냅니다. 플롯에서 피크와 피크 사이에 약 12개월의 간격이 있는 것을 보고 이것이 맞다는 사실을 알 수 있습니다.
8항 푸리에 모델 피팅하기
f2 = fit(month,pressure,'fourier8')
f2 = General model Fourier8: f2(x) = a0 + a1*cos(x*w) + b1*sin(x*w) + a2*cos(2*x*w) + b2*sin(2*x*w) + a3*cos(3*x*w) + b3*sin(3*x*w) + a4*cos(4*x*w) + b4*sin(4*x*w) + a5*cos(5*x*w) + b5*sin(5*x*w) + a6*cos(6*x*w) + b6*sin(6*x*w) + a7*cos(7*x*w) + b7*sin(7*x*w) + a8*cos(8*x*w) + b8*sin(8*x*w) Coefficients (with 95% confidence bounds): a0 = 10.63 (10.28, 10.97) a1 = 0.5668 (0.07981, 1.054) b1 = 0.1969 (-0.2929, 0.6867) a2 = -1.203 (-1.69, -0.7161) b2 = -0.8087 (-1.311, -0.3065) a3 = 0.9321 (0.4277, 1.436) b3 = 0.7602 (0.2587, 1.262) a4 = -0.6653 (-1.152, -0.1788) b4 = -0.2038 (-0.703, 0.2954) a5 = -0.02919 (-0.5158, 0.4575) b5 = -0.3701 (-0.8594, 0.1192) a6 = -0.04856 (-0.5482, 0.4511) b6 = -0.1368 (-0.6317, 0.3581) a7 = 2.811 (2.174, 3.449) b7 = 1.334 (0.3686, 2.3) a8 = 0.07979 (-0.4329, 0.5925) b8 = -0.1076 (-0.6037, 0.3885) w = 0.07527 (0.07476, 0.07578)
plot(f2,month,pressure)
주기 측정하기
w = f2.w
w = 0.0753
(2*pi)/w
ans = 83.4736
f2
모델에서는 주기 w
가 약 7년입니다.
항 검토하기
크기가 가장 큰 계수를 찾아서 가장 중요한 항을 구합니다.
a7
과b7
의 크기가 가장 큽니다. 모델 방정식a7*cos(7*x*w)
에서a7
항을 살펴봅니다.7*w
== 7/7 = 1년 주기입니다.a7
과b7
은 연간 주기가 가장 강함을 나타냅니다.마찬가지로,
a1
항과b1
항은 7/1이 되므로 7년 주기를 나타냅니다.a2
항과b2
항은 3.5년 주기입니다(7/2).a2
계수와b2
계수는 a1과 b1보다 크기가 크므로 이것은 7년 주기보다 강합니다.a3
과b3
은 7/3(2.3년) 주기를 나타내는 상당히 강한 항입니다.a6
,b6
,a5
,b5
와 같이 비교적 크기가 작은 항은 피팅에서 덜 중요합니다.
일반적으로, 엘니뇨 온난화는 2~7년의 불규칙한 간격으로 발생하며 9개월에서 2년 동안 지속됩니다. 평균 주기 길이는 5년입니다. 모델 결과는 이러한 주기 중 일부를 반영합니다.
시작점 설정하기
이 툴박스는 현재 데이터 세트에 따라 푸리에 피팅을 위한 최적화된 시작점을 계산합니다. 푸리에 급수 모델은 특히 시작점에 민감하며, 최적화된 값은 관련 방정식에서 몇 개 항에 대해서만 정확할 수 있습니다. 사용자가 직접 값을 지정하여 시작점을 재정의할 수 있습니다.
항과 플롯을 검토해 보니 4년 주기가 존재한다고 볼 수 있을 것 같습니다. w
를 설정하여 확인해 봅니다. 8년을 96개월로 계산하여 w
의 값을 얻습니다.
w = (2*pi)/96
w = 0.0654
coeffnames
함수를 사용하여 모델('f2')의 계수의 순서를 확인합니다.
coeffnames(f2)
ans = 18x1 cell
{'a0'}
{'a1'}
{'b1'}
{'a2'}
{'b2'}
{'a3'}
{'b3'}
{'a4'}
{'b4'}
{'a5'}
{'b5'}
{'a6'}
{'b6'}
{'a7'}
{'b7'}
{'a8'}
{'b8'}
{'w' }
현재 계수 값을 구합니다.
coeffs = coeffvalues(f2)
coeffs = 1×18
10.6261 0.5668 0.1969 -1.2031 -0.8087 0.9321 0.7602 -0.6653 -0.2038 -0.0292 -0.3701 -0.0486 -0.1368 2.8112 1.3344 0.0798 -0.1076 0.0753
마지막 계수 w
를 0.065로 설정합니다.
coeffs(:,18) = w
coeffs = 1×18
10.6261 0.5668 0.1969 -1.2031 -0.8087 0.9321 0.7602 -0.6653 -0.2038 -0.0292 -0.3701 -0.0486 -0.1368 2.8112 1.3344 0.0798 -0.1076 0.0654
새 w
값을 사용하여 계수에 대한 시작점을 설정합니다.
f3 = fit(month,pressure,'fourier8', 'StartPoint', coeffs);
두 피팅을 모두 플로팅하여 f3
에서 w
의 새 값이 f2
보다 나은 피팅을 생성하지 않음을 확인합니다.
plot(f3,month,pressure) hold on plot(f2, 'b') hold off legend( 'Data', 'f3', 'f2')
푸리에 피팅 옵션 찾기
fitoptions(modelname)
을 사용하여 사용 가능한 피팅 옵션을 찾습니다. 여기서 modelname
은 모델 유형 fourier
뒤에 항의 개수를 지정한 것입니다(예: 'fourier1'
부터 'fourier8'
까지).
fitoptions('fourier8')
ans = Normalize: 'off' Exclude: [] Weights: [] Method: 'NonlinearLeastSquares' Robust: 'Off' StartPoint: [1x0 double] Lower: [1x0 double] Upper: [1x0 double] Algorithm: 'Trust-Region' DiffMinChange: 1.0000e-08 DiffMaxChange: 0.1000 Display: 'Notify' MaxFunEvals: 600 MaxIter: 400 TolFun: 1.0000e-06 TolX: 1.0000e-06
데이터에 적합한 계수 시작값과 제약 조건 경계와 같은 피팅 옵션을 수정하거나 알고리즘 설정을 변경하려면 fitoptions
함수 도움말 페이지에서 NonlinearLeastSquares에 대한 옵션을 참조하십시오.
참고 항목
fit
| fittype
| fitoptions