Я пытаюсь вычислить корень tanh(x) в качестве упражнения.
Я использую метод Ньютона-Рафсона, где алгоритм запрашивает начальное предположение
Алгоритм предполагается, что он не сходится для начальных предположений, превышающих примерно 1. Но я получаю ошибку математического диапазона еще до того, как он доходит до этого.
Это код, который я использую
from math import *
def f(x):#define the function
return tanh(x)
def fdiv(x):#define its derivative
return 4*(cosh(x))**2/(cosh(2*x)+1)**2
def Raphson(rx0):
return (rx0-f(rx0)/fdiv(rx0))#according to the Newton Raphson Method
def Q1_6_Raphson(rx0,Iter=1):
if Iter > 30:#maximum iterations allowed is 30
print("Newton Raphson Algorithim did not converge after 30 Trials, try other initial guesses")
return
elif fdiv(rx0)==0:
print("The initial guess you chose leads to diving by zero in the Newton-Raphson method. Choose another guess")
return
print(Iter, 'Newton-Raphson ' +str(rx0) +' error ' +str(rx0-(0)))
if rx0==0:
return
else:
return Q1_6_Raphson(Raphson(rx0),Iter=Iter+1) # call the function recursively
Например, когда я пытаюсь запустить Q1_6Raphson(5)
, я получаю:
Traceback (most recent call last):
File "<pyshell#101>", line 1, in <module>
Q1_6_Raphson(5)
File "C:\Users\AsafHaddad\Documents\סמסטר 8\חישובית\Targil_3\Question1.6.py", line 40, in Q1_6_Raphson
return Q1_6_Raphson(Raphson(rx0),Iter=Iter+1) # call the function recursively
File "C:\Users\AsafHaddad\Documents\סמסטר 8\חישובית\Targil_3\Question1.6.py", line 33, in Q1_6_Raphson
elif fdiv(rx0)==0:
File "C:\Users\AsafHaddad\Documents\סמסטר 8\חישובית\Targil_3\Question1.6.py", line 21, in fdiv
return 4*(cosh(x))**2/(cosh(2*x)+1)**2
OverflowError: math range error
Из того, что я прочитал, ошибка математического диапазона возникает, когда число слишком велико. Но чего я не понимаю, так это того, что каждая функция, вызываемая в моем коде, работает с 5 в качестве входных данных:
>>> f(5)
0.9999092042625951
>>> fdiv(5)
0.00018158323094380672
>>> Raphson(5)
-5501.616437351696
Так в чем проблема? что вызывает ошибку математического диапазона?
fdiv(711)
или старше (или для -711 и ниже). - person Martijn Pieters   schedule 16.04.2014Raphson(5)
возвращает-5501.61643
вместоrx0 = 5
, которые затем возвращаются обратно в вашу рекурсивную функцию, которая затем передает это новое значениеfdiv()
; -5501 намного ниже, чем -711. - person Martijn Pieters   schedule 16.04.2014if fdiv(rx0) == 0
выполняется до вызова функцииprint()
. - person Martijn Pieters   schedule 16.04.2014