版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
常见的数值分析方法–插值、拟合、逼近。
- 插值:在离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点。插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近似值。图像处理中用来填充图像变换时像素之间的空隙。
- 拟合:拟合就是把平面上一系列的点,用一条光滑的曲线连接起来。(曲线不必经过全部给定的离散点)。
一维插值和拟合
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工具箱: