派生问题-如何修复“ TypeError:'Add'对象不可调用”

时间:2019-02-13 05:56:28

标签: python numpy math sympy differentiation

使用numpy和sympy在python中进行编程,而我尝试在代码中使用派生类的尝试也陷入僵局。我经常得到

  

“ TypeError:'Add'对象不可调用”

  

“ ValueError:第一个变量不能为数字:1”。

这是一个用于定义牛顿方法以解决寻根问题的程序。我使用的样本方程式是1 / x + log(x)-2。我之所以这样说是因为我也遇到了numpy的log函数的一些问题。我认为我的问题与我使用的diff有关,因为我不确定如何使用它来返回实际值,而我阅读的文献也无济于事。

def newton(p0, f, n, t):
    global p
    p = 0
    for i in range(1, n+1):
        p = p0 - f(p0)/diff(f(x),p0)
        if abs(p-p0) < t:
            return p
        p0 = p
        i = i + 1
    return f"The method failed after {n} iterations. The procedure was unsuccessful."

print(newton(p0=1, f=1/x+log(x)-2, n=10, t=5e-324))

我至少期望有一个数字,但是我遇到了上面描述的错误。

1 个答案:

答案 0 :(得分:0)

您的代码中有两个问题,

第一个是函数中的参数f应该有一个“函数”输入,表示f=lambda x: 1/x+log(x)-2

第二个是p = p0 - f(p0)/diff(f(x),p0)。如果我理解正确,您会期望diff函数作为派生函数执行,但是事实并非如此。也许您可以定义自己的推导函数:

def df(f, x):
    h = 1e-5
    return (f(x+h)-f(x))/h

然后您可以写p = p0 - f(p0)/df(f, p0)

因此整个代码可以编写如下:

def newton(p0, f, n, t):
    global p
    p = 0
    for i in range(1, n+1):
        def df(f, x):
            h = 1e-5
            return (f(x+h)-f(x))/h
        p = p0 - f(p0)/df(f, p0)
        if abs(p-p0) < t:
            return p
        p0 = p
        i = i + 1
    return f"The method failed after {n} iterations. The procedure was unsuccessful."

print(newton(p0=1, f=lambda x: 1/x+log(x)-2, n=10, t=5e-324))