尝试牛顿-拉夫森时,出现“无法调用'float'对象”的情况

时间:2019-10-05 23:19:19

标签: python derivative

当我尝试运行Cody时出现此错误,在使用二分法时我使用了相同的方程式,所以我不知道为什么得到这个: 第119行,衍生     val += weights[k]*func(x0+(k-ho)*dx,*args)

TypeError: 'float' object is not callable

我的代码是:

import math
from scipy.misc import derivative

d = float(input("Ingresar diametro [m]: "))

q = float(input("Ingresar caudal [m^3/s]: "))

n = float(input("Ingresar coeficiente de manning (n): "))

s = float(input("Ingresar pendiente de fondo (S0): "))

def poli(x):
      y= (q*n)*(math.acos(1-(2*x)/d)*d)**(0.666667)-((1/8)*(2*math.acos(1-(2*x)/d)- math.sin(2*math.acos(1-(2*x)/d))))**(1.66667)*(s**0.5)
      return (y)


print ("Utilizando Método de bisección")
xi=0
xs=10
error=0.0001
print("Tolerancia:",error)
xa=(xi+xs)/2
i=0
while abs(poli(xi)) > error:
      i=i+1
      xa = (xi+xs)/2.0
      if poli(xi)*poli(xa)<0:
        xs=xa
        signo="negativo"
        limite="superior"
      else:
        xi=xa
        signo="positivo"
        limite="inferior"
        print(xa)
xa=xa*1
print("Altura normal trapecio en Método de biseccion: ",xa)

#metodo de newton-raphson
def poli(x):
    y=(q*n)*(math.acos(1-(2*x)/d)*d)**(0.666667)-((1/8)*(2*math.acos(1-(2*x)/d)- math.sin(2*math.acos(1-(2*x)/d))))**(1.66667)*(s**0.5)
    return (y)

def deri(x):
    dr=lambda x:(q*n)*(math.acos(1-(2*x)/d)*d)**(0.666667)-((1/8)*(2*math.acos(1-(2*x)/d)- math.sin(2*math.acos(1-(2*x)/d))))**(1.66667)*(s**0.5)
    dr=derivative(d,x,1e-3)
    return (dr)
print ("Utilizando Método de Newton-Raphson")
x=1
if x<=1:
    x=2
else: 
    x=x
erroru=0.0001
print("Tolereancia:",erroru)
raiz=[ ]
raiz.insert(0,0)
i=0
error=1
while abs(error) > erroru:
    x1=x-(poli(x)/deri(x))
    i=i+1
    x=x1
    raiz.append(x1)
    error=(raiz[i]-raiz[i-1])/raiz[i]
    print (x)

x=x*1
print ("Altura normal trapecio en Método de Newton-Raphson =",x)

我认为误差在导数中,但是我很确定我的方程是正确的。 我真的需要一些帮助,必须在周一之前完成

1 个答案:

答案 0 :(得分:0)

TL; DR

更改您的代码,如下所示:

def deri(x):
    dr=lambda x:(q*n)*(math.acos(1-(2*x)/d)*d)**(0.666667)-((1/8)*(2*math.acos(1-(2*x)/d)- math.sin(2*math.acos(1-(2*x)/d))))**(1.66667)*(s**0.5)
    dr=derivative(dr,x,1e-3)     # Change variable of first argument
    return (dr)

详细解释

函数derivative在第一个参数中需要一个函数,但是您传递了d(第4行中定义的浮点数)而不是dr(第45行中定义的lambda函数)。 >