Предположим, что у меня есть функцияСравнение точности различных числовых градиентов?
double f(vector <double> &x) {
// do something with x
return answer;
}
Математически f
является непрерывной функцией по отношению к каждому компоненту x
. Теперь я хочу оценить численный градиент x
. Есть два способа следующим
Метод 1.
double DELTA = 1e-5;
double y1 = f(x);
vector <double> gradX(x.size());
for (int i = 0; i < x.size(); ++i) {
x[i] += DELTA;
double y2 = f(x);
gradX[i] = (y2 - y1)/DELTA;
x[i] -= DELTA;
}
Способ 2.
double DELTA = 1e-5;
vector <double> gradX(x.size());
for (int i = 0; i < x.size(); ++i) {
x[i] += DELTA;
double y2 = f(x);
x[i] -= 2.0 * DELTA;
double y1 = f(x);
gradX[i] = (y2 - y1)/(2.0 * DELTA);
x[i] += DELTA;
}
Я наблюдаю, что метод 1дает очень неразумные номера (из них с 6 цифры), а Метод 2 дает более разумные.
Есть ли причина, по которой Способ 2 является лучшим? Всегда ли это предпочтительнее?
Спасибо.
Редактировать: Для получения более подробной информации. Эти реализации выполняются на языке C, а некоторые используют ядра CUDA.
Я голосующий, чтобы закрыть этот вопрос как не по теме, потому что это не вопрос программирования, это вопрос численного вычисления, который лучше будет решать на другом сайте. – talonmies