Получение «плавающего» объекта не вызывается при попытке Ньютона-Рафсона - PullRequest
2 голосов
/ 06 октября 2019

Я получаю эту ошибку, когда пытаюсь запустить мой коди, я использовал то же уравнение при использовании метода деления пополам, поэтому я не знаю, почему я получаю это: строка 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 голосов
/ 06 октября 2019

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.

...