2013-12-16 3 views
1

У меня есть следующие функции (кривая Вивиани):Вычислить производную вектора

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 (возможно, несколько раз), который представляет кривую Вивиани в точке t, где t идет от 0 до 2*pi? Я определил Phi, подходящий для такого производного? Я пробовал diff, но он не оставил Phi, поскольку мне это нужно.

Если вторая производная будет Phi_d2, мне нужно получить ее значение (например, в t = 0).

Как я могу это достичь?

+0

вы хотите, чтобы получить это числовой или аналитические (требуется Символический Math Toolbox)? И почему не рукой? – thewaywewalk

+0

Чтобы вычислить его численно без какого-либо дополнительного инструментария, вы можете использовать простую конечную разницу (http://en.wikipedia.org/wiki/Finite_difference), например. '(Phi (1.1) -Phi (.9)) /. 2 вычислять производную первого порядка по t = 1,0 – tim

ответ

4

Вот три способа выполнить это. Первый использует subs, второй использует symfun, а третий использует 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) 

Вы можете найти функцию для выполнения первого и второго порядка, сложный этап дифференциации on my GitHub: cdiff. Обратите внимание, что комплексная дифференциация шагов не будет работать хорошо для производных более высокого порядка. Лучше всего, когда у одного есть недифференцируемая функция или нужны быстрые численные первые производные.

+1

+1 Я не знал, что вы можете делать' Phi (t) = ... ', чтобы сделать symfun. Благодарю. – ja72

+0

@ ja72: Это немного более новая функция, поэтому старые версии ее не поддержат - я думаю, что она была введена с Matlab R2012a. – horchler

+0

Должно быть, совпало с канавчатым кленом и взятием мупада. Я думал, что это надзор, вы не можете определить произвольные функции, но теперь вы можете с помощью 'syms f (x)', чтобы вы могли символически оценивать такие вещи, как 'diff (1/f (x), x)' в '-diff (Р (х), х)/Р (х)^2'. – ja72

3

Ради полноты картины, численное решение без использования каких-либо дополнительных инструментарии:

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]; 
+0

Здесь требуется параметр интервала 't (2) -t (1)' или вы получите неверно-масштабированный ответ. По умолчанию 'gradient' принимает интервал' 1'. И я не вижу никакого способа обработки неравномерных векторов времени, как вы указываете, - кроме устранения проблемы, которая может иметь свои проблемы. – horchler

+0

Кроме того, для первых производных вы обнаружите, что сложное дифференцирование шага (которое не требует каких-либо наборов инструментов) имеет значительно меньшую погрешность, чем использование градиента. – horchler

+0

'2 * pi/N' - неправильный интервал, если вы используете' linspace' и хотите точности. 't (2) -t (1)' следует использовать, поскольку вся точка находится на этом расстоянии, за исключением, возможно, последней. – horchler

Смежные вопросы