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

这篇具有很好参考价值的文章主要介绍了MATLAB 之 数据插值、曲线拟合和数值微分。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、数据插值

  • 在工程测量和科学实验中,所得到的数据通常都是离散的。如果要得到这些离散点以外的其他点的数值,就需要根据这些已知数据进行插值。例如,测量得 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,,n1) 之间, 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 维数据插值函数 interp1interp2interpn,以及 3 次埃尔米特(Hermite)插值函数 pchip 和 3 次样条插值函数 spline 等。

1. 一维数据插值

  • 如果被插值函数是一个单变量函数,则数据插值问题称为一维插值。一维插值采用的方法有线性插值、最近点插值、3 次埃尔米特插值和 3 次样条插值。在 MATLAB 中,实现这些插值的函数是 interp1,其调用格式如下:
    Y1=interp1(X,Y,X1,method)
  • 函数根据 X 、 Y X、Y XY 的值,计算函数在 X 1 X1 X1 处的值。其中, X 、 Y X、Y XY 是两个等长的已知向量,分别描述采样点和采样值。若同一个采样点有多种采样值,则 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)=π 20xex2dx
x x x f ( x ) f(x) f(x)
0.46 0.4846555
0.47 0.4937542
0.48 0.5027498
0.49 0.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
0 3.1025 5 2.256
10 879.5 15 2968.8
20 2968.8 25 4136.2
30 5237.9 35 6152.7
40 6725.3 45 6848.3
50 6403.5 55 6824.7
60 7328.5 65 7857.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 *15

   0.002823300000000   1.262060000000000   3.435760000000000   5.603820000000000   6.7745000000000006

   6.571980000000000

>> F2=interp1(T,F,X,'nearest')  %用最近点插值法插值


F2 =

   1.0e+03 *15

   0.003201500000000   0.879500000000000   2.968800000000000   5.237900000000000   6.7253000000000006

   6.403500000000000

>> F3=interp1(T,F,X,'pchip')  %3次埃尔米特插值方法插值

F3 =

   1.0e+03 *15

   0.002460228000000   1.248358437730487   3.436483654858926   5.636234122067274   6.7977561242093166

   6.507716445924324

>> F4=interp1(T,F,X,'spline')  %3次样条插值方法插值

F4 =

   1.0e+03 *15

  -0.170219570210629   1.256002190473428   3.439603968838626   5.637043773267335   6.8592912569040606

   6.481654623389509

  • 这里小数点后显示 16 位是因为上次使用了 format long 代码,但未执行 format short 代码。

2. 二维数据插值

  • 当函数依赖于两个自变量变化时,其采样点就应该是一个由这两个参数组成的一个平面区域,插值函数也是一个二维函数。对依赖于两个参数的函数进行插值的问题称为二维插值问题。
  • 同样,在 MATLAB 中,提供了解决二维插值问题的函数 interp2,其调用格式如下:
    Z1=interp2(X,Y,Z,X1,Y1,method)
  • 其中, X 、 Y X、Y XY 是两个向量,分别描述两个参数的采样点, Z Z Z 是与参数采样点对应的函数值, X 1 、 Y 1 X1、Y1 X1Y1 是两个向量或标量,描述欲插值的点。 Z 1 Z1 Z1 是根据相应的插值方法得到的插值结果。
  • method 的取值与一维插值函数相同,但二维插值不支持 'pchip' 方法。 X 、 Y 、 Z X、Y、Z XYZ 也可以是矩阵形式。同样,对于超出 X 、 Y X、Y XY 范围的插值点,使用 '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] [01]×[02] 区域内进行插值。
  • 程序如下:
>> 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 95 14 0 0 0
t t t=30 88 48 32 12 6
t t t=60 67 64 54 48 41
  • 程序如下:
>> 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) 绘制的钢轨温度分布图。如果加密插值点,则绘制的分布图更理想。

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

二、曲线拟合

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,2n) 在某种意义下达到最小。
  • 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(mn) 次多项式 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)=amxm+am1xm1++a1x+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 XY 是两个等长的向量, 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);  %02Π之间等差的选取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.0912x30.8596x2+1.8527x0.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) 得值。

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

三、数值微分

  • 一般来说,函数的导数依然是一个函数。设函数 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,x2xn) 的近似值 G = ( g 1 , g 2 , … , g n ) G=(g_{1},g_{2},…,g_{n}) G=(g1g2gn) 以及所计算的近似值有多大误差。

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)=h0limhf(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)=h0limhf(x)f(xh) 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)=h0limhf(x+h/2)f(xh/2)
  • 上述式子中,均假设 h > 0 h>0 h>0,如果去掉上述等式右端的 h ⟶ 0 h\longrightarrow 0 h0 的极限过程,并引进记号: △ 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(xh) δ 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(xh/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)hf(x) f ′ ( x ) ≈ ▽ f ( x ) h f'(x)\approx \frac{\bigtriangledown f(x)}{h} f(x)hf(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)/hf(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=12n1
  • (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+2x2x+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)=2x3+2x2x+12 3x2+4x1+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 种方法求得的数值导数比较接近。

