TypeError:'numpy.ndarray'对象在Euler方法LTE计算中不可调用

时间:2015-07-29 01:42:28

标签: python typeerror

在此之前,对不起任何喋喋不休,英语问题,英语不是我的母语。

我正在对Euler的方法进行分区来计算ODE,并且在计算LTE(局部截断误差)时,我一直收到这个错误:

  

TypeError:'numpy.ndarray'对象不可调用

我看了同样主题的先前问题,但我找不到我想要的东西。下面是欧拉方法的代码和误差计算。

def euler(f,y0,a,b,h):
    t,y = a,y0
    vet_s = np.array([])
    vet_err = np.array([])
    while t <= b:
        #print t , y
        vet_s = np.append(vet_s, y)
        t += h
        y += h * f(t,y)
        vet_err = np.append(vet_err, erro(yn, y, t))    # The problem is here
    return vet_s, vet_err

def y(t, y):
    return lbd*y

def yn(t):
    return np.exp(-1*t)

def erro(yn, un, t):
    erro_local = abs(yn(t) - un)
    return erro_local

当我在 vet_err 分配函数中调用错误计算时,我收到上面显示的错误。 我认为这是一个简单的修复,但我自己找不到。

欧拉方法的主要要求是:

h = 30./60.
lbd = -1.0
t = np.arange(0, 30, h)
sol = erro = np.array([])
sol, erro = euler(y, 1.0, 0.0, 30.0, h)

是否有语法,代码问题?此外,任何指针,以改善代码将是非常有帮助的。谢谢。

1 个答案:

答案 0 :(得分:0)

我在您的代码中看到的一些问题 -

  1. 我假设你先定义了名为erro的函数,然后你也在做 -

    erro = np.array([])
    

    这会导致名称erro指向np.array,导致您遇到此问题,您应该在此处使用其他名称,例如erro1(或其他一些有意义的名字)。

  2. 然后在函数 - euler(f,y0,a,b,h)中 - 您正在定义名称为y的变量。但是外面还有一个y函数(这不会直接导致问题,因为你将函数y的引用传递给了这个函数的第一个参数)。

    但我建议不要这样做(因为你可能会在以后遇到问题)。总是使用不同的有意义的名字,我不认为英语中的单词/字母短缺:)。

  3. 也没有必要这样做 -

    sol = erro = np.array([])
    

    由于你将它重新分配给下一行的euler()函数的返回值,你甚至不需要在它之前定义它们(除非你想使用它们,这似乎不是这种情况)。