Числовой градиент скалярного вектора в C ++ - PullRequest
0 голосов
/ 25 июня 2018

Есть ли способ вычислить числовой градиент скалярной функции в C++. Matlab имеет приятную функцию Fx=gradient(y), которая численно оценивает градиент скалярной функции y. Например, если y - это вектор со следующими скалярными значениями:

y={30, 50, 13, 1, 4, 16, 19, 32, 54, 4, 23, 17, 33, 37, 6, 6, 11, 17, 5}

Fx=gradient(y)

по направлению x от Matlab дает:

Fx=[20,-8.5,-24.5,-4.5,7.5,7.5,8,17.5,-14,-15.5,6.5,5,10,   -13.5,-15.5,2.5,5.5,-3,-12]

Есть ли способ выполнить числовой градиент скалярной функции аналогично в C++?

Ответы [ 3 ]

0 голосов
/ 25 июня 2018

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

Псевдокод в C будет

for (int i=1;i<length-1;i++){
    g[i]=(y[i+1]-y[i-1])/2
}

Вам нужно решить, что делать с вашими границами (g[0] и g[length-1])

0 голосов
/ 11 июля 2018

Это немного двусмысленный вопрос.

Сначала кажется, что вы спрашиваете, есть ли в C ++ функции градиента. Не в стандартной библиотеке, насколько я знаю. Но вы можете найти библиотеки числовых программ с открытым исходным кодом, которые делают это. Я бы посмотрел научную библиотеку GNU GSL.

Во-вторых, зачем вам подражать MATLAB? Как указывает один из ответов, он, похоже, использует формулу центральной разности, но вы можете реализовать другие схемы для оценки производных. И, как утверждают другие комментарии / ответы, вам, возможно, придется подумать, что делать на границах (хотя в этом нет необходимости, если вы не используете это в решателе PDE). В целом, когда вы численно дифференцируете дискретные данные, вы получаете меньше производных, чем точек данных. Является ли это проблемой, зависит от приложения.

Я заметил, что вы не указали, выбирались ли данные для равномерной выборки x, независимой переменной. Это важно, поскольку все, что вы получаете, это различия в данных, а не фактический градиент. Вам нужно будет отредактировать псевдокод в первом ответе, разделив на del_x = x [i + 1] -x [i-1]. Интерфейс Matlab позволяет указать шаг, но вы можете сделать более общую функцию, которая оценивает неравномерно выбранные данные.

0 голосов
/ 25 июня 2018

Опция заключается в том, чтобы вычислить коэффициенты кубической аппроксимации (равномерное, натуральное), которые передают производную информацию первого порядка.См. http://mathworld.wolfram.com/CubicSpline.html.

Если данные зашумлены, вы также можете рассмотреть фильтры Стависки-Голея для первой производной.https://en.wikipedia.org/wiki/Savitzky%E2%80%93Golay_filter#Tables_of_selected_convolution_coefficients

...