Ниже приведен код Python, предназначенный для вычисления производной данной функции f
.Какова разница точности между производными расчетами двух версий?
версии один (раствор)
x[ix] += h # increment by h fxh = f(x) # evalute f(x + h) x[ix] -= 2 * h fxnh = f(x) x[ix] += h numgrad = (fxh - fxnh)/2/h
версии два (моя версия)
fx = f(x) # evalute f(x) x[ix] += h fxh = f(x) # evalute f(x+h) x[ix] -= h numgrad = (fxh - fx)/h
Она показала версия один дает лучшую точность, может кто-нибудь объяснить, почему это так, в чем разница между двумя вычислениями?
ОБНОВЛЕНИЕ Я не понимаю, что это математическая задача на первом месте, я думал, что это была проблема, связанная с эффектами плавающей точностью. Как было предложено MSeifert, я согласен с тем, что шум поплавкового тома имеет значение, при появлении шума этот результат становится более восприимчивым.
Добро пожаловать в CS.SE! Вообще говоря, код здесь не по теме, и все, что касается Python, вне темы. Часто вопросы кодирования можно задать в разделе «Переполнение стека»; если вы предпочтете переместить свой вопрос там, нажмите «флаг», чтобы отметить это для внимания модератора и попросите моды перенести его. В качестве альтернативы, если это не специфично для Python, замените код математикой или псевдокодом, что будет понятно даже тем, кто не знает Python. (например: Я знаю некоторый Python, но я понятия не имею, что означает 'x [ix]' в этом контексте.) –
Обратите внимание, что утверждение, что первая версия дает лучшую точность, в общем случае не верна. Бывают ситуации, когда одностороннее приближение * математически * выгодно (то есть независимо от арифметики с плавающей запятой вашего компьютера). См., Например, [схемы по ветру] (https://en.wikipedia.org/wiki/Upwind_scheme). Для объяснения, почему первая версия является более точной * в большинстве случаев *, ознакомьтесь с * порядком * [конечных различий] (https://en.wikipedia.org/wiki/Finite_difference). – Phillip