通信系統仿真(一些簡單的MATLAB函數學習)(多項式插值與擬合)(一)

一、創建向量的函數

1.線性增量序列模式

基本格式
linspace(startValue, endValue)
linspace(startValue, endValue, nElements)
註解: 當 nElements缺省時,nElements=100

例如:

u=linspace(0,0.25,5)
u=
0 0.0625 0.1250 0.1850 0.2500

2.指數增量序列模式

基本格式
logspace(startValue, endValue)
logspace(startValue, endValue, nElements)
註解: 從 10^startValue 到 10^endValue

u=logspace(1,4,4)
u=
10 100 1000 10000

3.使用冒號創建向量

  • 基本格式
    startValue: endValue
    startValue: increment: endValue
    註解:缺省增量爲單位值1

s=1:4
s =
1 2 3 4

t=0:0.1:0.4
t=
0 0.1 0.2 0.3 0.4
在這裏插入圖片描述

%計算函數值z=...,x和y取值區間爲[-8,8],等間隔取10個點
x = linspace(-8,8,10);
y = linspace(-8,8,10);
z = (sin(sqrt(x.^2 + y.^2)))./(sqrt(x.^2 + y.^2))
%計算函數y=...的數值,t取值區間爲[0,4*pi],取值間隔爲0.1pi
t = (0:0.1:4)*pi;
y = exp(t./3).*sin(t);

二、多項式與插值

1.多項式的表達

數學表達式
y=c1x+c2x+c3x+c4x+…+cn*x
求值計算

c=[c1,c2,c3,…,cn,];
y=polyval(c,x)

2.多項式的插值

(1).一維插值

yi=interp1(x,y,xi,’method’)
x,y爲行向量
xi爲插值範圍內任意點的x座標
yi爲插值運算後的對應y座標
method— linear (默認)/ nearest/ spline/ previous / next
/ pchip/ cubic
在這裏插入圖片描述
例如:
x0=0:0.12:1;
y0=(x0.^2-3*x0+5).exp(-5x0).*sin(x0);
plot(x0,y0,’ro-’)
x1=0:0.02:1;
y1=interp1(x0,y0,x1,’linear’);
y2=interp1(x0,y0,x1,’cubic’);
y3=interp1(x0,y0,x1,’spline’);
y4=interp1(x0,y0,x1,’nearest’);
plot(x1,y1,‘k’);
.
.
.
plot(x0,y0)
legend(‘linear’,’cubic’,’spline’,’nearest’,’樣本點’,‘原函數’ );
在這裏插入圖片描述

(2).二維插值

zi= griddata(x,y,z,xi,yi,method);
例:
zi= griddata(x,y,z,xi,yi,‘nearest’);
mesh(xi,yi,zi)
hold on
plot3(x,y,z,’mo’)
在這裏插入圖片描述
interp2能較好的進行二維運算,但只能處理以網格形式給出的數據,通過使用mesh(xi,yi,zi)函數先進行處理。

(3).多維插值

三維插值:
interp3(x,y,z,v,xi,yi,zi,method)
n維插值:
interpn(x1,x2,x3…,v,y1,y2,y3,…,method)
n維空間柵格
[X1,X2,X3,…]=ndgrid(x1,x2,x3,…)

二、多項式擬合

問題:給定一批數據點,需確定滿足特定要求的曲線或曲面
解決方案:
• 若要求所求曲線(面)通過所給所有數據點,就是插值問題;
• 若不要求曲線(面)通過所有數據點,而是要求它反映對象整體的變化趨勢,就是數據擬合。

1.擬合的基本原理

曲線擬合問題最常用的解法——線性最小二乘法的基本思路

2.用MATLAB解決擬合問題

(1).線性最小二乘擬合

用一個多項式來逼近一組給定數據:
p=polyfit(x,y,n)
x、 y表示數據點的橫、縱座標
n表示用來擬合的多項式的階次
p爲擬合的多項式,爲n+1個係數的行向量

