Вам дано c
, и вы хотите решить
t = sqrt(c)
или, что эквивалентно,
c = t^2
или еще раз,
c - t^2 = 0.
I 'назовем вышеприведенное уравнение f(t) = 0
(без упоминания c
, так как это заданная константа).Метод Ньютона перебирает пробные значения t
, которые я обозначу t_i, t_{i+1}, ...
.
Расширение Тейлора до 1-го порядка:
f(t_i + dt_i) = f(t_i) + dt_i * f'(t_i) + ...
Так что, если вы не совсемf(t_i) = 0
, вы добавляете dt_i
таким образом, что
f(t_i + dt_i) nearly = 0 = f(t_i) + dt_i * f'(t_i) + ...
То есть dt_i = -f(t_i) / f'(t_i)
, то есть f(t_i + -f(t_i) / f'(t_i))
ближе к нулю, чем f(t_i)
.
Если вы сделаетепроизводные от f(t) = c - t^2
, вы увидите, что уравнение в коде t_{i+1} = (c / t_i + t_i) / 2
- это просто итерационная формула t_{i+1} = t_i + dt_i
с оценкой dt_i
, приведенной выше.
Это итерационный метод, поэтому он недать точное решение.Вам нужно решить, когда вы хотите остановиться (достаточная точность), иначе алгоритм будет работать вечно.Вот почему вы проверяете f(t_i) < threshold
вместо истинного f(t_i) = 0
.В их случае они выбрали threshold = epsilon * t^2
;Я думаю, что умножение на t^2
было использовано, потому что, если вы использовали фиксированную константу в качестве порога, вы можете столкнуться с проблемами числовой точности (то есть, если вы играете с триллионами, вы никогда не сможете получить фиксированную точность 10^{-10}
из-законечная точность представления с плавающей точкой.)