-1

在 Matlab 中,为什么贝塞尔函数 j1(x) 的微分让我们说 x= 1:10 给出 9 个值而不是 10 个?

x=1:10

J = besselj(1,x)

d_J = diff(J)

x =

     1     2     3     4     5     6     7     8     9    10


J =

  Columns 1 through 7

    0.4401    0.5767    0.3391   -0.0660   -0.3276   -0.2767   -0.0047

  Columns 8 through 10

    0.2346    0.2453    0.0435


d_J =

  Columns 1 through 7

    0.1367   -0.2377   -0.4051   -0.2615    0.0509    0.2720    0.2393

  Columns 8 through 9

    0.0107   -0.2018
4

2 回答 2

1

diff应用于数值向量仅计算连续值之间的差异。差异的数量比值的数量少一。当然,您可以使用这些差异对函数的导数进行数值近似。

如果你想直接计算导数,你可以用符号计算来完成(参见Matlab Symbolic Toolbox)。当应用于符号函数时,diff 会为您提供导数

>> syms x; %// define symbolic variable
>> f = besselj(1,x); %// define symbolic function
>> g = diff(f ,x) %// compute derivative
g =
besselj(0, x) - besselj(1, x)/x

然后,您可以使用以下方法评估特定值的导数subs

>> subs(g, 1:8)
ans =
    0.3251   -0.0645   -0.3731   -0.3806   -0.1121    0.1968    0.3007    0.1423 
于 2014-08-06T11:17:08.193 回答
0

要在数值上区分函数,您应该使用更小的步长和gradient函数:

x = 1:0.01:10;
J = besselj(1,x);
dJ = gradient(J,x);  % or: dJ = gradient(J)./gradient(x);
plot(x,J,x,dJ)

二阶数值导数可以用

dJ2 = 4*del2(J,x);  % or: dJ2 = 4*del2(J)./gradient(x).^2;
plot(x,J,x,dJ,x,dJ2)
于 2014-08-06T11:20:56.057 回答