数学建模(问题和具体的实现):插值和拟合

前言

        就当整理学习笔记了,CSDN写东西很方便,而且能分享给大家看。

        最近在看司守奎老师的数学建模的书,很杂,记笔记才能整理和发现更多问题和更好的掌握。

matlab中有很详细的帮助手册:

网格和散点样本数据 - MATLAB & Simulink - MathWorks 中国

问题1:插值和拟合的区别

拟合和插值的最主要区别在于它们的作用不同:

1. 作用:

        拟合的目标找到一个数学模型,使其与已知数据的整体趋势相匹配,并用该模型来估计未知数据点的值。拟合方法通常用于分析数据的整体趋势、预测未来的趋势(指数级增长)或者进行模型的建立。
       

         插值的目标是通过观测点x其观测值y寻求一条近似函数(一般都是多项式函数)其必须通过所有观测点。插入一个值时直接把x值代入函数公式即可得到y值插值方法用于填补缺失的数据点(又分内插和外推)、重建缺失的时间序列数据,或者在离散数据点之间进行平滑的估计。外推时可进行短期预测,对长期预测不合适。

2. 方法:

        拟合方法通常选择一个数学模型,如线性模型(y = kx + b)、多项式模型(x的多项式)、指数模型(y = a*e^bx + c),然后使用参数估计或优化算法来拟合该模型与已知数据的整体趋势相匹配,得到数学模型的参数值或系数值。


       插值方法可以使用不同的技术,如拉格朗日插值、牛顿插值都是多项式插值法,得到的是关于x的多项式函数,三次样条插值(1)等。这些方法基于已知数据点之间的局部信息,通过插值计算来估计未知数据点的值。

(1)三次是指:数据点之间的每个小区间内使用一个三次多项式函数进行插值,所以是得不到一个完整得函数公式。

问题2:什么是网格数据,什么是散点数据

网络数据:

       网格数据是指在一个矩形的网格结构上采集或表示的数据。网格是由水平和垂直方向上等间距的线组成的结构。在网格数据中,数据点在网格的交叉点上,每个数据点都具有固定的位置和数值。

        网格数据通常用于表示连续的空间或时间上的变量,例如地理空间中的气温分布、海洋中的水流速度等。

        简单来说就是每个给出的(x,y)坐标上都有z值。

散点数据:

        散点数据是指在离散的位置上采集或表示的数据。散点数据的数据点没有规则的排列方式,它们可以在空间中任意分布。每个数据点都有其特定的位置和数值。

        散点数据通常用于表示离散的观测值或采样点,例如在地理空间中测量的地震震级、城市的人口密度等。

        简单来说就是每个给出的(x,y)坐标上只有部分坐标上是给了你Z值的,别的啥都没给你。

区别:

        总结起来,网格数据是在规则的网格结构上采集或表示的数据,而散点数据是在离散的位置上采集或表示的数据。它们在数据的排列方式和表示形式上有所不同,适用于不同的数据分析和可视化方法。

2023.11.15更新插值的例题

matlab中插值的具体实现过程及代码

1.polyfit():简单的得到一维多项式函数:

polyfit():配套poly2sym()使用。

clc
clear
close all

xi = 1:6;
yi = [16 18 21 17 14 12];

% 多项式拟合
degree = 5; % 多项式次数
coefficients = polyfit(xi, yi, degree); % 返回多项式系数

% 得到插值函数
syms x; % 创建符号变量
interpolation_function = poly2sym(coefficients, x);  % 创建插值函数字符串形式,插值函数通过使用poly2sym函数将多项式系数转换为符号表达式
interpolation_function = vpa(interpolation_function,4); % 将系数转换为小数形式
% 将插值函数的字符串形式转换为函数句柄
interpolation_function = str2func(['@(x)' char(interpolation_function)]);
disp('插值函数:');
disp(interpolation_function);

% 绘制图像
figure();
plot(xi, yi, 'ro'); % 原始数据点
hold on;
fplot(interpolation_function,[xi(1),xi(end)]); % 插值函数曲线
legend('原始数据', '插值函数');
xlabel('x');
ylabel('y');
title('多项式插值拟合');

% 插一个值:当观测点x=1.5,计算对应的y值
f = interpolation_function(1.5);        
plot(1.5,f,'r*');


