Matlab中數據處理和多項式插值與曲線擬合


一、  基本統計處理

1、查取最大值
MAX函數的命令格式有:
[Y,I]= max (X):將max(X)返回矩陣X的各列中的最大元素值及其該元素的位置賦予行向量Y與I;當X為向量時,則Y與I為單變量。
[Y,I]=max(X,[],DIM):當DIM=1時按數組X的各列查取其最大的元素值及其該元素的位置賦予向量Y與I;當DIM=2時按數組X的各行查取其最大的元素值及其該元素的位置賦予向量Y與I.
max(A,B):返回一個與A,B同維的數組,其每一個元素是由A,B同位置上的元素的最大值組成。

【例1】查找下面數列x的最大值。
x=[3 5 9 6 1 8]       % 產生數列x
x =     3     5     9     6     1     8
y=max(x)           % 查出數列x中的最大值賦予y
y =     9
[y,l]=max(x) % 查出數列x中的最大值及其該元素的位置賦予y,l
y =     9
l =     3

【例2】分別查找下面3×4的二維數組x中各列和各行元素中的最大值。
x=[1 8 4 2;9 6 2 5;3 6 7 1]    % 產生二維數組x
x =     1     8     4     2
          9     6     2     5
           3     6     7     1
y=max(x)           % 查出二維數組x中各列元素的最大值產生賦予行向量y
y =     9     8     7     5

[y,l]=max(x)         % 查出二維數組x中各列元素的最大值及其這些
                   % 元素的行下標賦予y,l
y =     9     8     7     5
l =     2     1     3     2
[y,l]=max(x,[ ],1)      % 本命令的執行結果與上面命令完全相同
y =     9     8     7     5
l =     2     1     3     2
[y,l]=max(x,[ ],2)      % 由於本命令中DIM=2,故查找操作在各行中進行
y =     8
          9
         7
l =     2
         1
         3

[y,l]=max(x)         % 查出二維數組x中各列元素的最大值及其這些
                   % 元素的行下標賦予y,l
y =     9     8     7     5
l =     2     1     3     2
[y,l]=max(x,[ ],1)      % 本命令的執行結果與上面命令完全相同
y =     9     8     7     5
l =     2     1     3     2
[y,l]=max(x,[ ],2)      % 由於本命令中DIM=2,故查找操作在各行中進行
y =     8
          9
         7
l =     2
         1
         3

2、查取最小值
MIN函數用來查取數據序列的最小值。它的用法與命令格式與MAX函數完全一樣,所不同的是執行的結果是最小值。

3、求中值
所謂中值,是指在數據序列中其值的大小恰好在中間。例如,數據序列9,-2,5,7,12的中值為7 。
如果為偶數個時,則中值等於中間的兩項之平均值。

MEDIAN函數調用的命令格式有:
Y=median(X):將median(X)返回矩陣X各列元素的中值賦予行向量Y。若X為向量,則Y為單變量。

Y=median(X,DIM):按數組X的第DIM維方向的元素求其中值賦予向量Y。若DIM=1,為按列操作;若DIM=2,為按行操作。若X為二維數組,Y為一個向量;若X為一維數組,則Y為單變量。

【例4】試分別求下面數列x1與x2的中值。
x1=[9 -2 5 7 12];            % 奇數個元素
y1=median(x)
y1 =
     7
x2=[9 -2 5 6 7 12];           % 偶數個元素
y2=median(x)
y2 =
    6.5000

【例5】對下面二維數組x,試從不同維方向求出其中值。
x=[1 8 4 2;9 6 2 5;3 6 7 1]      % 產生一個二維數組x
x =     1     8     4     2
          9     6     2     5
          3     6     7     1
y0=median(x)               % 按列操作
y0 =     3     6     4     2
y1=median(x,1)              % 此時DIM=1,故按列操作,結果y1為行向量
y1 =     3     6     4     2
y2=median(x,2)              % 此時DIM=2,故按行操作, 結果y2為列向量
y2 =    3.0000
           5.5000
           4.5000

4、求和
命令格式有:
Y=sum(X):將sum(X)返回矩陣X各列元素之和賦予行向量Y;若X為向量,則Y為單變量。

Y=sum(X,DIM):按數組X的第DIM維的方向的元素求其和賦予Y。若DIM=1,為按列操作;若DIM=2,為按行操作。若X為二維數組,Y為一個向量;若X為一維數組,則Y為單變量。

例如:
x=[4 5 6;1 4 8]
x =
     4     5     6
     1     4     8
y=sum(x,1)
y =
     5     9    14
y=sum(x,2)
y =
    15
    13

5、求平均值
MEAN函數調用的命令格式有:
Y= mean(X):將mean (X)返回矩陣X各列元素之的平均值賦予行向量Y。若X為向量,則Y為單變量。

Y= mean(X,DIM):按數組X的第DIM維的方向的元素求其平均值賦予向量Y。若DIM=1,為按列操作;若DIM=2,為按行操作。若X為二維數組,Y為一個向量;若X為一維數組,則Y為單變量。

