• 数学建模——插值拟合


    目录

    插值

    一维插值

    二维插值

    散乱数据插值

    拟合

    线性最小二乘法实现

    fittype和fit函数

    lsqcurvefit函数

    拟合工具

    其他


    插值:每一个点一定在曲线上;拟合:点不一定在曲线上。 

    如果构造n次插值多项式,则需要n+1个约束方程。插值多项式P(x)与被插函数f(x)之间的差称为截断误差,用R(x)表示。

     此时a0到an是未知数,未知数的系数是一个范德蒙行列式,在matlab中,直接用y除以系数矩阵即可求出未知数。

    例子:

    对下面的观测点进行插值,并估计x=1.5处的函数值

    1. clc,clear
    2. x0 = [1:6]';
    3. y0 = [16 18 21 17 15 12]';
    4. A = vander(x0);%生成范德蒙行列式
    5. p = A\y0
    6. x = [1.5];
    7. y = polyval(p,x)%用于多项式计算,可查看帮助文档看具体用法

    也可以使用matlab的APP中Curve Fitting生成拟合曲线,选择五次线性拟合就会和插值的结果一样,在文件中,可以生成拟合后的代码。

    插值

    一维插值

    vq = interp1(x,v,xq,method,extrapolation)

    %向量 x 包含样本点,v 包含对应值 v(x)。向量 xq 包含查询点的坐标。method指定插值方法,如果希望使用 method 算法进行外插,可将 extrapolation 设置为 'extrap'

    F = griddedInterpolant(X,V,Method,ExtrapolationMethod)

    %求插值后某点的值时,直接y = F(x)即可

    pp = csape(x0,y0);

    %三次样条插值函数,返回值是pp形式。

    格式函数功能
    pp1=csape(x0,y0)计算插值函数

    pp2=fnder(pp1)

    计算pp1对应函数的导数,返回值也是pp格式

    pp3=fnint(pp1)计算pp1对应函数的积分,返回值也是pp格式
    y=fnval(pp1,x)计算pp1对应的函数在x点的取值
    pp.coefs显示每个区间函数的系数

    相比于interp1,另外两个函数可以生成匿名函数

    例子:

    数据点如表:

    t0.150.160.170.18
    v(t)3.51.52.52.8

    用三次样条插值求s=\int_{0.15}^{0.18}v(t)dt

    1. clc,clear,format long g
    2. t0 = 0.15:0.01:0.18;
    3. v0 = [3.5 1.5 2.5 2.8];
    4. vt = griddedInterpolant(t0,v0,'spline')%求三次插值样条
    5. s1 = integral(@(t)vt(t),0.15,0.18)%求积分
    6. pp=csape(t0,v0);
    7. xishu=pp.coefs
    8. pp3=fnint(pp)
    9. y=fnval(pp3,0.18)-fnval(pp3,0.15)
    10. %s2=integral(@(t)fnval(pp,t),0.15,0.18)
    11. format%恢复短小数显示格式

    二维插值

    Vq = interp2(X,Y,V,Xq,Yq,method,extrapval)

    %X 和 Y 包含样本点的坐标,X是行向量,Y是列向量。V 包含各样本点处的对应函数值。Xq 和 Yq 包含查询点的坐标。

    pp = csape({x0,y0},z0)    z = fnval(pp,{x,y})

    %x0,y0分别为m维和n维向量,z0为m*n维矩阵。x,y为想插值的点

    F = griddedInterpolant(X1,X2,V,Method,ExtrapolationMethod)

    %求插值后某点的值时,直接y = F(x1,x2)即可

     例如:

    1. x = -5:0.8:5;
    2. y = x';
    3. z = sin(x.^2 + y.^2) ./ (x.^2 + y.^2);
    4. F = griddedInterpolant({x,y},z);
    5. xq = -5:0.1:5;
    6. yq = xq';
    7. vq = F({xq,yq});
    8. surf(xq,yq,vq)

    散乱数据插值

    vq = griddata(x,y,v,xq,yq) 使 v = f(x,y) 形式的曲面与向量 (x,y,v) 中的散点数据拟合。griddata 函数在 (xq,yq) 指定的查询点对曲面进行插值并返回插入的值 vq。曲面始终穿过 x 和 y 定义的数据点,x,y应该是一个行向量,一个列向量。

    F = scatteredInterpolant(x,y,v) 创建一个拟合 v = F(x,y) 形式的曲面的插值。向量 x 和 y 指定样本点的 (x,y) 坐标。v 是一个包含与点 (x,y) 关联的样本值的向量。也相当于一个匿名函数

    拟合

    线性最小二乘法实现

     线性方程组:RA=Y。求取参数向量A方法:A=R\Y

    例子:

    根据实验数据,建立经验公式y=at+b

    t01234567
    y27.026.826.526.326.125.725.324.8
    1. clc,clear
    2. t = [0:7]';
    3. y = [27.0 26.8 26.5 26.3 26.1 25.7 25.3 24.8]';
    4. a = [t,ones(8,1)];
    5. cs= a\y

    约束线性最小二乘解

     x = lsqlin(C,d,A,b,Aeq,beq,lb,ub) ,C*x = d,线性等式约束 Aeq*x = beq 和边界 lb ≤ x ≤ ub。

    例子:

    给定拟合函数y=ae^{x}+blnx,满足a,b\geqslant0,a+b\leqslant 1

    x35674859
    y49538585
    1. clc,clear
    2. x0 = [3 5 6 7 4 8 5 9]';
    3. d = [4 9 5 3 8 5 8 5]';
    4. C = [exp(x0),log(x0)];
    5. A = [1 1];
    6. b = 1;
    7. lb = zeros(2,1);
    8. cs = lsqlin(C,d,A,b,[],[],lb)

    多项式拟合 

    p = polyfit(x,y,n);%拟合n次多项式,返回值p是多项式对应的系数,次序是从高次幂到低次幂。

    y = ployval(p,x);%计算多项式p在x处的函数值。

    fittype和fit函数

     函数fit需要和函数fittype配合使用,fittype用于定义拟合的函数类,fit用于函数拟合。fit可以拟合一元和二元函数,线性和非线性都可以。

    aFittype = fittype(libraryModelName)%利用库模型定义函数类

    aFittype = fittype(expression,Name,Value)%利用字符串定义函数类

    aFittype = fittype(linearModelTerms,Name,Value)%利用基函数的线性组合定义函数类

    aFittype = fittype(anonymousFunction,Name,Value)%利用匿名函数定义函数类

     

    fitobject = fit(x,y,fitType)%x,y分别为自变量和因变量的观测值列向量,返回值是拟合函数的信息。

    fitobject = fit([x,y],z,fitType)%[x,y]为自变量的观测值的两列矩阵,z为因变量的观测值列向量,可以拟合二元函数。

    [fitobject,gof] = fit(x,y,fitType)%gof可以给出模型的一些检验统计量。

    例子:

    拟合函数

    1. clc,clear
    2. x1 = [6 2 6 7 4 2 5 9]';
    3. x2 = [4 9 5 3 8 5 8 2]';
    4. z = [14.2077 39.3622 17.8077 11.8310 32.8618 16.9622 33.0941 11.1737]';
    5. g = fittype('a*exp(b*x)+c*y^2','dependent','z','independent',{'x','y'});
    6. [f,st] = fit([x1,x2],z,g,'StartPoint',rand(1,3))
    7. plot(f)

    拟合分段函数:

    1. g = @(a,b,c,d,k,x)(a+b*x).*(x=k);%注意点乘
    2. g = fittype(g)
    3. ...

     匿名函数定义中,必须把自变量放在匿名函数输入参数的最后一个。

    lsqcurvefit函数

    该函数可以拟合多元函数。

    x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options)

    xdata是x观测值,ydata是y观测值,\theta是参数向量

    拟合工具

    最好用的还是APP中的拟合工具,可以生成代码,也可以导入到工作空间。如果导入到工作空间,就相当于一个匿名函数,可以直接使用。

    其他

    ①trapz函数可以通过梯形法计算近似积分。

    ②gradient是求数值梯度的函数。[Fx,Fy]=gradient(F,hx,hy),其中Fx为其水平方向上的梯度,Fy为其垂直方向上的梯度,Fx的第一列元素为原矩阵第二列与第一列元素之差除以hx,Fx的第二列元素为原矩阵第三列与第一列元素之差除以(2*hx),以此类推:Fx(i,j)=(F(i,j+1)-F(i,j-1))/(2*hx)。最后一列则为最后两列之差除以hx。同理,可以得到Fy。

    ③contour函数可以画出矩阵的等高线图

    ④meshgrid(x,y)基于向量x和y中包含的坐标返回二维网格坐标

    ⑤quiver(x,y,u,v)该函数使用箭头来直观的显示矢量场。该调用格式表示通过在(x, y)指定的位置绘制小箭头来表示以该点为起点的向量(u,v)。

    ⑥clabel(h) 为当前等高线图h添加标签

    ⑦norm(v) 返回向量 v 的欧几里德范数。此范数也称为 2-范数、向量模或欧几里德长度。

    ⑧fimplicit绘制隐函数图像

    1. f = @(x,y) x.^2 + y.^2 - 3;
    2. fimplicit(f,[-3 0 -2 2])

    ⑨title、xlabel、ylabel、zlabel、textbox和legend等的Interpreter属性有三个属性:latex 、tex、none

    ⑩求两个方程的交点(f本身就是一个匿名函数,求f和2x-1的交点,rand赋初值)

     

  • 相关阅读:
    Nacos集群搭建
    GB28181学习(九)——校时
    Python最常用的库
    任务流程----
    分布式事务,单JVM进程与多数据库,分布式事务技术选型,0-1过程,代码全。
    正则表达式
    硬件学习件Cadence day14 器件TOP 层和 BOTTOM 层都有贴片怎么设计
    SpringBoot集成MybatisPlus项目实操
    ML |机器学习模型如何检测和预防过拟合?
    [源码解析] NVIDIA HugeCTR,GPU版本参数服务器--- (2)
  • 原文地址:https://blog.csdn.net/m0_51311105/article/details/125836351