2

我有以下功能(Viviani 的曲线):

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

只需检查它是否有效:

s = linspace(0,T,1000);
plot3(cos(s).^2, cos(s).*sin(s), sin(s));

如何推导函数Phi(可能多次),它代表 Viviani 在从到的点t处的曲线?我是否定义了适合这种衍生品?我试过了,但它并没有像我需要的那样保持。t02*piPhidiffPhi

如果二阶导数是Phi_d2,我需要得到它的值(例如 in t = 0)。

我怎样才能做到这一点?

4

2 回答 2

5

您可以通过以下三种方式完成此操作。第一个使用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)

你可以在我的 GitHub 上cdiff找到一个用于执行一阶和二阶复杂步骤微分的函数: . 请注意,复杂的阶跃微分不适用于高阶导数。最好只有一个不可微函数或需要快速数值一阶导数。

于 2013-12-16T15:27:25.457 回答
4

为了完整起见,数值解不使用任何额外的工具箱:

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

对于非均匀间隔的参数向量,第二个参数gradient由间隔向量而不是标量定义。(时间或角度向量是合适的) - 在这种情况下,显然有必要拆分维度。(虽然我不知道为什么。)

因此,尽管没有必要,但也可以选择:

dX = gradient(Phi(1,:),t);
dY = gradient(Phi(2,:),t);
dZ = gradient(Phi(3,:),t);
dPhi = [dX; dY; dZ];
于 2013-12-16T15:46:20.287 回答