结果:要是效果不好就把系数该大点

2.csape():三次样条插值函数,使用返回的PP结构能够实现函数值计算,微分和积分计算,以及返回三次的函数系数

        csape():在一维函数中,并不能得到一条完整的插值函数,是由多个三次多项式作为插值函数。返回的pp结构有很多作用哈。配套fnval()使用,求积分时使用integral()函数的结果和pp结构中的fnint()函数求得结果误差还挺大的,我感觉是fnint()函数的要精确一些,更接近0。

clc
clear
close all

x0 = 0:1:2*pi;
y0 = sin(x0);
hold on
plot(x0,y0,'ro');
%title('原始数据');
% 三次样条插值,得到结构体pp
pp1=csape(x0,y0);
% 结构体pp的使用
% 显示每个区间上三次多项式的系数
xishu=pp1.coefs;
% 求pp1的函数值
x1 = 0:0.1:2*pi;
y1 = fnval(pp1,x1);% y1就是x1中每个点的函数值
plot(x1,y1,'b-');
legend('原始数据','插值函数');
hold off
% 求pp1的导数
pp2 = fnder(pp1);% 返回pp1对应函数的积分,pp2也是pp结构
x2 = 0:0.1:2*pi;
y2 = fnval(pp2,x2);% y2就是x2中每个点的导数值
% 求pp1的积分
pp3 = fnint(pp1);
y3 = fnval(pp3,2*pi);% 应该是默认从0到2*pi
% 另外一种使用integral函数对导数pp2的导数值求积分
y4 = integral(@(x) fnval(pp2,x),0,2*pi);

结果:

参考司守奎第三版,建议初学者都去认认真真看一遍,打地基用,不用太在意会不会用的上。

注:还是去matalb帮助手册看吧,有图有真相。

后续还会更新哈^-^

2023.12.3号续更

        插值,拟合和函数逼近感觉原理上都差不多,都可以使用fit函数实现,都是可以根据最小二乘法,得到多项式函数,或者三次样条的结构体,去实现求得某个函数值。

        针对插值说必须让函数过每一个观测点,不是硬性要求,看你怎样选择函数,多项式给3肯定比1要过的函数点多,还是归根到最小二乘法上。

        拟合,插值,最好还是通过fit()和fittype()的舒服。三次样条就用csape()的pp结构体。

fittype()和fit()函数,求得函数系数的方式

% 使用fit和fittype函数
% doc fittype
clc
clear
close all
% 创建原始数据
x0 = linspace(1,10,20);
y0 = linspace(3,20,20);
z0 = 1+2*log(x0)+3*y0;
% 原始数据绘图
scatter3(x0,y0,z0);
Ftype = fittype('a+b*log(x)+c*y','independent',{'x','y'},'dependent',{'z'})
[f,fitStruct]= fit([x0',y0'],z0',Ftype,'StartPoint',rand(1,3));
%plot(f,[x0',y0'],z0');

xlabel('x');
disp('残差平方和');
fitStruct.sse
% 直接可以使用f(x,y)
plot3(f(x0,y0),x0,y0);
box on
grid on
f(eps(3/2),0)
% 转化成函数句柄
disp('拟合的函数为');
disp(f)
equ1 = @(x,y) f(x,y)
equ1(1,1)
equ2 = @(x,y) 2*x+2*y
equ2(1,1)
syms x y
equ0 = f.a+f.b*log(x)+f.c*y == 4.0
equ3 = 2*x==2*y+1
% 求解equ1==equ2的x,y的解
[x,y] = solve(equ0,'Real',true);
x
y

代码是以前参考书写的,不想改了^-^

后面是想求拟合的函数和一个平面的交点,但求解的有问题,唉,今年数模国赛B题最后一问拟合平面和单波束到平面交点都没写好,后来再翻书学习的时候才发现书上很多知识都没有细细专研,都没进脑子里,书上好多示例都值得敲一遍。

书用的是司守奎数学建模和算法第三版

里面的程序和数据发网盘里,也可以直接免0积分下载哈

链接:https://pan.baidu.com/s/1JSi3RbMrkMN1FppZjYV-YA?pwd=1234 
提取码:1234 

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值