MATLAB 之 数据插值、曲线拟合和数值微分文章来源地址https://www.toymoban.com/news/detail-476548.html

到了这里,关于MATLAB 之 数据插值、曲线拟合和数值微分的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MATLAB数据曲线拟合

    MATLAB数据曲线拟合 数据拟合是我们常用的一种方法,可以通过一组离散的数据点来找到一个函数,使这个函数能够对数据进行预测和描绘。在MATLAB中实现数据拟合非常简单,而且MATLAB还提供了许多工具箱来帮助我们完成这项任务。下面我们将会介绍如何使用MATLAB对数据进行曲

    2024年02月14日
    浏览(35)
  • 数值分析——曲线拟合的最小二乘法

    拟合曲线定义:求近似函数 φ(x), 使之 “最好” 的逼近f(x) ,无需满足插值原则. 这就是曲线拟合问题。 (时间紧迫直接看例子就行,智慧交通专业的补修课,可能理论学的不那么深入,主要是方法。) 超定方程组 是指方程个数大于未知量个数的方程组 。 最小二乘解 : 对于

    2024年02月09日
    浏览(43)
  • 基于MATLAB的三维数据插值拟合与三次样条拟合算法(附完整代码)

    目录 一. 三维插值 例题1 二. 高维度插值拟合 格式一 格式二 格式三 格式四 格式五 例题2 三. 单变量三次样条插值 例题3 例题4 四. 多变量三次样条插值 例题6 首先三维网格生成是利用 meshgrid() 函数,在MATLAB中调用格式如下: 三维插值运算,主要利用griddata()函数与interp()函数

    2024年02月14日
    浏览(43)
  • 全面地介绍 将二维数据矩阵插值拟合为二维曲面方程——基于matlab

    要利用matlab将二维数据矩阵拟合成一个二维曲面方程,首先,我们得明白什么是插值和拟合。下面,从对洋流数据的处理入手,先以一个基本的流程为例,进行问题的概述,然后介绍两种具体的方法。 根据已知的数据点,生成一个连续的函数,可以在任意位置求值。matlab 提

    2024年04月11日
    浏览(41)
  • Matlab的插值与拟合

    插值:在离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点。插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近似值。 拟合:拟合是指已知某函数的若干离散函数值,通过调整该函数中若干

    2024年02月03日
    浏览(30)
  • 【数值分析实验】(八)常微分方程的数值解法(含matlab代码)

            科学技术中很多问题都可用常微分方程的定解问题来描述,主要有初值问题和边值问题两大类。常微分方程式描述连续变化的数学语言,微分方程的求解时确定满足给定方程的可微函数,要找出这类问题的解析解往往非常困难,甚至是不可能的。研究一阶常微分方

    2024年02月03日
    浏览(55)
  • Matlab偏微分方程拟合 | 完整源码 | 视频教程

    作者简介:工学博士,高级工程师,专注于工业软件算法研究 本文已收录于专栏:《 复杂函数拟合案例分享 》本专栏旨在提供 1.以 案例 的形式讲解各类复杂函数拟合的程序实现方法,并提供所有案例 完整源码 ;2. 复杂函数 包含:分段函数、积分函数、常/偏微分函数、隐

    2024年04月10日
    浏览(91)
  • 用MATLAB求一阶微分方程(组)数值解

    标准形式要先写成左边是y的导数右边是本身函数或者自变量,然后写成.m文件类似: 如果有多个微分方程,dy=zeros(3,1);% 一定要写成列向量 3、[0,1,1]都是方程(组)的初始值,并且初始值的x=0; 就会得到一系列x,y值; ode45(最常用) **问题类型:**非刚性 **精准度:**中等 ode15s

    2024年02月11日
    浏览(56)
  • matlab 矩阵处理方法:缩放、插值、拟合、分块...

    目录 1. 缩放矩阵尺寸 2. 对矩阵进行反距离权重插值填补nan值 3. 数据拟合 4. 数组大小超过限制(分块处理) 在MATLAB中,可以使用 imresize 函数对矩阵进行缩放尺寸操作。 imresize 函数用于调整图像或矩阵的尺寸,可以按比例缩小或放大矩阵。 其中: A 是原始矩阵或图像。 sca

    2024年02月11日
    浏览(32)
  • matlab解常微分方程常用数值解法2:龙格库塔方法

    总结和记录一下matlab求解常微分方程常用的数值解法,本文将介绍龙格库塔方法(Runge-Kutta Method)。 龙格库塔迭代的基本思想是: x k + 1 = x k + a k 1 + b k 2 x_{k+1}=x_{k}+a k_{1}+b k_{2} x k + 1 ​ = x k ​ + a k 1 ​ + b k 2 ​ k 1 = h f ( x k , t k )  and  k 2 = h f ( x k + B 1 k 1 , t k + A 1 h ) k_{1}=h

    2024年02月12日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包