常用的曲線擬合函數「matlab曲線擬合函數有哪些」

數據導入MATLAB之後,通常需要對數據進行一些預處理,例如平滑處理(去噪)、標準化變換和極差歸一化變換等。

1.數據的平滑處理

1.1 smooth函數平滑處理

MATLAB曲線擬合工具箱中提供了smooth函數,用來對數據進行平滑處理,調用格式如下:

(1)yy=smooth(y)

利用移動平均濾波器對列向量y進行平滑處理,返回與y等長的列向量yy。移動平均濾波器的默認窗寬為5,yy中元素的計算方法如下:

yy(1)=y(1)

yy(2)=(y(1)+y(2)+y(3))/3

yy(3)=(y(1)+y(2)+y(3)+y(4)+y(5))/5

yy(4)=(y(2)+y(3)+y(4)+y(5)+y(6))/5

……

(2) yy=smooth(y,span)

用span參數指定移動平均濾波器的窗寬,函數內部會強制將span變為奇數。

(3)yy=smooth(y,method)

method參數指定平滑數據的方法,method是字符串變量,可用的字符串如下表:

method參數值 說明

moving 移動平均法(默認情況)

lowess 局部回歸(加權線性最小二乘和一個一階多項式模型)

loess 局部回歸(加權線性最小二乘和一個二階多項式模型)

sgolay Sacitzky-Golay濾波,一種廣義移動平均濾波法

rlowess lowess方法的穩健形式

rloess loess方法的穩健形式

(4)yy=smooth(y,span,method)

method指定平滑方法,span指定窗寬。

例:產生一正弦信號,加入噪聲信號,調用smooth函數對加入噪聲的正弦波進行平滑處理

t=linspace(0,2*pi,500);%產生一個從0到2*pi的向量,長度為500,(t=0:2*pi/500:2*pi)

y=100*sin(t); %產生正弦波信號

noise=normrnd(0,15,1,500); %產生1行500列的服從N(0,15^2)分布的隨機數,作為噪聲信號

y=y+noise; %將正弦信號加入噪聲信號

figure; %新建一個窗口

plot(t,y); %繪製加噪聲波形

xlabel(‘t’);

ylabel(‘y=sin(t)+噪聲’);

title(‘原始信號’);

%—–移動平均法—–

yy1=smooth(y,30); %利用移動平均法對y進行平滑處理

figure;

plot(t,y,’k:’); %畫出原始信號,類型為黑色點線化出

hold on;

plot(t,yy1,’k’,’linewidth’,3); %繪製平滑後波形圖,顏色為黑色,寬度為3

xlabel(‘t’);

ylabel(‘moving’);

legend(‘原始信號’,’平滑後波形’);

title(‘移動平均法平滑處理’);

%—-lowess法—–

yy2=smooth(y,30,’lowess’); %利用lowess方法對y進行平滑處理

figure; %新建一個圖形窗口

plot(t,y,’k:’); %繪製原始信號

hold on;

plot(t,yy2,’k’,’linewidth’,3); %繪製平滑後波形圖

xlabel(‘t’);

ylabel(‘rlowrss’);

legend(‘原始信號’,’平滑後波形’);

title(‘lowess方法平滑處理’);

%—–rlowess方法平滑處理

yy3=smooth(y,30,’rlowess’); %利用rlowess方法對y進行平滑處理

figure; %新建一個圖形窗口

plot(t,y,’k:’); %繪製原始信號

hold on;

plot(t,yy3,’k’,’linewidth’,3);

xlabel(‘t’);

ylabel(‘rlowess’);

legend(‘原始信號’,’平滑後波形’);

title(‘rlowess方法平滑處理’);

%—-loess方法平滑處理

yy4=smooth(y,30,’loess’); %用loess方法對y進行平滑處理

figure;

plot(t,y,’k:’); %原始信號

hold on;

plot(t,yy4,’k’,’linewidth’,3); %繪製平滑後波形圖

xlabel(‘t’);

ylabel(‘loess’);

legend(‘原始信號’,’平滑後波形’);

title(‘loess方法平滑處理’);

%—sgolay方法平滑處理

yy5=smooth(y,30,’sgolay’,3); %利用sgolay方法對y進行平滑處理

figure;

plot(t,y,’k:’);

hold on;

plot(t,yy5,’k’,’linewidth’,3); %繪製平滑後的波形圖

xlabel(‘t’);

ylabel(‘sgolay’);

legend(‘原始信號’,’平滑後波形’);

title(‘sgolay方法平滑處理’);

matlab數據的平滑處理
matlab數據的平滑處理
matlab數據的平滑處理
matlab數據的平滑處理
matlab數據的平滑處理
matlab數據的平滑處理

調用smooth函數,設置相同的窗寬,用5中方法對加噪聲後信號進行平滑處理,可以發現,這5種方法平滑效果,都比較好的濾除了噪聲,反映了數據的總體規律。實際上隨着窗寬的增大,平滑後的曲線也會越來越平滑,但過於光滑也可能造成失真。

1.2 smoothts函數平滑處理

MATLAB金融工具箱中提供了smoothts函數,也可用來對數據進行平滑處理,調用格式如下:

output=smoothts(input)

output=smoothts(input,‘b’,wsize)

output=smoothts(input,‘g’,wsize,stdev)

output=smoothts(input,‘e’,n)

輸入參數input是輸入數據,‘b’,‘g’,‘e’表示不同的數據平滑方法,‘b’表示盒子法(默認情況),’g’表示高斯窗方法,‘e’表示指數法。wsize指定各種數據平滑方法的窗寬,默認窗寬為5。stdev用來指定高斯方法的標準差,默認為0.65.

例:現有上海股市開盤價、最高價,最低價,收盤價,收益率等數據,共有510組數據,試調用smoothts函數對日收盤價數據進行平滑處理

數據如圖所示:

matlab數據的平滑處理

x=xlsread(‘C:UsersAdministratorDesktopMATLABMATLAB數據分析與統計chapter21.xls’);%讀取數據

price=x(:,4)’; %提取矩陣x中的第4列數據,即收盤價數據, 並轉置,裝換為行向量

plot(price,’k’,’LineWidth’,2); %繪製收盤價的曲線,繪製類型:黑色實線,線寬為2

xlabel(‘觀測序號’);

ylabel(‘日收盤價’);

title(‘原始數據’);

%—盒子法平滑數據

output1=smoothts(price,’b’,30); %用盒子法平滑數據,窗寬為30

output2=smoothts(price,’b’,100); %盒子法平滑數據,窗寬為100

figure; %新建一個圖形窗口

plot(price,’.’); %繪製原始數據

hold on;

plot(output1,’k’,’LineWidth’,2); %繪製平滑後的曲線,曲線類型:黑色實線,寬度2

plot(output2,’k-.’,’LineWidth’,2); %繪製平滑後的曲線,曲線類型:黑色點畫線,線寬為2

xlabel(‘觀測信號’);

ylabel(‘Box method’);

legend(‘原始散點數據’,’平滑後曲線(窗寬30)’,’平滑後數據(窗寬100)’);

title(‘盒子法平滑數據’);

%—–高斯窗方法平滑數據

output3=smoothts(price,’g’,30); %窗寬為30,標準差為默認值0.65

output4=smoothts(price,’g’,100,100); %窗寬為100,標準差為100

figure; %新建一個圖形窗口

plot(price,’.’); %繪製元素數據

hold on;

plot(output3,’k’,’LineWidth’,2); %繪製平滑後的曲線,類型:黑色實線,線寬為2

plot(output4,’k-.’,’LineWidth’,2); %繪製平滑後的曲線,類型:黑色點畫線,線寬為2

xlabel(‘觀測信號’);

ylabel(‘Gaussian method’);

