MATLAB 之 数据插值、曲线拟合和数值微分

这里写目录标题

  • 一、数据插值
    • 1. 一维数据插值
    • 2. 二维数据插值
  • 二、曲线拟合
    • 1. 曲线拟合原理
    • 2. 曲线拟合的实现
  • 三、数值微分
    • 1. 数值差分与差商
    • 2. 数值微分的实现

一、数据插值

  • 在工程测量和科学实验中,所得到的数据通常都是离散的。如果要得到这些离散点以外的其他点的数值,就需要根据这些已知数据进行插值。例如,测量得

    n

    n

    n 个点的数据为

    (

    x

    1

    ,

    y

    1

    )

    (

    x

    2

    ,

    y

    2

    )

    (

    x

    n

    ,

    y

    n

    )

    (x_{1},y_{1}),(x_{2},y_{2}),\dots ,(x_{n},y_{n})

    (x1​,y1​),(x2​,y2​),…,(xn​,yn​),这些数据点反映了一个函数关系

    y

    =

    f

    (

    x

    )

    y=f(x)

    y=f(x),然而并不知道

    f

    (

    x

    )

    f(x)

    f(x) 的解析式。

  • 数据插值的任务就是根据上述条件构造一个函数

    y

    =

    g

    (

    x

    )

    y=g(x)

    y=g(x), 使得在

    x

    (

    i

    =

    1

    ,

    2

    ,

    .

    .

    .

    n

    )

    x(i=1, 2, … n)

    x(i=1,2,…n),有

    g

    (

    x

    )

    =

    f

    (

    x

    )

    g(x)=f(x)

    g(x)=f(x),且在两个相邻的采样点

    (

    x

    i

    ,

    x

    i

    +

    1

    )

    (

    i

    =

    1

    ,

    2

    ,

    ,

    n

    1

    )

    (x_{i},x_{i+1})(i=1,2,\dots ,n-1)

    (xi​,xi+1​)(i=1,2,…,n−1) 之间,

    g

    (

    x

    )

    g(x)

    g(x) 光滑过渡。如果被插值函数

    f

    (

    x

    )

    f(x)

    f(x) 是光滑的,并且采样点足够密,一般在采样区间内,

    f

    (

    x

    )

    f(x)

    f(x) 与

    g

    (

    x

    )

    g(x)

    g(x) 比较接近。插值函数

    g

    (

    x

    )

    g(x)

    g(x) 一般由线性函数、多项式、样条函数或这些函数的分段函数充当。

  • 根据被插值函数的自变量个数,插值问题分为一维插值、 二维插值和多维插值等;根据选用的插值方法,插值问题又分为线性插值、多项式插值和样条插值等。MATLAB 提供了一维、二维、

    N

    N

    N 维数据插值函数 interp1、interp2 和 interpn,以及 3 次埃尔米特(Hermite)插值函数 pchip 和 3 次样条插值函数 spline 等。

1. 一维数据插值

  • 如果被插值函数是一个单变量函数,则数据插值问题称为一维插值。一维插值采用的方法有线性插值、最近点插值、3 次埃尔米特插值和 3 次样条插值。在 MATLAB 中,实现这些插值的函数是 interp1,其调用格式如下:
    Y1=interp1(X,Y,X1,method)
  • 函数根据

    X

    Y

    X、Y

    X、Y 的值,计算函数在

    X

    1

    X1

    X1 处的值。其中,

    X

    Y

    X、Y

    X、Y 是两个等长的已知向量,分别描述采样点和采样值。若同一个采样点有多种采样值,则

    Y

    Y

    Y 可以为矩阵,

    Y

    Y

    Y 的每一列对应一组采样。

    X

    1

    X1

    X1 是一个向量或标量,描述欲插值的点,

    Y

    1

    Y1

    Y1 是一个与

    X

    1

    X1

    X1 等长的插值结果。method 用于指定插值方法,允许的取值有以下几种。

  • (1) ‘linear’:线性插值。线性插值是默认的插值方法,它是把与插值点靠近的两个数据点用直线连接,然后在直线上选取对应插值点的数据。
  • (2) ‘nearest’:最近点插值。根据插值点与已知数据点的远近程度进行插值。插值点优先选择较近的数据点进行插值操作。
  • (3) ‘pchip’:分段 3 次埃尔米特插值。分段三次埃尔米特插值采用分段三次多项式,除满足插值条件,还需要满足在若干节点处的一阶导数也相等,从而提高了插值函数的光滑性。MATLAB 中有一个专门的 3 次埃尔米特插值函数 pchip(X,Y,X1),其功能及使用方法与函数 interpl(X,Y,X,’pchip’) 相同。
  • (4) ‘spline’:3 次样条插值。所谓 3 次样条插值,是指在每个分段(子区间)内构造一个 3 次多项式,使其插值函数除满足插值条件外,还要求在各节点处具有连续的一阶和二阶导数,从而保证节点处光滑。MATLAB 中有一个专门的 3 次样条插值函数 spline(X,Y,X1),其功能及使用方法与函数 interp1(X,Y,Xl,’spline’) 相同。
  • 注意:对于超出 X 范围的插值点,使用 “linear” 和 “nearest” 插值方法,会给出 “NaN” 错误。对于其他的方法,将对超出范围的插值点执行外插值算法。
  • 例如,以下概率积分的数据如下表所示,我们用不同的插值方法计算

    f

    (

    0.472

    )

    f(0.472)

    f(0.472)。

    f

    (

    x

    )

    =

    2

    π

    0

    x

    e

    x

    2

    d

    x

    f(x)=\frac{2}{\sqrt{\pi}}\int_{0}^{x}e^{-x^{2}}\mathrm{d}x

    f(x)=π
    ​2​∫0x​e−x2dx

x

x

x

f

(

x

)

f(x)

f(x)

0.460.4846555
0.470.4937542
0.480.5027498
0.490.5116683
  • 这是一个一维插值问题,程序如下:
>> x=0.46:0.01:0.49;  %给出x>> f=[0.4846555,0.4937542,0.5027498,0.5116683];  %给出f(x)>> format long  %显示小数点后16位>> interp1(x,f,0.472)  %用默认方法,即线性插值计算f(0.472)ans =   0.495553320000000>>  interp1(x,f,0.472,'nearest')  %用最近点插值计算f(0.472)ans =   0.493754200000000>> interp1(x,f,0.472,'pchip')  %用3次埃尔米特计算f(0.472)ans =   0.495561119712056>> interp1(x,f,0.472,'spline')  %用3次样条插值计算f(0.472)ans =   0.495560736000000>> format short  %小数点后显示4位
  • 例中,3 次埃尔米特和 3 次样条插值的插值结果优于最近点插值方法和线性插值方法,但插值方法的好坏还依赖于被插值函数,没有一种对 所有函数都是最好的插值方法。
  • 例如,某检测参数

    f

    f

    f 随时间

    t

    t

    t 的采样结果如下表所示,我们用数据插值法计算

    t

    =

    2

    ,

    12

    ,

    22

    ,

    32

    ,

    42

    ,

    52

    t=2,12,22,32,42,52

    t=2,12,22,32,42,52 时的

    f

    f

    f 值。

t

t

t

f

f

f

t

t

t

f

f

f

03.102552.256
10879.5152968.8
202968.8254136.2
305237.9356152.7
406725.3456848.3
506403.5556824.7
607328.5657857.6
  • 这是一个一维数据插值问题,程序如下:
>> T=0:5:65;  %给出T>> X=2:10:52;  %给出X>> F=[3.2015,2.2560,879.5,1835.9,2968.8,4136.2,5237.9,6152.7,...    6725.3,6848.3,6403.5,6824.7,7328.5,7857.6];  %给出F(x)>> F1=interp1(T,F,X)  %用线性插值方法插值F1 =   1.0e+03 *  列 1 至 5   0.002823300000000   1.262060000000000   3.435760000000000   5.603820000000000   6.774500000000000  列 6   6.571980000000000>> F2=interp1(T,F,X,'nearest')  %用最近点插值法插值F2 =   1.0e+03 *  列 1 至 5   0.003201500000000   0.879500000000000   2.968800000000000   5.237900000000000   6.725300000000000  列 6   6.403500000000000>> F3=interp1(T,F,X,'pchip')  %用3次埃尔米特插值方法插值F3 =   1.0e+03 *  列 1 至 5   0.002460228000000   1.248358437730487   3.436483654858926   5.636234122067274   6.797756124209316  列 6   6.507716445924324>> F4=interp1(T,F,X,'spline')  %用3次样条插值方法插值F4 =   1.0e+03 *  列 1 至 5  -0.170219570210629   1.256002190473428   3.439603968838626   5.637043773267335   6.859291256904060  列 6   6.481654623389509
  • 这里小数点后显示 16 位是因为上次使用了 format long 代码,但未执行 format short 代码。