6、求積
命令格式有:
Y= prod(X):將prod(X)返回矩陣X各列元素之積賦予行向量Y。若X為向量,則Y為單變量。

Y= prod(X,DIM):按數組X的第DIM維的方向的元素求其積賦予向量Y。若DIM=1,為按列操作;若DIM=2,為按行操作。若X為二維數組,Y為一個向量;若X為一維數組,則Y為單變量。

 7、 求累計和、累積積、標准方差與升序排序

MATLAB提供的求累計和、累積積、標准方差與升序排序等函數分別為CUMSUM、CUMPROD、STD和SORT,這里僅STD函數為MATLAB程序,其余均為內部函數。
這些函數調用的參數與操作方式都與上小節的MEDIAN(中值)函數基本上一樣,因此不作詳細的介紹。

二、插值與曲線擬合

1.多項式的曲線擬合
    對於實驗或統計數據,為了描述不同變量之間的關系,經常采用擬合曲線的辦法。擬合曲線,就是要根據已知數據找出相應函數的系數。通常情況下,已知數據往往多於未知系數的個數,所以曲線擬合實質上是解超線性方程組。

 曲線擬合涉及回答兩個基本問題:最佳擬合意味着什么?應該用什么樣的曲線?可用許多不同的方法定義最佳擬合,並存在無窮數目的曲線。所以,從這里開始,我們走向何方?正如它證實的那樣,當最佳擬合被解釋為在數據點的最小誤差平方和,且所用的曲線限定為多項式時,那么曲線擬合是相當簡捷的。數學上,稱為多項式的最小二乘曲線擬合。如果這種描述使你混淆,再研究圖11.1。虛線和標志的數據點之間的垂直距離是在該點的誤差。對各數據點距離求平方,並把平方距離全加起來,就是誤差平方和。這條虛線是使誤差平方和盡可能小的曲線,即是最佳擬合。最小二乘這個術語僅僅是使誤差平方和最小的省略說法。

命令格式:
p=polyfit(x,y,n):在向量p中返回多項式的系數。其中x和y為已知數據的橫坐標和縱坐標向量,n為多項式的次數;
[p,s]=polyfit(x,y,n):同時還返回一個誤差估計數組s。

Matlab polyval

 
   函數功能
 
  多項式的估值運算
 
  
 
  使用方法
 
  y = polyval(p,x)
 
  返回n次多項式在x處的值。輸入變量p是一個長度為n+1的向量,其元素為按降冪排列的多項式系數。
 
  y=p1*x^n+p2*x^(n-1)+...+pn*x+p(n+1)
 
  x可以是一個 矩陣或者一個向量,在這兩種情況下,polyval計算在X中任意元素處的多項式p的估值。
 
   舉例
 
  對多項式p(x)=3*x^2+2*x+1,計算在x=5,7,9的值。
 
  >> p = [3 2 1];
 
  >> x=[5,7,9];
 
  >> polyval(p,[5 7 9])
 
  %結果為
 
  ans =
 
  86 162 262
x=(0:0.1:2.5);%x軸是0.5,只不過每隔0.1顯示一個點(圖中的圈)
y=erf(x);%誤差函數,非初等函數
p=polyfit(x,y,6);
f=polyval(p,x);
plot(x,y,'o',x,f,'-');

 

 

 2. 一維插值
插值定義為對數據點之間函數的估值方法,這些數據點是由某些集合給定。當人們不能很快地求出所需中間點的函數值時,插值是一個有價值的工具。例如,當數據點是某些實驗測量的結果或是過長的計算過程時,就有這種情況。差值在信號和圖像處理方面有很重要的應用。

命令格式:
      yi=interp1(x,Y,xi)
      yi=interp1(x,Y,xi,method)
 其中,xi為需要插值的位置所組成的向量,yi為根據插值算法求得的值所組成的向量。x和Y為已知的數據點向量。參量用於確定具體的插值方法,包括:
  ‘linear’:表示采用線性插值方法
  ‘cubic’:表示采用三次插值方法
  ‘nearest’:表示采用最近點插值方法
  ‘spline’:表示采用三次樣條插值方法
這四種方法都要求把已知數據按x作升序或降序排列

  在選擇插值方法時,應該考慮速度、內存需要和光滑問題。在上述四種方法中,最近點插值法最快,但它的插值很粗糙。線性插值較最近點插值法

需要更多的內存和計算時間,但插值曲線連續,並且導數連續。樣條插值法雖然比三次插值法所需的內存少,但耗時多,不過插值曲線最光滑。需

要說明的是,由於樣條插值的特性,當已知數據分布不均勻時,插值結果不太理想。

【例12】下面兩個向量分別包括了1900到1990年間美國人口普查的年代和相應的人口數(單位為百萬)

t=[1900 1910 1920 1930 1940      1950 1960 1970 1980 1990] p=[75.9950 91.9720 105.7110 123.2030       131.6690 150.6970 179.3230 203.2120        226.5050 249.6330]

 