legend(‘原始散點’,’平滑曲線(窗寬30,標準差0.65)’,’平滑曲線(窗寬100,標準差100)’);

title(‘高斯窗方法平滑’);

%—-指數法平滑數據

output5=smoothts(price,’e’,30); %用指數法平滑數據,窗寬為30

output6=smoothts(price,’e’,100); %用指數法平滑數據,窗寬為100

figure; %新建一個圖形窗口

plot(price,’.’); %繪製元素數據散點圖

hold on;

plot(output5,’k’,’LineWidth’,2); %繪製平滑後曲線圖,曲線類型:黑色實線,線寬2

plot(output6,’k-.’,’LineWidth’,2); %繪製平滑後曲線圖,線型:黑色點畫線,線寬2

xlabel(‘觀測序號’);

ylabel(‘Exponential method’);

legend(‘原始散點數據’,’平滑曲線(線寬30)’,’平滑曲線(線寬100)’);

title(‘指數法平滑數據’)

matlab數據的平滑處理
matlab數據的平滑處理
matlab數據的平滑處理
matlab數據的平滑處理

例中,調用smoothts函數,用3種不同的方法(盒子法,高斯窗法,指數法),每種方法設定兩種不同的窗寬,對收盤價數據進行了平滑處理,並做出平滑曲線,原始收盤價曲線比較曲折,不夠光滑,從圖中可以看出,前兩種方法在端點處的平滑效果不是很好,最後一種方法在右尾部的處理有些失真。但在數據的中段,這三種方法的平滑效果比較好,並且隨着窗寬的增大,平滑後的曲線的光滑性也在增強,但光滑度增強的同時也造成了失真。

1.3 medfilt1函數平滑處理

MATLAB信號處理工具箱中提供了medfilt1函數,用來對信號數據進行一維中值濾波,其調用格式如下:

(1)y=medfilt1(x,n);

對向量x進行一維中值濾波,返回與x等長的向量y。這裡的n是窗寬參數,當n是奇數時,y的第k個元素等於x的第k-(n-1)/2個元素至k+(n-1)/2個元素的中位數;當n是偶是,y的第k個元素等於x的第k-n/2個元素至第k+n/2-1個元素的中位數。n的默認值為3

(2) y=medfilt1(x,n,blksz)

默認情況下,blksz=length(x)。當x是一個矩陣時,通過循環對x的各列進行一維中值濾波,返回對x的各列進行一維中值濾波,返回與x具有相同行數和列數的矩陣y

(3)y=medfilt1(x,n,blksz,dim)

用dim參數指定沿x的哪個維進行濾波

例:產生一正弦信號,加入噪聲,然後調用medfilt1函數對加入噪聲的正弦波進行平滑處理(濾波)

t=linspace(0,2*pi,500); %產生一個從0到2*pi的向量,長度為500

y=100*sin(t);

noise=normrnd(0,15,1,500); %產生1行500列的服從N(0,15^2)分布的隨機數,作為噪聲信號

y=y+noise; %將正弦波信號加入噪聲信號

figure; %新建一個圖形窗口

plot(t,y); %繪製加入噪聲後的波形圖

xlabel(‘t’);

ylabel(‘y=sin(t)+noise’);

title(‘原始信號’);

%調用medfilt1對加噪聲正弦信號y進行中值濾波,並繪製波形圖

yy=medfilt1(y,30); %指定窗口為30,對y進行中值濾波

figure; %新建一個圖形窗口

plot(t,y,’k:’); %繪製加噪聲波形圖

hold on;

plot(t,yy,’k’,’LineWidth’,3); %繪製平滑後曲線圖,線型:黑色實線,線寬為3

xlabel(‘t’);

ylabel(‘中值濾波’);

legend(‘加噪波形’,’平滑後波形’);

title(‘medfilt1平滑’);

matlab數據的平滑處理
matlab數據的平滑處理

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/273148.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-17 14:04
下一篇 2024-12-17 14:04

相關推薦

發表回復

登錄後才能評論