Calculate the derivative of a vector

前端 未结 2 604
滥情空心
滥情空心 2020-12-02 01:31

I have the following function (Viviani\'s curve):

Phi     = @(t)[ cos(t)^2, cos(t)*sin(t), sin(t) ]

Just a check that it\'s valid:

相关标签:
2条回答
  • 2020-12-02 01:56

    For the sake of completeness, the numerical solution without using any additional toolboxes:

    N = 999;
    t = linspace(0,2*pi,N+1);
    Phi = [cos(t); cos(t).*sin(t); sin(t)];
    dPhi = gradient(Phi,2*pi/N)
    

    For non-uniformly spaced argument vectors, the second parameter of gradient is defined by a spacing vector instead of a scalar. (time or angle vector is appropriate) - in this case it is obviously necessary to split up the dimensions. (Though I don't know why.)

    So alternatively, though not necessary:

    dX = gradient(Phi(1,:),t);
    dY = gradient(Phi(2,:),t);
    dZ = gradient(Phi(3,:),t);
    dPhi = [dX; dY; dZ];
    
    0 讨论(0)
  • 2020-12-02 02:08

    Here are three ways you can accomplish this. The first uses subs, the second uses a symfun, and the third uses complex step differentiation:

    % Using subs
    syms t
    Phi = [cos(t) cos(t).*sin(t) sin(t)];
    Phi_d2 = diff(Phi,t)
    double(subs(Phi_d2,t,0))
    
    % Using symfun
    syms t
    Phi(t) = [cos(t) cos(t).*sin(t) sin(t)];
    Phi_d2 = diff(Phi,t)
    double(Phi_d2(0))
    
    % Using complex step differentiation
    Phi = @(t)[cos(t) cos(t).*sin(t) sin(t)];
    h = 2^-28;
    cdiff = @(f,x)imag(f(x(:)+1i*h))/h;
    Phi_d2 = cdiff(Phi,0)
    

    You can find a function for performing first- and second-order complex step differentiation on my GitHub: cdiff. Note that complex step differentiation won't work well for higher order derivatives. It's best when one only has a non-differentiable function or needs fast numerical first derivatives.

    0 讨论(0)
提交回复
热议问题