一、数值差分与差商
在Matlab中,数值差分与差商是数值分析中常用的概念,尤其在求解微分方程、插值、逼近等领域有广泛应用。下面简要介绍这两个概念及其在Matlab中的实现。
数值差分
数值差分是微分运算的离散化形式,用于近似求解导数。给定一个函数f(x),其在点x0处的导数定义为:
f′(x0)=limh→0hf(x0+h)−f(x0)
在数值计算中,我们无法计算极限,因此使用差分来近似导数:
f′(x0)≈hf(x0+h)−f(x0)
其中h是一个小的步长。
差商
差商是数值微分的一种形式,特别用于插值多项式。给定一组数据点(x0,y0),(x1,y1),…,(xn,yn),其中yi=f(xi),差商用于构建这些点的插值多项式。一阶差商定义为:
f[x0,x1]=x1−x0f(x1)−f(x0)
高阶差商可以递归定义。
Matlab实现
Matlab提供了多种函数来实现数值差分和差商的计算。
diff
函数用于计算向量或矩阵的差分。del2
函数用于计算二维离散Laplacian。
1.计算差分:
x = 0:0.1:1; % 定义x向量
y = sin(x); % 定义y向量
dy = diff(y)./diff(x); % 计算差分,近似导数
plot(x(1:end-1), dy); % 绘制导数近似
运行结果 :
2.计算差商 :
x = [1 2 3 4 5];
y = [1 4 9 16 25];
d = diff(y)./diff(x); % 一阶差商
dd = diff(d)./diff(x(1:end-1)); % 二阶差商
二、数值微分的实现
在 MATLAB 中,没有直接提供求数值导数的函数,只有计算向前差分的函数diff ,其调用格式为:DX=diff(X) :计算向量 X 的向前差分, DX(i)=X(i+1)-X(i) ,i=1,2,…,n-1。DX=diff(X,n) :计算 X 的 n 阶向前差分。例如,diff(X,2)=diff(diff(X))。DX=diff(A,n,dim) :计算矩阵 A 的 n 阶差分, dim=1 时 ( 缺省状态 ) , 按列计算差分 ; dim=2 , 按行计算差分 。
例 8-6 生成以向量 V=[1,2,3,4,5,6] 为基础的范得蒙矩 阵,按列进行差分运算。
命令如下:
V=vander(1:6)
DV=diff(V) %计算V的一阶差分
运行结果 :
例 8-7 用不同的方法求函数 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,'-'); %作图
运行结果 :
结语
成功并非永远属于那些最聪明的人
而是属于那些最有恒心的人
!!!