2023-07-05 Matlab中的数值和符号微分.md

发布时间 2023-07-05 17:24:17作者: XNEF

2023-07-05 Matlab中的数值和符号微分

Matlab中包含了数值微分的函数diff和gradient,同时这两个函数存在于Symbolic Math Toolbox中,可以对函数句柄进行操作。

1. 数值微分

1-1. diff

diff函数主要用于计算向量的差分,用法有:

  1. Y = diff(X) 
  2. Y = diff(X,n) 
  3. Y = diff(X,n,dim) 
  1. 当X是向量时
    Y = diff(X) 表示对X各元素进行差分,返回n-1个元素:
  2. 当X是mn矩阵时
    Y = diff(X) 表示对X按列进行差分,返回(m-1)n矩阵。
  3. 当X是向量时
    Y = diff(X,n) 返回X的n次差分,即diff(X,1) = diff(X), diff(X,2) = diff(diff(X,1)) = diff(diff(X)).
  4. 当X是mn矩阵时
    Y = diff(X) 表示按照指定的维度dim进行n次差分,dim=1按列进行差分,dim=2按行进行差分。

知道差分之后可以得到导出的近似值,比如

  1. h = 0.001; % step size 
  2. X = -pi:h:pi; % domain 
  3. f = sin(X); % range 
  4. Y = diff(f)/h; % first derivative 
  5. Z = diff(Y)/h; % second derivative 
  6. plot(X(:,1:length(Y)),Y,'r',X,f,'b', X(:,1:length(Z)),Z,'k') 

注意的长度依次递减1.

1-2. gradient

gradient用于计算数值梯度,主要用法有

  1. FX = gradient(F) 
  2. [FX,FY] = gradient(F) 
  3. [FX,FY,FZ,...,FN] = gradient(F) 
  4. [___] = gradient(F,h) 
  5. [___] = gradient(F,hx,hy,...,hN) 
  1. 对于n维向量F,gradient(F)返回F的一维数值梯度,点之间的距离假设为1.

  2. 对于n维向量F,gradient(F, h)返回F的一维数值梯度,点之间的距离为h.

注意到间距必须是均匀的

  1. 对于mn维矩阵F,[FX, FY] = gradient(F)返回二维数值梯度的 x 和 y 分量, 默认间距为1.

  2. 对于mn维矩阵F,[FX, FY] = gradient(F,hx,hy)返回二维数值梯度的 x 和 y 分量, 并指定间距hx, hy.

二维数组可以推广到多维数组

gradient返回的长度和原始的长度是一致的,这个diff不一样,其原因在于gradient是计算内部数据点的中心差分,而在边界点使用的是单侧差分

例1 计算指定点处的梯度

  1. x = -3:0.2:3; 
  2. y = x'; 
  3. f = x.^2 .* y.^3; 
  4. surf(x,y,f) 
  5. xlabel('x') 
  6. ylabel('y') 
  7. zlabel('z') 
  8. [fx,fy] = gradient(f,0.2); 
  9. x0 = 1; 
  10. y0 = -2; 
  11. t = (x == x0) & (y == y0); 
  12. indt = find(t); 
  13. f_grad = [fx(indt) fy(indt)] 

其困难在于计算梯度并找到指定点处的数值梯度,这里生成了一个判断矩阵t,并找到的坐标,然后带入fx和fy.

例2 向量场的等高线图

  1. x = -2:0.2:2; 
  2. y = x'; 
  3. z = x .* exp(-x.^2 - y.^2); 
  4. [px,py] = gradient(z); 
  5. figure 
  6. contour(x,y,z) 
  7. hold on 
  8. quiver(x,y,px,py) %用于绘制箭头 
  9. hold off 

2. 符号微分

2-1. diff

diff用于求解符号变量的时候同时会返回符号表达式,主要用法是

  1. Df = diff(f) 
  2. Df = diff(f,n) 
  3. Df = diff(f,var) 
  4. Df = diff(f,var,n) 
  5. Df = diff(f,var1,...,varN) 
  6. Df = diff(f,mvar) 
  1. diff(f) 计算函数f的一阶导数
    1. syms f(x) 
    2. f(x) = sin(x^2); 
    3. Df = diff(f,x) 
    4. Df(2) %指定点处的导数 
    5. double(Df(2)) 
  2. diff(f,n)计算函数f的n阶导数
    1. syms t 
    2. D4 = diff(t^6,4) 
  3. diff(f,var)计算函数f关于var的偏导数
  4. diff(f,var,n)计算函数f关于var的n阶偏导数
    1. syms x y 
    2. Df = diff(x*cos(x*y), y, 2) 
  5. Df = diff(f,var1,...,varN)计算函数f关于一系列变量的混合偏导
    1. syms x y 
    2. Df = diff(x*sin(x*y),x,x,x,y) 
  6. Df = diff(f,mvar)计算mvar为符号矩阵的结果。仅在2021以上的版本中有,我使用的2020没有此功能,2020中符号矩阵可由A = sym('a', [3 3])生成。