在此之前,对不起任何喋喋不休,英语问题,英语不是我的母语。
我正在对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)
是否有语法,代码问题?此外,任何指针,以改善代码将是非常有帮助的。谢谢。
答案 0 :(得分:0)
我在您的代码中看到的一些问题 -
我假设你先定义了名为erro
的函数,然后你也在做 -
erro = np.array([])
这会导致名称erro
指向np.array
,导致您遇到此问题,您应该在此处使用其他名称,例如erro1
(或其他一些有意义的名字)。
然后在函数 - euler(f,y0,a,b,h)
中 - 您正在定义名称为y
的变量。但是外面还有一个y
函数(这不会直接导致问题,因为你将函数y的引用传递给了这个函数的第一个参数)。
但我建议不要这样做(因为你可能会在以后遇到问题)。总是使用不同的有意义的名字,我不认为英语中的单词/字母短缺:)。
也没有必要这样做 -
sol = erro = np.array([])
由于你将它重新分配给下一行的euler()
函数的返回值,你甚至不需要在它之前定义它们(除非你想使用它们,这似乎不是这种情况)。