Я могу догадаться, что произошло: значения функций в начальных точках имеют одинаковый знак, так что секущий корень x_new
находится вне интервала [x1, x2]
.Затем с помощью логики повторного назначения вы получите это на следующей итерации x2<x1
, так что при проверке длины интервала разница x2-x1
будет отрицательной и, следовательно, будет меньше положительного порога.Таким образом, выход после одной итерации без поиска корня.
Наиболее вероятное намерение состояло в том, что все сравнения были для длины, то есть абсолютной величины различий.Таким образом, измените на
while( abs(x2 - x1) > 0.0001){ # This is how I'm trying to converge the points.
...
if( abs(x2 - x_new) > abs(x_new - x1) ){ # These were the rules that I set to reassign the inital chosen values.
Кстати: по вашему описанию, функция ISO кажется дорогостоящей.Сохраните значения их оценки один раз и используйте их снова, где это необходимо, в основном в
x_new = x2 - y2*(x2 - x1)/(y2 - y1)
(обратите внимание, что я исправил опечатку с y1 до y2, вы решаете равенство наклонов (x2-x_new)/(y2-0) = (x2 - x1)/(y2 - y1)
, чтобы найтисекущий корень.)
Таким образом, установив y1=ISO(x1); y2=ISO(x2);
в начале и внутри цикла, добавьте к переназначению значений x
вычисление значения y
.
x2 = x_new; y2 = ISO(x_new);
соответственно
x1 = x_new; y1 = ISO(x_new);
Таким образом, для любого из x
используемых значений функция ISO оценивается ровно один раз.