2015-04-08 7 views
0

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

x=1:50; 
y=x; 

phi = sin((x-10)/10); 



dyPhi = (4.0*(circshift(phi(:,:), [+0, +1]) - circshift(phi(:,:), [+0, -1])) + ... 
     1.0*(circshift(phi(:,:), [+1, +1]) - circshift(phi(:,:), [-1, -1])) + ... 
     1.0*(circshift(phi(:,:), [-1, +1]) - circshift(phi(:,:), [+1, -1])))/12.0; 

figure(1) 
imagesc(phi) 
colorbar 

figure(2) 
imagesc(dyPhi) 
colorbar 

Однако, пожалуйста, посмотрите на два участка: на участке для dyPhi , кажется, что производная имеет неправильный знак.

Почему? Если я поменяю знак, тогда я получу то, что ожидаю.

+0

Почему именно вы используете 'circshift'? Существуют более общие способы численного дифференцирования или, если вы работаете только с 'sin & cos', вы можете просто« дифференцировать »путем добавления' pi/2'. –

ответ

0

Вы вычисляете производную с использованием f(x-1) - f(x+1), поэтому ожидается изменение знака.

Я бы порекомендовал gradient для численного дифференцирования.

plot(x,y) также более полезен для визуализации функций, а не imagesc.


Что касается вашего кода, я немного смущен этим.

y - 1D вектор, но вы, кажется, пытаетесь переместить его в двух измерениях с помощью circshift(phi(:,:), [-1, +1]). Первый размер сдвига не имеет значения, поскольку y имеет только одну строку. Это означает, что вы вычисляете одно и то же три раза, но масштабируете каждый результат на 4.0, 1.0 и 1.0.

Как я уже говорил, circshift(phi,[0,1]) - circshift(phi,[0,-1]) действительно рассчитывает f(x-1) - f(x+1). circshift(phi,[0,1]) заменяет каждое значение f(x) с его прошлым значением f(x-1), потому что сдвиг вправо. Аналогично, сдвиг влево с circshift(phi,[0,-1]) заменяет f(x) на f(x+1).

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