數學建模--插值和擬合

常見的數值分析方法–插值、擬合、逼近。

  • 插值:在離散數據的基礎上補插連續函數,使得這條連續曲線通過全部給定的離散數據點。插值是離散函數逼近的重要方法,利用它可通過函數在有限個點處的取值狀況,估算出函數在其他點處的近似值。圖像處理中用來填充圖像變換時像素之間的空隙。
  • 擬合:擬合就是把平面上一系列的點,用一條光滑的曲線連接起來。(曲線不必經過全部給定的離散點)。

一維插值和擬合

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工具箱:
在這裏插入圖片描述

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