2016-05-25 2 views
1

У меня есть 1-мерный вектор, который является:Градиент градиента и лапласиана одномерного вектора дают различные результаты в Matlab

p = [1 3 6 10 16 18 29]; 

laplace = del2(p); 
px= gradient(p); 
pxx=gradient(px); 

Поскольку одномерно, лапласиан вектора должна быть равна градиент градиента. Однако они дают совершенно разные результаты.

laplace = 0.2500 0.2500 0.2500 0.5000 -1.0000 2.2500 5.5000 
pxx = 0.5000 0.7500 1.2500 0.2500 0.7500 3.5000 4.5000 
+0

Возможно, что 'del2' принимает линейное расстояние' 1' один раз, в то время как 'gradient' делает это дважды – Adriaan

+0

Нет, я пробовал разный интервал, но результат не меняется – Bhoke

ответ

1

простой пример:

gradient(gradient((1:10).^2)) 
1, 1.5, 2, 2, 2, 2, 2, 2, 1.5, 1 

и

4*del2((1:10).^2) 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2 

Так gradient обрабатывает первые и последние значения по-разному (следовательно, gradient(gradient()) имеет различные первые две и последние две записей, del2 экстраполирует линейно) ,

del2 необходимо умножить на 4, чтобы быть совместимым с gradient(gradient())

А если заглянуть внутрь кода (edit del2 или edit gradient) вы видите, что градиент имеет симметричную разность для внутренних точек (с учетом предыдущего и следующего пункта в равной степени). del2 делает то же самое, но только один раз. Поэтому gradient(gradient()) сглаживает немного больше.

Однако, если я сглажу результат del2 с ядром вроде [0.25 0.5 0.25], тогда я получу точно такие же результаты, как gradient(gradient()).

p = [1 3 6 10 16 18 29]; 
conv(4 * del2(p), [0.5,1,0.5]/2, 'same') 
0.75, 1, 1.25, 0.25, 0.75, 9, 13.25 
gradient(gradient(p)) 
0.5, 0.75, 1.25, 0.25, 0.75, 3.5, 4.5 

Пожалуйста, обратите внимание, что центральные три значения идентичны, два пограничных значения на каждой стороне различны, потому что границы трактуется по-разному.

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