估計1975年的人口數        

interpl(t,p,1975) 估計1900到2000年每一年的人口數        

x=1900 :1: 2000;        

y=interp1(t,p,x,'spline');        

plot(t,p,'o',x,y)

 

三.離散傅立葉變換

例   給定數學函數
  x(t)=12sin(2π×10t+π/4)+5cos(2π×40t)
取N=128,試對t從0~1秒采樣,用fft作快速傅立葉變換,繪制相應的振幅-頻率圖。
在0~1秒時間范圍內采樣128點,從而可以確定采樣周期和采樣頻率。由於離散傅立葉變換時的下標應是從0到N-1,故在實際應用時下標應該前移1。又考慮到對離散傅立葉變換來說,其振幅| F(k)|是關於N/2對稱的,故只須使k從0到N/2即可。

 1 N=128;                         % 采樣點數
 2 T=1;                                 % 采樣時間終點
 3 t=linspace(0,T,N);                % 給出N個采樣時間ti(I=1:N)
 4 x=12*sin(2*pi*10*t+pi/4)+5*cos(2*pi*40*t);  % 求各采樣點樣本值x
 5 dt=t(2)-t(1);                   % 采樣周期
 6 f=1/dt;                          % 采樣頻率(Hz)
 7 X=fft(x);                        % 計算x的快速傅立葉變換X,ifft是逆變換
 8 F=X(1:N/2+1);                   % F(k)=X(k)(k=1:N/2+1)
 9 f=f*(0:N/2)/N;                  % 使頻率軸f從零開始
10 plot(f,abs(F),'-*')            % 繪制振幅-頻率圖
11 xlabel('Frequency');
12 ylabel('|F(k)|')

 四.多項式計算

  1  多項式的四則運算

    1.多項式的加減運算
    2.多項式乘法運算
  函數conv(P1,P2)用於求多項式P1和P2的乘積。這里,P1、P2是兩個多項式系數向量。
    例  求多項式x4+8x3-10與多項式2x2-x+3的乘積。

    3.多項式除法
  函數[Q,r]=deconv(P1,P2)用於對多項式P1和P2作除法運算。其中Q返回多項式P1除以P2的商式,r返回P1除以P2的余式。這里,Q和r仍是多項式系數向量。
  deconv是conv的逆函數,即有P1=conv(P2,Q)+r。

   2 多項式的導函數(和diff不同的是polyder中p為向量而diff中是符號表達式)

  對多項式求導數的函數是:
  p=polyder(P):求多項式P的導函數
  p=polyder(P,Q):求P·Q的導函數
  [p,q]=polyder(P,Q):求P/Q的導函數,導函數的分子存入p,分母存入q。
  上述函數中,參數P,Q是多項式的向量表示,結果p,q也是多項式的向量表示。

  3  多項式的求值

  MATLAB提供了兩種求多項式值的函數:polyval與polyvalm,它們的輸入參數均為多項式系數向量P和自變量x。兩者的區別在於前者是代數多項式求值,而后者是矩陣多項式求值。

  1.代數多項式求值
  polyval函數用來求代數多項式的值,其調用格式為:
  Y=polyval(P,x)
  若x為一數值,則求多項式在該點的值;若x為向量或矩陣,則對向量或矩陣中的每個元素求其多項式的值。
  例  已知多項式x4+8x3-10,分別取x=1.2和一個2×3矩陣為自變量計算該多項式的值。

  2.矩陣多項式求值
  rank(A)求秩,eig(A)求特征值。
  polyvalm函數用來求矩陣多項式的值,其調用格式與polyval相同,但含義不同。polyvalm函數要求x為方陣,它以方陣為自變量求多項式的值。設A為方陣,P代表多項式x3-5x2+8,那么polyvalm(P,A)的含義         是:A*A*A-5*A*A+8*eye(size(A))
  而polyval(P,A)的含義是:A.*A.*A-5*A.*A+8*ones(size(A))

   4 多項式求根

  n次多項式具有n個根,當然這些根可能是實根,也可能含有若干對共軛復根。MATLAB提供的roots函數用於求多項式的全部根,其調用格式為:
  x=roots(P)
  其中P為多項式的系數向量,求得的根賦給向量x,即x(1),x(2),…,x(n)分別代表多項式的n個根。

  例6-21  求多項式x4+8x3-10的根。
  命令如下:
  A=[1,8,0,0,-10];
  x=roots(A)
  若已知多項式的全部根,則可以用poly函數建立起該多項式,其調用格式為:
  P=poly(x)
  若x為具有n個元素的向量,則poly(x)建立以x為其根的多項式,且將該多項式的系數賦給向量P。

 

  例  已知 f(x)
  (1) 計算f(x)=0 的全部根。
  (2) 由方程f(x)=0的根構造一個多項式g(x),並與f(x)進行對比。
  命令如下:
  P=[3,0,4,-5,-7.2,5];
  X=roots(P)            %求方程f(x)=0的根
  G=poly(X)            %求多項式g(x)

  

 

  

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM