常見的數值分析方法–插值、擬合、逼近。
- 插值:在離散數據的基礎上補插連續函數,使得這條連續曲線通過全部給定的離散數據點。插值是離散函數逼近的重要方法,利用它可通過函數在有限個點處的取值狀況,估算出函數在其他點處的近似值。圖像處理中用來填充圖像變換時像素之間的空隙。
- 擬合:擬合就是把平面上一系列的點,用一條光滑的曲線連接起來。(曲線不必經過全部給定的離散點)。
一維插值和擬合
1、已知離散點x = [0.0 0.1 0.195 0.3 0.401 0.5],y = [0.39849 0.39695 0.39142 0.38138 0.36812 0.35206],利用插值和擬合求x = 0.25處的值,觀察各種插值和擬合方法的優劣,並對擬合作出擬合曲線。
matlab程序:
clc;
clear all;
close all;
%已知數據
x = [0.0 0.1 0.195 0.3 0.401 0.5];
y = [0.39849 0.39695 0.39142 0.38138 0.36812 0.35206];
figure;
%已知數據折線圖
plot(x, y);
hold on;
%已知數據散點圖
scatter(x, y, '*');
xlabel('x');
ylabel('y');
title('原始數據及一維插值');
%線性插值
T1 = interp1(x, y, 0.25, 'linear')
%最鄰近插值
T2 = interp1(x, y, 0.25, 'nearest')
%三次樣條插值
T3 = interp1(x, y, 0.25, 'spline')
%三次插值
T4 = interp1(x, y, 0.25, 'cubic')
%三次多項式擬合
p = polyfit(x, y, 3)
y0 = polyval(p, 0.25)
x1 = 0:0.01:0.5;
%擬合結果
y1 = polyval(p, x1);
figure;
%擬合後的曲線
plot(x1, y1);
hold on;
scatter(x, y, '*');
xlabel('x');
ylabel('y');
title('擬合後的曲線');
結果:
T1 =
0.3862
T2 =
0.3814
T3 =
0.3867
T4 =
0.3867
p =
0.0669 -0.2326 0.0067 0.3985
y0 =
0.3867
另外還可以使用cftool工具箱進行直接觀察:
直接在command窗口輸入cftool即可調用該工具箱。
平滑擬合結果:
插值結果:
2、已知離散值x = [0.15 0.16 0.17 0.18],y = [3.5 1.5 2.5 2.8],利用三次樣條插值求解此函數在0.15,0.18上的定積分。
malab程序:
clc
close all;
%已知數據
x0=[0.15 0.16 0.17 0.18];
y0=[3.5 1.5 2.5 2.8];
%三次樣條插值
pp = csape(x0, y0);
xishu = pp.coefs;
%求積分
s = quadl(@(t)ppval(pp, t), 0.15, 0.18)
%繪製三次樣條插值後的圖形
x = 0.15:0.001:0.18;
y = ppval(pp, x);
plot(x, y);
grid on;
hold on;
%繪製散點
scatter(x0, y0, '*');
運行結果:
s =
0.0686
圖形:
使用cftool工具箱:
二維插值
1、x和y方向上每隔100測定一個點,得到高度如下表,試插值一曲面,並根據所的曲面找出最高點座標和高度值。
clear all;
clc
close all;
%原始數據
x=100:100:500;
y=100:100:400;
z=[636 697 624 478 450
698 712 630 478 420
680 674 598 412 400
662 626 552 334 310];
%三次樣條插值
pp = csape({x,y},z');
%獲取確定點的插值大小
xi = 100:10:500;
yi=100:10:400;
cz=fnval(pp,{xi,yi});
%找最高點的索引
[i,j]=find(cz==max(max(cz)));
%求最高點座標和值
x=xi(i)
y=yi(j)
zmax=cz(i,j)
%作圖
[y1, x1] = meshgrid(yi, xi);
mesh(x1, y1, cz);
運行結果:
x =
170
y =
180
zmax =
720.6252
使用cftool工具箱:
2、利用二維插值繪製x∈(75,200),y∈(-81, 150)的圖形。
matlab代碼:
clear all;
clc
close all;
%原始數據
x=[129 140 103.5 88 185.5 195 105 157.5 107.5 77 81 162 162 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];
%插值區間
xi=75:0.5:200;
yi=-81:0.5:150;
%立方插值
zi1=griddata(x,y,z,xi,yi','cubic');
%最近點插值
zi2=griddata(x,y,z,xi,yi','nearest');
%立方插值與最近點插值的混合插值的初始值
zi=zi1;
%把立方插值中的不確定值換成最近點插值的結果
zi(isnan(zi1))=zi2(isnan(zi1));
figure;
%原屬數據的散點
scatter3(x,y, z, '*', 'r');
hold on;
mesh(xi,yi,zi);
xlabel('x');
ylabel('y');
zlabel('z');
title('插值結果');
使用cftool工具箱: