В коде ошибка, столкнулся в вопросом решения уравнения с одного из форумов:
при
на промежутке
Программа отказалась его решать с небольшим числом шагов. Анализ кода выявил ошибку (странно, что ранее программа вообще решала, правда менее жесткие уравнения, при этом с небольим числом шагов).
Вот этот блок кода
error = 0
ytemp1 = y0
i=0
do while (abs(g(y, h, x, ytemp2)) > eps)
dg = (g(y, h, x, ytemp1+dy) - g(y, h, x, ytemp1-dy)) / (dy+dy)
ytemp2 = y - g(y, h, x, ytemp1) / dg
ytemp1 = ytemp2
i = i + 1
if (i > 10000) then
error = 1
exit
end if
end do
y2 = ytemp2
Нужно заменить вот этим блоком кода
error = 0
ytemp1 = y !Начальное приближение на основе найденного на предыдущем шаге
!ytemp1 = y0 !При другом начальном приближении
ytemp2 = 7.33 !Любое значение, далее оно будет определено
i=0
do while (abs(g(y, h, x, ytemp2)) > eps)
dg = (g(y, h, x, ytemp1+dy) - g(y, h, x, ytemp1-dy)) / (dy+dy)
ytemp2 = ytemp1 - g(y, h, x, ytemp1) / dg
ytemp1 = ytemp2
i = i + 1
if (i > 500) then
error = 1
exit
end if
end do
y2 = ytemp2
В коде самой строчки метода вместо
должно было быть
, как сразу это проглядел непонятно. Плюсом перед циклом сделаны небольшие изменения, назначение ошибки при
итерациях достаточно вместо
. Дополнительно введено определение максимального числа итераций метода Ньютона по любому из обращений к модулю, но это здесь не показано.
ps Теперь вышеприведенное уравнение решается даже с количеством шагов
! правда точность при
не достаточно высокая, нужно больше шагов, но не для устойчивости, а для точности.