數學模組化與MATLAB–插值與拟合
文章目錄
- 數學模組化與MATLAB--插值與拟合
- 一、什麼是插值和拟合?
-
- 1、什麼是插值?
- 2、什麼是拟合?
- 3、插值與拟合的異同
- 二、插值和拟合問題及方法
-
- 1、相關問題示例
-
- (1)飛機下輪廓線
- (2)海域深度預測
- 2、插值拟合的各種方法
-
- (1)常用的插值方法
- (2)常用的拟合方法
- 3、MATLAB中如何進行插值和拟合
-
- (1)插值函數及相關函數
- (2)拟合函數(隻列舉部分)
- (3)cftool工具箱
- 三、MATLAB插值與拟合執行個體
-
- 1、插值執行個體
-
- (1) interp1的使用
- (2) 以例題2海深為例
- 2、拟合執行個體
- 3、cftool工具箱介紹
一、什麼是插值和拟合?
1、什麼是插值?
通過已知的、離散的資料點,在範圍内推求新資料點的過程或方法。
插值的實質是通過已知的點來求取範圍内位置點的可能值的方法,求的離散已知點附件位置點後相當于求得了此處的函數,是以插值也是求過已知有限個資料點的近似函數的方法。

2、什麼是拟合?
百度解釋為:拟合就是把平面上一系列的點,用一條光滑的曲線連接配接起來
維基解釋為:是一種把現有資料透過數學方法來代入一條數式的表示方式
實際上拟合也是求已知有限點近似函數的方法。
3、插值與拟合的異同
通俗的講:插值需要近似函數經過所有已知資料點,拟合不需要。插值和拟合的相同點在它們都是要根據一組資料構造一個函數作為近似。
二、插值和拟合問題及方法
1、相關問題示例
(1)飛機下輪廓線
(2)海域深度預測
2、插值拟合的各種方法
(1)常用的插值方法
下圖是一些插值的方法:
插值的常用方法有:拉格朗日插值、牛頓插值、分段線性插值、Hermite插值和三次樣條插值
對于此類算法的詳細理論解釋請參考網絡上部落格,下面列舉了一個寫的比較全面的:
插值方法原理詳解
(2)常用的拟合方法
常用的方法有最小二乘法和多項式拟合法
3、MATLAB中如何進行插值和拟合
(1)插值函數及相關函數
注意:MATLAB中的插值函數多為分段插值函數,對于拉格朗日、牛頓等方法無函數可以調用,需要程式設計。
函數 | 功能 |
---|---|
interp1 | 一維插值(nearest、linear、spline、pchip、cubic) |
interp2 | 二維插值(nearest、linear、spline、cubic) |
interp3 | 三維插值(nearest、linear、spline、cubic) |
interpn | n維插值(nearest、linear、spline、cubic) |
interpft | 用快速Fourier 算法作一維插值 |
spline | 三次樣條插值 |
griddata | 插入二維或三維散點資料 |
meshgrid | 生成用于畫三維圖形的矩陣資料 |
(2)拟合函數(隻列舉部分)
函數 | 功能 |
---|---|
polyfit | 多項式拟合 |
fit | 非線性曲線拟合 |
nlinfit | 非線性曲線拟合 |
lsqcurvefit | 最小二乘意義上解決非線性曲線拟合 |
(3)cftool工具箱
MATLAB中有圖形界面可以互動式的拟合資料
在MATLAB指令行視窗中輸入cftool回車即可打開MATLAB的拟合工具箱
三、MATLAB插值與拟合執行個體
1、插值執行個體
(1) interp1的使用
interp1函數為matlab中進行一維插值的函數
調用格式:y = interp1(X,Y,X1,method)
其method的介紹如下表
method | 意義 |
---|---|
linear | 線形插值(預設方法)将與插值點靠近的兩個資料點用直線連接配接,然後在直線上選取對應插值點的資料 |
nearest | 最近點插值 選擇最近樣本點的值作為插值資料 |
pchip | 分段3次埃爾米特插值。采用分段三次多項式,除滿足插值條件,還需滿足在若幹節點處相鄰段插值函數的一階導數相等,使得曲線光滑的同時,還具有保形性 |
spline | 3次樣條插值。每一個分段你内構造一個三次多項式,使其插值函數除滿足插值條件外,還要求在各節點處具有連續的一階和二階導數 |
以問題執行個體一飛機下輪廓線為例:
MATLAB程式如下:
x = [0,3,5,7,9,11,12,13,14,15];
y = [0,1.2,1.7,2.0,2.1,2.0,1.8,1.2,1.0,1.6];
x1 = 0:0.1:15;
y1 = interp1(x,y,x1,'spline');
plot(x1,y1)
title('一維線性插值--飛機下輪廓線')
結果如圖
(2) 以例題2海深為例
MATLAB代碼:
%% 資料輸入
x=[129 140 103.5 88 185.5 195 105.5 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];
% 資料範圍
cx=75:0.5:200;
cy=-50:0.5:150;
%% griddata函數插值
cz=griddata(x,y,z,cx,cy','cubic');
meshz(cx,cy,cz) %繪制網狀圖
% xyz軸
xlabel('X')
ylabel('Y')
zlabel('Z')
figure(2)
%% 繪制海深為5的等高線
contour(cx,cy,cz,[-5 -5]);
grid on
hold on
plot(x,y,'+'); %繪制已知資料點
xlabel('X')
ylabel('Y')
程式運作結果:
2、拟合執行個體
以一個人口預測模型為例示範資料拟合,下面為1790—1980年間美國每隔10年的人口記錄
人口預測模型有很多,在此以著名的馬爾薩斯模型示範
MATLAB代碼:
clc,clear
%% 人口年份資料輸入
a0=[50,0.02];
xdata=[1790:10:1980];
ydata=[3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76.0 92.0 106.5 123.2 131.7 150.7 179.3 204.0 226.5];
%% 非線性拟合
[a,resnorm,residual,flag,output]=lsqcurvefit('fitful2',a0,xdata,ydata)
xi=[1790:10:1980];
yi=fitful2(a,xdata)
%此處代碼去掉注釋符可以繪圖
%plot(xdata,ydata,'r-o',xi,yi,'b-+')
%xlabel('x')
%ylabel('y=f(x)');
%% 2020年人口
y20 = fitful2(a,2020)
上述代碼調用函數:
function y=fitful2(a,x)
y=a(1).*exp(a(2).*x);
end
程式運作結果:
% 部分結果略
y20 =
517.93
此處預測2020年美國人口為517.93百萬,當然此結果明顯是錯誤的,2019年美國人口為328.2百萬。這是由于馬爾薩斯模型本身導緻的,并且預測區間過于長,考慮因素過少等限制的結果的準确性。
3、cftool工具箱介紹
cftool工具箱使用較為簡單,裡面的一些參數的含義需要搞清楚。
等待後續更新!!!
文中部分示例來源于網絡,隻用于學習交流!
MATLAB學習:
知乎專欄–資料可視化和資料分析中matlab的使用
MATLAB學習交流群(MATLAB學習資料):953314432