確定n的方法:

for i=1:8
	y2=polyfit(x0,y0,i);
	Y=polyval(y2,x0);%計算擬合函數在x處的值
	if sum((Y-y0).^2)<0.1 %誤差平方和精度範圍
		c=i;
		break;
	end
end

評估擬合效果的方法:
• 差值求和, sum(abs(nihe-shiji)) 取得最小即可;
• 和方差: sum((nihe-shiji)2) ,越接近0,效果越好

(2).非線性最小二乘擬合

Matlab提供的求非線性最小二乘擬合的函數有:
lsqcurvefit:
[x,resnorm]=lsqcurvefit(fun,x0,xdata,ydata))
lsqnonlin:
x=lsqnonlin(fun,x0,lb,ub)
nlinfit:
[beta,r,J]=nlinfit(x,y,fun,beta0)

• 先定義函數, 通常用inline函數定義。
fun=inline(‘f(x)’,‘參變量’,‘x’)
• 然後利用nlinfit函數如下命令:
[beta,r,J]=nlinfit(x,y,fun,beta0)
x, y爲原始數據, fun是定義好的函數, beta0是函數中參數的初始值
例子:

x=2:2:20;
y=[zeros(1,5) ones(1,5)];
plot(x,y,'o');
axis([0 20 -0.2 1.2])
myfun=inline('1./(1+exp(-a*(x-10)))','a','x')
a=5;
beta = nlinfit(x,y,myfun,a)
y1=1./(1+exp(-beta*(x-10)));
plot(x,y,'o',xp,y1,'r',xp,y5,'g',xp,ys,'k')
legend('data','一階多項式擬合','五階多項式擬合','s型曲線擬合')

在這裏插入圖片描述
在這裏插入圖片描述

% 已知某信號電平的測量值爲:[0.9845, 0.7676, 
% 0.1897, -0.4542, -0.8871, -0.9896, -0.8076, -
% 0.4797, -0.1496, 0.0888, 0.2055 0.2189, 0.1699, 
% 0.0998, 0.0371, -0.0048, -0.0247, -0.0280, -0.0222, 
% -0.0135, -0.0057] mV,以第一個數據測量點作爲時間零點,每隔0.5秒測量一次。用三次樣條插值的方法完成如下操作:
% (1) 畫出每隔1毫秒的插值曲線圖形,並將原始的數據畫在同一圖上。
% (2) 估算6.6秒時的信號電平。
y0 = [0.9845,0.7676,0.1897,-0.4542,-0.8871,-0.9896,-0.8076,-0.4797,-0.1496,0.0888,0.2055,0.2189,0.1699,0.0988,0.0371,-0.0048,-0.0247,-0.0280,0.1699,0.0988,0.0371,-0.0048,-0.0247,-0.0280,-0.0222,-0.0135,-0.0057];
x0 = 0:0.5:10;
x1 = 0:0.001:10;
y1 = interp1(x0,y0,x1,'spline');
plot(x1,y1,'b-',x0,y0,'r-');
legend('spline','樣本點')
%根據生成的數據進行插值處理,得出較爲平緩的曲線
x0 = 0:0.12:1;
y0 = (x0.^2 - 3*x0 + 5).*exp(-5*x0).*sin(x0);
figure(1)
plot(x0,y0,'ro-')
x1 = 0:0.02:1;
y = (x1.^2 - 3*x1 + 5).*exp(-5*1).*sin(x1);
y1 = interp1(x0,y0,x1,'linear');
y2 = interp1(x0,y0,x1,'cubic');
y3 = interp1(x0,y0,x1,'spline');
y4 = interp1(x0,y0,x1,'nearest');
plot(x1,y1,'kx-',x1,y2,'rs-',x1,y3,'go-',x1,y4,'m^-',x0,y0,'yo-',x1,y,'b-')
legend('linear','cubic','spline','nearest','樣本點','原函數')
figure(2)

在這裏插入圖片描述

% 已知平板表面分爲5*3的網格,各處溫度值爲:
% [82 81 80 82 84;79 63 61 65 81;84 84 82 85 86], 做出平板表面溫度分佈曲面,在x,y方
% 向上每隔0.2個單位進行插值,畫出插值後的圖形。
[x,y] = meshgrid(0:4,0:2);
z = [82 81 80 82 84;79 63 61 65 81;84 84 82 85 86];
mesh(x,y,z) %mesh函數是繪製三維曲面的函數
[x1,y1] = meshgrid(0:0.2:4,0:0.2:2)
z1 = interp2(x,y,z,x1,y1,'cubic');
mesh(x1,y1,z1)
% 隨機數據的二維插值
x=-3+6*rand(1,200);
y=-2+4*rand(1,200);
plot(x,y,'*')
z=(x.^2-2*x).*exp(-x.^2-y.^2-x.*y);
[x1,y1]=meshgrid(-3:.2:3,-2:.2:2);
z1=griddata(x,y,z,x1,y1,'cubic');
figure
surf(x1,y1,z1)

在這裏插入圖片描述

% 自變量x的取值爲x=[129.0 140.0 103.5 88.0 185.5 195.0 105.5 157.5 107.5 77.0 81.0 162.0 162.0 117.5];
% 自變量y的取值爲 y=[7.5 141.5 23 147 22.5 137.5 85.5 -6.5 -81 3 56.5 -66.5 84 -33.5];
% 變量z的取值爲Z=[4 8 6 8 6 8 8 9 9 8 8 9 4 9];
% 插值的取值範圍:x爲70:3:200; y爲 -70:3:150;
x=[129.0 140.0 103.5 88.0 185.5 195.0 105.5 157.5 107.5 77.0 81.0 162.0 162.0 117.5];
y=[7.5 141.5 23 147 22.5 137.5 85.5 -6.5 -81 3 56.5 -66.5 84 -33.5];
z=[4 8 6 8 6 8 8 9 9 8 8 9 4 9];
[x1,y1] = meshgrid(70:3:200,-70:3:150);
z1 = griddata(x,y,z,x1,y1,'cubic')
mesh(x1,y1,z1)

在這裏插入圖片描述

% 試用多項式擬合的方法在不同階次下進行擬合,並觀察效果,找到合適階次。
x0=0:0.1:1;
y0=(x0.^2-3*x0+5).*exp(-5*x0).*sin(x0);
p3=polyfit(x0,y0,3);%p3爲擬合多項式的係數
y3=polyval(p3,x0);
p4=polyfit(x0,y0,4);
y4=polyval(p4,x0);
p5=polyfit(x0,y0,5);
y5=polyval(p5,x0);
p8=polyfit(x0,y0,8);
y8=polyval(p8,x0);
p1=polyfit(x0,y0,1);
y1=polyval(p1,x0);
plot(x0,y3,'bo-',x0,y4,'g--',x0,y5,'m--',x0,y8,'b*-',x0,y0,'ro-')
legend('三次擬合','四次擬合','五次擬合','八次擬合','原函數曲線')

在這裏插入圖片描述

%某學生做材料實驗,得到溫度與長度的變化數據:溫度 = 20:5:45; 長度= [81,82.3,84,86.9,89,90.8];
% 請用多項式擬合法,確定擬合階數,確定L 和t的關係表達式(poly2str),並計算和方差
x0 = 20:5:45;
y0 = [81,82.3,84,86.9,89,90.8];
for i=1:8
pi = polyfit(x0,y0,i);
yi = polyval(pi,x0)
if sum((yi-y0).^2)<1e-5
a = i
b = pi
c = sum((yi-y0).^2)
plot(x0,y0,'g--',x0,yi,'ro-')
legend('原函數','擬合函數')
break;
end
end
% x=1:20,y=x+3sin(x).
% 利用多項式擬合法,確定擬合階數,並繪製出理論曲線與擬合曲線,對比擬合效果。```

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章