数学建模--插值和拟合

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_41122036/article/details/100008567

常见的数值分析方法–插值、拟合、逼近。

  • 插值:在离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点。插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近似值。图像处理中用来填充图像变换时像素之间的空隙。
  • 拟合:拟合就是把平面上一系列的点,用一条光滑的曲线连接起来。(曲线不必经过全部给定的离散点)。

一维插值和拟合

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工具箱:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41122036/article/details/100008567