Dyi*_*yin 2 arrays math matlab derivative
我有以下功能(Viviani 曲线):
Phi = @(t)[ cos(t)^2, cos(t)*sin(t), sin(t) ]
Run Code Online (Sandbox Code Playgroud)
只需检查它是否有效:
s = linspace(0,T,1000);
plot3(cos(s).^2, cos(s).*sin(s), sin(s));
Run Code Online (Sandbox Code Playgroud)
如何衍生功能Phi
(可能多次),它代表了一个点维维安尼的曲线,t
其中,t
从去0
到2*pi
?我是否定义了Phi
适合这样的衍生物?我试过了diff
,但它没有Phi
像我需要的那样保留它。
如果二阶导数是Phi_d2
,我需要得到它的值(例如在 中t = 0
)。
我怎样才能做到这一点?
您可以通过以下三种方式来实现这一点。第一个使用subs
,第二个使用 a symfun
,第三个使用复阶微分:
% 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)
Run Code Online (Sandbox Code Playgroud)
你可以在我的 GitHub 上cdiff
找到一个执行一阶和二阶复杂阶跃微分的函数: . 请注意,复杂的阶跃微分不适用于高阶导数。当只有不可微函数或需要快速数值一阶导数时,这是最好的。
为了完整起见,不使用任何附加工具箱的数值解:
N = 999;
t = linspace(0,2*pi,N+1);
Phi = [cos(t); cos(t).*sin(t); sin(t)];
dPhi = gradient(Phi,2*pi/N)
Run Code Online (Sandbox Code Playgroud)
对于非均匀间隔的参数向量, 的第二个参数gradient
由间隔向量而不是标量定义。(时间或角度向量是合适的) - 在这种情况下,显然有必要分割维度。(虽然我不知道为什么。)
因此,尽管没有必要,但也可以这样:
dX = gradient(Phi(1,:),t);
dY = gradient(Phi(2,:),t);
dZ = gradient(Phi(3,:),t);
dPhi = [dX; dY; dZ];
Run Code Online (Sandbox Code Playgroud)