Это похоже на вариацию метода Штеффенсена, известного своей тесной связью с процессом дельта-квадрата Эйткена.Это менее секущий метод и больше похожий на Ньютон метод, заменяющий производную f'(x)
в x_new = x-f(x)/f'(x)
приближением с разделенной разностью (f(x+h(x))-f(x))/h(x)
, что приводит к формуле
x_new = x - (f(x)*h(x))/(f(x+h(x))-f(x))
= x + h(x) + (f(x+h(x))*h(x))/(f(x+h(x))-f(x))
, где h(x)=O(f(x))
всходимость силы к производной при приближении x
к корню.Метод Штеффенсена использует h(x)=f(x)
, в то время как цитируемый метод по некоторым причинам предпочитает h(x)=abs(f(x))/2
.Ни один из них не является инвариантом при повторном масштабировании f
, поэтому нет четких предпочтений, будут случаи, когда любой из методов имеет небольшое преимущество.
По отношению к методу Ньютона можно ожидать квадратичногосходимость к простым корням, если есть сходимость вообще.
Ваша проблема в том, что вы используете y
как в качестве значения, так и в качестве функции.Помимо проблемы безопасности использования eval
в предоставленных пользователем фрагментах кода, вам необходимо предоставить аргумент x
для дополнения строки функции, а затем вызвать оценку строки функции, и этодля всех различных точек, для которых вы хотите значения функции.
Обсуждение того, как безопасно анализировать и оценивать строки выражений: Оценка строки как математического выражения в JavaScript .