有什么方法可以计算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
的{{1}}方向给出:
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]
中一样执行标量函数的数值梯度吗?
答案 0 :(得分:2)
如果要获得与matlab完全相同的输出,请使用central differences。
C中的伪代码为
String URL = "http://added-platters.000webhostapp.com/application/index.php";
您需要确定如何处理边界(for (int i=1;i<length-1;i++){
g[i]=(y[i+1]-y[i-1])/2
}
和g[0]
)
答案 1 :(得分:0)
一个选项是计算三次样条拟合(均匀,自然)的系数,该系数传递一阶导数信息。参见http://mathworld.wolfram.com/CubicSpline.html。
如果数据嘈杂,您还可以考虑将Stavisky-Golay滤波器用于一阶导数。 https://en.wikipedia.org/wiki/Savitzky%E2%80%93Golay_filter#Tables_of_selected_convolution_coefficients
答案 2 :(得分:0)
这是一个模棱两可的问题。
首先,您似乎在问C ++是否具有渐变函数。据我所知,它不在标准库中。但是您也许可以找到执行此操作的开源数字库。我会看一下GNU科学图书馆GSL。
第二,为什么要模仿MATLAB?正如答案之一指出的那样,它似乎正在使用中心差公式,但您可以实施其他方案来估计导数。并且正如其他评论/回答所指出的那样,您可能需要考虑在边界处做什么(尽管除非您在PDE求解器中使用此方法,否则这不是必需的)。通常,当对离散采样的数据进行数值区分时,所得到的导数要少于数据点。是否存在问题取决于应用程序。
我注意到您没有说明是否对数据进行了统一变量x的抽样。这很重要,因为您得到的只是数据差异而不是实际梯度。您将需要通过除以del_x = x [i + 1] -x [i-1]来编辑第一个答案中的伪代码。 matlab界面允许指定步骤,但您可以使用更通用的功能来估计非均匀采样的数据。