当我尝试运行Cody时出现此错误,在使用二分法时我使用了相同的方程式,所以我不知道为什么得到这个:第119行,衍生val + = weights [k] * func(x0 +(k-ho)* dx,* args)
TypeError:'float'对象不可调用
我的代码是:
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)
我认为误差在于导数,但是我很确定我的方程是正确的。我真的需要一些帮助,必须在星期一之前完成此操作
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)
详细说明
[C0函数需要第一个参数,但是您传递了derivative
(在第4行中定义的浮点数),而不是d
(在第45行中定义的lambda函数。)>