2015-06-25 4 views
0

Предположим, что у меня есть функцияСравнение точности различных числовых градиентов?

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.

+0

Я голосующий, чтобы закрыть этот вопрос как не по теме, потому что это не вопрос программирования, это вопрос численного вычисления, который лучше будет решать на другом сайте. – talonmies

ответ

1

Это ожидаемый результат, поскольку метод-1 является точной (форвардной разницей) первого порядка, а метод-2 - точный метод второго порядка (центральная разница). Это легко доказать, используя ряд Тейлора. Для получения дополнительной информации вы можете прочитать любую книгу о методах конечных разностей.

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

Как видно из вашей реализации, метод-2 является более дорогостоящим (оценка f1 и f2 для каждого x), было бы полезно использовать метод-1 с меньшей DELTA. Однако, если точность вызывает большую озабоченность, вы можете использовать метод-2 с меньшим DELTA.

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