数值微积分
引言
  在微分中,函数的导数是用极限来定义的,如果一个函数是以数值给出的离散形式,那么它的导数就无法用极限运算方法求得,当然也就更无法用求道方法去计算函数在某点处的导数。
  一般来说,函数的导数依然是一个函数。设函数f(x)的导数f′(x)=g(x),高等数学关心的是g(x)的形式和性质,而数值分析关心的问题是怎样的计算g(x)在一串离散点X=(x1,x2,…xn)的近似值G=(g1,g2,..gn)以及所计算的近似值有多大的误差。
1.    数值差分与差商
任意函数f(x)在x点的导数是通过极限定义的:
            f′(x)=lim f(x+h)-f(x)/h
            f′(x)=lim f(x)-f(x-h)/h
            f′(x)=lim f(x+h/2)-f(x-h/2)/h
 
上述式子中,均假设h﹥0,如果去掉上述等式右端的h→0的极限过程,并引进记号:
△f(x)=f(x+h)-f(x)
▽f(x)=f(x)-f(x-h)
δf(x)=f(x+h/2)-f(x-h/2)
 
称△f(x) ▽f(x)、δf(x)分别为函数在x点的以h(h>0)为步长的向前差分、向后差分、向中差分。当步长h充分的小时,有
 
            f′(x)≈△f(x)/h
diff函数
            f′(x)≈▽f(x)/h
            f′(x)≈δf(x)/h
和差分一样,称△f(x)/h, ▽f(x)/h,、δf(x)/h分别为函数在x点一h(h>0)为步长的向前差商、向后差商、向中差商。当步长h充分的小时,函数f在x点微分接近于函数在该点的任意种差分,而f在点x的导数接近于函数在该点的任意种差商。
 
2.    数值微分的实现
有两种方式计算任意函数f(x)在给定点x点数值导数。第一种方式是用多项式或样条函数g(x)对f(x)进行逼近,然后用逼近函数g(x)在点x的导数作为f(x)在点x的导数。
第二种方式是用f(x)在点x处的某种差商作为其导数。在MATLAB中,没有直接提供数值导数的函数,只有计算向前差分的函数diff,其调用格式为:
  Diff(X),输入参数x可为矢量或矩阵。若X为矢量,则返回[X(2)-X(1),X(3)-X(2),…,X(n)-X(n-
1)];若X为矩阵,则返回矩阵每行的差分,即[X(2:m,:)-X(1:m-1,:)].通常,diff(X)返回沿X的第一个成对维的差值。
  Y=diff(X,n):递归调用diff函数n次,生成n次差分。
  Y=diff(X,n,dim):  返回X中第dim维的n次差分或导数值
 
设计1如下:
  X=[3 7 5;0 4 2];
  Diff(x)
  ans=
      -3  -3  -3
 
设计2如下:
  x=[3 7 5;0 4 2];
  Diff=(x,2)
  ans=
0                0
 
 
 
设计3如下:
x=[3 7 5;0 4 2];
diff=(x,2,1)
ans=
empty matrix: 0-by-3
 
 
设:
     
用不同的方法求函数f(x)的数值导数,并在同一个坐标系中画出f′(x)的图形
 
程序如下:
f=inline(‘sqrt(x.^3+2*x.^2-x+12)+(x+5).^(1/6)+5*x+2’);
g=inline(‘(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,’-‘);              ﹪作图
 
  程序运行后得到图6.3所示的图形。结果表明,用3种方法求得的数值导数比较近似。
 
 
 
 
 
 
 
 
 
 
 
MATLAB语言提供了计算给定向量差分的函数diff(),其调用的方法是dy=diff(y).假设向量y是{yi},i=1,2,3,…,n构成,则经过diff()函数处理后将得出一个新的向量:
{yi+1-yi},i=1,2,3,…,n,显然新得出的向量长度比原来向量的长度y要小1.如:
 
>>v=vander(1:6)
  v=
      1    1    1    1    1    1 
      32    16    8    4    2    1
    243    81    27    9    3    1
    1024    256  64    16    4    1
    3125    625  125  25    5    1
    7776    1296  216  36    6    1
 
  >>diff(v)
  ans=
    31    15    7    3      1    0
    211    65    19    5      1    0
    781    175    37    7      1    0
    2101    369    61    9      1    0
    4651    671    91    11    1    0

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。