嘿伙计们我收到错误而且我不能100%确定它为什么会发生。我试图同时执行eulers和heun的方法并将它们相互映射。任何帮助或建议都会很棒!我是python的新手,所以这对我来说有点新鲜。
import numpy
#eulers
yi = 0
h = 0.2
te = [0.0,2.0,0.2]
def euler(f, y0, t):
n = len(t)
y = numpy.array([y0] * n)
for i in range(n - 1):
y[i+1] = y[i] + (t[i+1] - t[i]) * f(y[i], t[i])
return y
fy = (y*t**3) - 1.5*y
y1 = euler(fy, yi, te)
#heun
def heun(f, y0, t):
n = len(t)
y = numpy.array( [y0] * n )
for i in range(n - 1):
h = t[i+1] - t[i]
k1 = h * f( y[i], t[i])
k2 = h * f( y[i] + k1, t[i+1])
y[i+1] = y[i] + (k1 + k2) / 2.0
return y
y2 = heun(fy, 1, te)
tp = numpy.linspace(0.0, 2.0, 0.2)
plt.plot(tp, y1,'r-',linewidth=2,label='Eulers')
plt.plot(tp, y2,'b--',linewidth=2,label='Heun')
plt.xlabel('time')
plt.ylabel('y(t)')
plt.legend()
plt.show()
这是我的错误代码:
TypeError Traceback (most recent call last)
<ipython-input-152-395afeefc50a> in <module>()
11 return y
12 fy = (y*t**3) - 1.5*y
---> 13 y1 = euler(fy, yi, te)
14
15 #heun
<ipython-input-152-395afeefc50a> in euler(f, y0, t)
8 y = numpy.array([y0] * n)
9 for i in range(n - 1):
---> 10 y[i+1] = y[i] + (t[i+1] - t[i]) * f(y[i], t[i])
11 return y
12 fy = (y*t**3) - 1.5*y
TypeError: 'numpy.ndarray' object is not callable
答案 0 :(得分:2)
我的猜测是你试图在行中定义函数f(y,t)
fy = (y*t**3) - 1.5*y
作为你的微分方程。但是,这不是你在python中定义函数的方式。
尝试
def f(y,t):
return y*t**3 - 1.5*y
您收到错误是因为在线
---> 10 y[i+1] = y[i] + (t[i+1] - t[i]) * f(y[i], t[i])
f
是一个NumPy数组,但您将其视为一个函数。