尝试牛顿-拉夫森时获取“'float'对象不可调用”

问题描述 投票:0回答:1

当我尝试运行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)

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

python derivative
1个回答
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)

详细说明

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

© www.soinside.com 2019 - 2024. All rights reserved.