2. 二维数据插值

  • 当函数依赖于两个自变量变化时,其采样点就应该是一个由这两个参数组成的一个平面区域,插值函数也是一个二维函数。对依赖于两个参数的函数进行插值的问题称为二维插值问题。
  • 同样,在 MATLAB 中,提供了解决二维插值问题的函数 interp2,其调用格式如下:
    Z1=interp2(X,Y,Z,X1,Y1,method)
  • 其中,

    X

    Y

    X、Y

    X、Y 是两个向量,分别描述两个参数的采样点,

    Z

    Z

    Z 是与参数采样点对应的函数值,

    X

    1

    Y

    1

    X1、Y1

    X1、Y1 是两个向量或标量,描述欲插值的点。

    Z

    1

    Z1

    Z1 是根据相应的插值方法得到的插值结果。

  • method 的取值与一维插值函数相同,但二维插值不支持 ‘pchip’ 方法。

    X

    Y

    Z

    X、Y、Z

    X、Y、Z 也可以是矩阵形式。同样,对于超出

    X

    Y

    X、Y

    X、Y 范围的插值点,使用 ‘linear’ 和 ‘nearest’ 插值方法,会给出 NaN 错误。对于 ‘spline’ 方法,将对超出范围的插值点执行外插值算法。

  • 例如,设

    z

    =

    x

    2

    +

    y

    2

    z=x^{2}+y^{2}

    z=x2+y2,我们对

    z

    z

    z 函数在

    [

    0

    1

    ]

    ×

    [

    0

    2

    ]

    [0,1]×[0,2]

    [0,1]×[0,2] 区域内进行插值。

  • 程序如下:
>> x=0:0.1:1;>> y=0:0.2:2;>> [X,Y]=meshgrid(x,y);  %产生自变量网络坐标>> Z=X.^2+Y.^2;  %求对应的函数值>> interp2(x,y,Z,0.5,0.5)  %在(0.5.0.5)点插值ans =    0.5100>> interp2(x,y,Z,[0.5,0.6],0.4)  %在(0.5.0.4)点和(0.6,0.4)点插值ans =    0.4100    0.5200>> interp2(x,y,Z,[0.5,0.6],[0.4,0.5])  %在(0.5.0.4)点和(0.6,0.5)点插值ans =    0.4100    0.6200%在(0.5.0.4),(0.6.0.4),(0.5.0.5)和(0.6,0.5)各点插值>> interp2(x,y,Z,[0.5 0.6]',[0.4 0.5])  ans =    0.4100    0.5200    0.5100    0.6200
  • 如果想提高插值精度,可选择插值方法为 ‘spline’,对于本例,精度可以提高。输入如下程序:
>> interp2(x,y,Z,[0.5 0.6]',[0.4 0.5],'spline')ans =    0.4100    0.5200    0.5000    0.6100
  • 例如,某实验对一根长 10 m 的钢轨进行热源的温度传播测试。用

    d

    d

    d 表示测量点距离(m),用

    t

    t

    t 表示测量时间(s),用

    c

    c

    c 表示测得各点的温度(℃),测量结果如下表所示。我们试用线性插值求出在一分钟内每隔 20 s、钢轨每隔 2 m 处的温度。

d

d

d=0

d

d

d=2.5

d

d

d=5

d

d

d=7.5

d

d

d=10

t

t

t=0

9514000

t

t

t=30

884832126

t

t

t=60

6764544841
  • 程序如下:
>> d=0:2.5:10;>> t=(0:30:60)';>> c=[95,14,0,0,0;88,48,32,12,6;67,64,54,48,41];>> di=0:2:10;>> ti=(0:20:60)';>> ci=interp2(d,t,c,di,ti)
  • 程序运行结果如下:
ci =   95.0000   30.2000    5.6000         0         0         0   90.3333   47.4000   27.4667   16.0000    7.2000    4.0000   81.0000   58.8667   44.9333   33.2000   22.7333   17.6667   67.0000   64.6000   58.0000   51.6000   46.6000   41.0000
  • 下图是根据插值结果

    [

    d

    i

    ,

    t

    i

    ,

    c

    i

    ]

    [d_{i},t_{i},c_{i}]

    [di​,ti​,ci​],用绘图函数 surf(di,ti,ci) 绘制的钢轨温度分布图。如果加密插值点,则绘制的分布图更理想。

在这里插入图片描述

二、曲线拟合

1. 曲线拟合原理

  • 与数据插值类似,曲线拟合的目的也是用一个较简单的函数去逼近一个复杂的或未知的函数,所依据的条件都是在一个区间或一个区域上的有限个采样点的函数值。
  • 数据插值要求逼近函数在采样点与被逼近函数相等,但由于实验或测量中的误差,所获得的数据不一定准确。在这种情况下,如果强求逼近函数通过各采样插值点,显然是不够合理的。
  • 为此,构造函数

    y

    =

    g

    (

    x

    )

    y=g(x)

    y=g(x) 去逼近

    f

    (

    x

    )

    f(x)

    f(x),这里不要求曲线

    g

    (

    x

    )

    g(x)

    g(x) 严格通过采样点,但希望

    g

    (

    x

    )

    g(x)

    g(x) 能尽量地靠近这些点,就是使误差

    δ

    i

    =

    g

    (

    x

    )

    f

    (

    x

    )

    (

    i

    =

    1

    ,

    2

    n

    )

    δ_{i}=g(x)-f(x) (i=1, 2,…,n)

    δi​=g(x)−f(x)(i=1,2,…,n) 在某种意义下达到最小。

  • MATLAB 曲线拟合的最优标准是采用常见的最小二乘原理,所构造的

    g

    (

    x

    )

    g(x)

    g(x) 是一个次数小于插值节点个数的多项式。

  • 我们假设测得

    n

    n

    n 个离散数据点

    (

    x

    i

    ,

    y

    i

    )

    (

    i

    =

    1

    ,

    2

    .

    .

    .

    n

    )

    (x_{i}, y_{i})(i=1, 2,… n)

    (xi​,yi​)(i=1,2,…n),欲构造一个

    m

    (

    m

    n

    )

    m(m≤n)

    m(m≤n) 次多项式

    p

    (

    x

    )

    p(x)

    p(x):

    p

    (

    x

    )

    =

    a

    m

    x

    m

    +

    a

    m

    1

    x

    m

    1

    +

    +

    a

    1

    x

    +

    a

    0

    p(x)=a_{m}x^{m}+a_{m-1}x^{m-1}+…+a_{1}x+a_{0}

    p(x)=am​xm+am−1​xm−1+…+a1​x+a0​

  • 所谓曲线拟合的最小二乘原理,就是使上述拟合多项式在各节点处的偏差

    p

    (

    x

    i

    )

    y

    i

    p(x_{i})-y_{i}

    p(xi​)−yi​ 的平方和

    i

    =

    1

    n

    (

    p

    (

    x

    i

    )

    y

    i

    )

    2

    \sum_{i=1}^{n}(p(x_{i})-y_{i})^{2}

    ∑i=1n​(p(xi​)−yi​)2 达到最小。数学上已经证明,上述最小二乘逼近问题的解总是确定的。

2. 曲线拟合的实现

  • 采用最小二乘法进行曲线拟合时,实际上是求一个系数向量,该系数向量是一个多项式的系数。
  • 在 MATLAB 中,用 polyfit 函数来求的最小二乘拟合多项式的系数,再用 polyval 函数按所得多项式计算所给出的点上的函数近似值。
  • polyfit 函数的调用格式如下:
    p=polyfit(X,Y,m)    [P,S]=polyfit(X,Y,m)    [P,S,mu]=polyfit(X,Y,m)
  • 函数根据采样点

    X

    X

    X 和采样点函数值

    Y

    Y

    Y,产生一个

    m

    m

    m 次多项式

    P

    P

    P 及其在采样点的误差向量

    S

    S

    S。

  • 其中

    X

    Y

    X、Y

    X、Y 是两个等长的向量,

    P

    P

    P 是一个长度为

    m

    +

    1

    m+1

    m+1 的向量,

    P

    P

    P 的元素为多项式系数。mu 是一个二元向量,mu(1) 是函数 mean(X) 求向量

    X

    X

    X 的平均值,而 mu(2) 是函数 std(X) 求向量

    X

    X

    X 的方差。

  • 可以用 polyval 函数按所得的多项式计算

    X

    X

    X 各点上多项式的值。

  • 例如,我们用一个 3 次多项式在区间

    [

    0

    ,

    2

    π

    ]

    [0,2\pi]

    [0,2π] 内逼近函数

    sin

    x

    \sin x

    sinx。

  • 在给定区间上,我们均匀地选择 50 个采样点,并计算采样点的函数值,然后利用 3 次多项式逼近。
  • 程序如下:
>> X=linspace(0,2*pi,50);  %在0到2Π之间等差的选取50个点>> Y=sin(X);>> P=polyfit(X,Y,3)  %得到3次多项式的系数和误差P =    0.0912   -0.8596    1.8527   -0.1649
  • 以上求得了 3 次拟合多项式

    p

    (

    x

    )

    p(x)

    p(x) 的系数,得

    p

    (

    x

    )

    =

    0.0912

    x

    3

    0.8596

    x

    2

    +

    1.8527

    x

    0.1649

    p(x)=0.0912x^{3}-0.8596x^{2}+1.8527x-0.1649

    p(x)=0.0912×3−0.8596×2+1.8527x−0.1649。

  • 下面,我们利用绘图函数得方法将多项式

    p

    (

    x

    )

    p(x)

    p(x) 和

    sin

    x

    \sin x

    sinx进行比较,程序如下:

>> X=linspace(0,2*pi,50);>> Y=sin(X);>> P=polyfit(X,Y,3)P =    0.0912   -0.8596    1.8527   -0.1649>> Y1=polyval(P,X);>> plot(X,Y,':o',X,Y1,'-*')
  • 绘制出

    sin

    x

    \sin x

    sinx 和多项式

    p

    (

    x

    )

    p(x)

    p(x) 在给定区间得函数曲线,如下图所示。其中虚线是

    sin

    x

    \sin x

    sinx,实线是

    p

    (

    x

    )

    p(x)

    p(x)。函数 polyval(P,X) 返回多项式

    p

    (

    x

    )

    p(x)

    p(x) 得值。

在这里插入图片描述

三、数值微分

  • 一般来说,函数的导数依然是一个函数。设函数

    f

    (

    x

    )

    f(x)

    f(x) 的导函数

    f

    (

    x

    )

    =

    g

    (

    x

    )

    f'(x)=g(x)

    f′(x)=g(x),高等数学关心的是

    g

    (

    x

    )

    g(x)

    g(x) 的形式和性质,而数值分析关心的问题是怎样计算

    g

    (

    x

    )

    g(x)

    g(x) 在一串离散点

    X

    =

    (

    x

    1

    ,

    x

    2

    x

    n

    )

    X=(x_{1}, x_{2},…,x_{n})

    X=(x1​,x2​,…,xn​) 的近似值

    G

    =

    (

    g

    1

    g

    2

    g

    n

    )

    G=(g_{1},g_{2},…,g_{n})

    G=(g1​,g2​,…,gn​) 以及所计算的近似值有多大误差。

1. 数值差分与差商

  • 任意函数

    f

    (

    x

    )

    f(x)

    f(x) 在

    x

    x

    x 点的导数是通过极限定义的:

    f

    (

    x

    )

    =

    lim

    h

    0

    f

    (

    x

    +

    h

    )

    f

    (

    x

    )

    h

    f'(x)=\lim_{h \to 0}\frac{f(x+h)-f(x)}{h}

    f′(x)=h→0lim​hf(x+h)−f(x)​

    f

    (

    x

    )

    =

    lim

    h

    0

    f

    (

    x

    )

    f

    (

    x

    h

    )

    h

    f'(x)=\lim_{h \to 0}\frac{f(x)-f(x-h)}{h}

    f′(x)=h→0lim​hf(x)−f(x−h)​

    f

    (

    x

    )

    =

    lim

    h

    0

    f

    (

    x

    +

    h

    /

    2

    )

    f

    (

    x

    h

    /

    2

    )

    h

    f'(x)=\lim_{h \to 0}\frac{f(x+h/2)-f(x-h/2)}{h}

    f′(x)=h→0lim​hf(x+h/2)−f(x−h/2)​

  • 上述式子中,均假设

    h

    >

    0

    h>0

    h>0,如果去掉上述等式右端的

    h

    0

    h\longrightarrow 0

    h⟶0 的极限过程,并引进记号:

    f

    (

    x

    )

    =

    f

    (

    x

    +

    h

    )

    f

    (

    x

    )

    \bigtriangleup f(x)=f(x+h)-f(x)

    △f(x)=f(x+h)−f(x)

    f

    (

    x

    )

    =

    f

    (

    x

    )

    f

    (

    x

    h

    )

    \bigtriangledown f(x)=f(x)-f(x-h)

    ▽f(x)=f(x)−f(x−h)

    δ

    f

    (

    x

    )

    =

    f

    (

    x

    +

    h

    /

    2

    )

    f

    (

    x

    h

    /

    2

    )

    \delta f(x)=f(x+h/2)-f(x-h/2)

    δf(x)=f(x+h/2)−f(x−h/2)

  • f

    (

    x

    )

    f

    (

    x

    )

    \bigtriangleup f(x)、\bigtriangledown f(x)

    △f(x)、▽f(x) 及

    δ

    f

    (

    x

    )

    \delta f(x)

    δf(x) 分别在函数

    x

    x

    x 点处以

    h

    (

    h

    >

    0

    )

    h(h>0)

    h(h>0) 为步长的向前差分、向后差分和中心差分。当步长为

    h

    h

    h 充分小时,有

    f

    (

    x

    )

    f

    (

    x

    )

    h

    f'(x)\approx \frac{\bigtriangleup f(x)}{h}

    f′(x)≈h△f(x)​

    f

    (

    x

    )

    f

    (

    x

    )

    h

    f'(x)\approx \frac{\bigtriangledown f(x)}{h}

    f′(x)≈h▽f(x)​

    f

    (

    x

    )

    δ

    f

    (

    x

    )

    h

    f'(x)\approx \frac{\delta f(x)}{h}

    f′(x)≈hδf(x)​

  • 和差分一样,称

    f

    (

    x

    )

    /

    h

    f

    (

    x

    )

    /

    h

    \bigtriangleup f(x)/h、\bigtriangledown f(x)/h

    △f(x)/h、▽f(x)/h 及

    δ

    f

    (

    x

    )

    /

    h

    \delta f(x)/h

    δf(x)/h 分别为函数在

    x

    x

    x 点处以

    h

    (

    h

    >

    0

    )

    h(h>0)

    h(h>0) 为步长的向前差商、向后差商和中心差商。

  • 当步长

    h

    (

    h

    >

    0

    )

    h(h>0)

    h(h>0) 充分小时,函数

    f

    f

    f 在点

    x

    x

    x 的微分接近于函数在该点的任意种差分,而

    f

    f

    f 在点

    x

    x

    x 的导数接近于函数在该点的任意种差商。

2. 数值微分的实现

  • 有两种方式计算任意函数

    f

    (

    x

    )

    f(x)

    f(x) 在给定点

    x

    x

    x 的数值导数,第一种方式是用多项式或样条函数

    g

    (

    x

    )

    g(x)

    g(x) 对

    f

    (

    x

    )

    f(x)

    f(x) 进行逼近(插值或拟合),然后用逼近函数

    g

    (

    x

    )

    g(x)

    g(x) 在点

    x

    x

    x 处的导数作为

    f

    (

    x

    )

    f(x)

    f(x) 在点

    x

    x

    x 处的导数,第二种方式是用

    f

    (

    x

    )

    f(x)

    f(x) 在点

    x

    x

    x 处的某种差商作为其导数。

  • 在 MATLAB 中,没有直接提供求数值导数的函数,只有计算向前差分的函数 diff,其调用格式如下。
  • (1) DX=dif(X):计算向量

    X

    X

    X 的向前差分,

    D

    X

    (

    i

    )

    =

    X

    (

    i

    +

    1

    )

    X

    (

    i

    )

    i

    =

    1

    2

    n

    1

    DX(i)=X(i+1)-X(i), i=1,2,…,n-1

    DX(i)=X(i+1)−X(i),i=1,2,…,n−1。

  • (2) DX= diff(X,n):计算

    X

    X

    X 的

    n

    n

    n 阶向前差分。例如,diff(X,2)=diff(diff(X))。

  • (3) DX-dif(A,n,dim):计算矩阵

    A

    A

    A 的

    n

    n

    n 阶差分,dim=1 时(默认状态),按列计算差分;dim=2 时,按行计算差分。

  • 例如,我们设

    x

    x

    x 由

    [

    0

    ,

    2

    π

    ]

    [0, 2\pi]

    [0,2π] 间均匀分布的 6 个点组成,求

    sin

    x

    \sin x

    sinx 的 1~3 阶差分。

  • 程序如下:
>> X=linspace(0,2*pi,6);>> Y=sin(X)Y =         0    0.9511    0.5878   -0.5878   -0.9511   -0.0000>> DY=diff(Y)  %计算Y的一阶差分DY =    0.9511   -0.3633   -1.1756   -0.3633    0.9511>> D2Y=diff(Y,2)  %计算Y的二阶差分,也可以用命令diff(DY)计算D2Y =   -1.3143   -0.8123    0.8123    1.3143>> D3Y=diff(Y,3)  %计算Y的三阶差分,也可以用命令diff(D2Y)或diff(DY,2)计算D3Y =    0.5020    1.6246    0.5020
  • 例如,设

    f

    (

    x

    )

    =

    x

    3

    +

    2

    x

    2

    x

    +

    12

    +

    x

    +

    5

    6

    +

    5

    x

    +

    2

    f(x)=\sqrt{x^{3}+2x^{2}-x+12}+\sqrt[6]{x+5}+5x+2

    f(x)=x3+2×2−x+12
    ​+6x+5
    ​+5x+2 我们用不同的方法求函数

    f

    (

    x

    )

    f(x)

    f(x) 的数值导数,并在用一个坐标系中画出

    f

    (

    x

    )

    f'(x)

    f′(x) 的图像。

  • 为确定计算数值导数的点,假设在

    [

    3

    ,

    3

    ]

    [-3, 3]

    [−3,3] 区间内以 0.01 为步长求数值导数。下面用 3 种方法求

    f

    (

    x

    )

    f(x)

    f(x) 在这些点的导数。

  • 首先用一个 5 次多项式

    p

    (

    x

    )

    p(x)

    p(x) 拟合函数

    f

    (

    x

    )

    f(x)

    f(x),并对

    p

    (

    x

    )

    p(x)

    p(x) 求一般意义下的导数

    d

    p

    (

    x

    )

    dp(x)

    dp(x),求出

    d

    p

    (

    x

    )

    dp(x)

    dp(x) 在假设点的值。

  • 第二种方法直接求

    f

    (

    x

    )

    f(x)

    f(x) 在假设点的数值导数。

  • 第三种方法求出

    f

    (

    x

    )

    f'(x)

    f′(x):

    f

    (

    x

    )

    =

    3

    x

    2

    +

    4

    x

    1

    2

    x

    3

    +

    2

    x

    2

    x

    +

    12

    +

    1

    6

    x

    +

    5

    6

    +

    5

    f'(x)=\frac{3x^{2}+4x-1}{2\sqrt{x^{3}+2x^{2}-x+12}}+\frac{1}{6\sqrt[6]{x+5}}+5

    f′(x)=2×3+2×2−x+12
    ​3×2+4x−1​+66x+5
    ​1​+5

  • 然后直接求

    f

    (

    x

    )

    f'(x)

    f′(x) 在假设点的导数,最后在同一坐标轴显示这 3 条曲线。

  • 程序如下:
>> f=@(x) sqrt(x.^3+2*x.^2-x+12)+(x+5).^(1/6)+5*x+2;>> g=@(x) (3*x.^2+4*x-1)./sqrt(x.^3+2*x.^2-x+12)/2+1/6./(x+5).^(5/6)+5;>> x=-3:0.01:3;>> p=polyfit(x,f(x),5);				%用5次多项式p拟合f(x)>> dp=polyder(p);					%对拟合多项式p求导数dp>> dpx=polyval(dp,x);				%求dp在假设点的函数值>> dx=diff(f([x,3.01]))/0.01;		%直接对f(x)求函数导数>> gx=g(x);							%求函数f的导函数g在假设点的导数>> plot(x,dpx,x,dx,'.',x,gx,'-');	%作图
  • 程序运行结果如下图所示。结果表明,用 3 种方法求得的数值导数比较接近。

在这里插入图片描述

本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://net2asp.com/e1f9b4e539.html