为什么我收到乘以非整数类型 'float' 的错误?
Why am I receiving the error that I am multiplying by non-int type 'float'?
我的代码有问题,我的代码是用 Runge Kutta 算法数值求解谐振子的。不幸的是,我收到一条错误消息,提示我无法将序列乘以浮点类型的非整数。考虑到这段代码几乎是从教育文本中逐字记录的,我看不出错误在哪里。有人可以帮我吗?感谢您友好的邻居蜘蛛侠。
import numpy as np
import matplotlib.pyplot as plt
#Variable Definitions
N = 500
x0 = 1.0
v0 = 0.0
dur = 10.0
dt = dur/float(N-1)
#creating the array
y = np.zeros([N,2])
y[0,0] = x0
y[0,1] = v0
#runge kutta algorithm
def rk4(y, time, dt, deriv)
k1 = dt * deriv(y,time)
k2 = dt * deriv(y + 0.5*k1,time + 0.5*dt)
k3 = dt * deriv(y + 0.5*k2, time + 0.5*dt)
k4 = dt * deriv(y + k3, time + dt)
y_next = y + (k1 + 2*(k2+k3)+k4)/6
return y_next
#Harmonic oscillator
def Harmonic(x,time):
y0 = x[1]
y1 = (-1)*x[0]
return ([y0,y1])
#forming data points
for i in range(N-1):
y[i+1] = rk4(y[i],0, dt, Harmonic)
time = np.linspace(0, dur, N)
#plotting
plt.plot(time,y[:,1])
plt.show()
错误在第 33 行。
TypeError: 无法将序列乘以 'float'
类型的非整数
我敢打赌,问题在于您混淆了 NumPy 数组和普通 Python 列表。
您在整个代码中都使用了 NumPy 数组。他们知道如何做各种很酷的事情,比如元素操作。例如:
>>> a = np.array([1, 2, 3, 4])
>>> a * 1.5
array([ 1.5, 3. , 4.5, 6. ])
但是 Python 列表不知道该怎么做。 (另一方面,它们知道如何做 NumPy 数组做不到的其他事情,比如将新值附加到末尾,或者在切片时自动制作副本,而不是仅在您明确告诉它们时才制作副本。)乘以 Python 按数字列出只是意味着重复列表多次。它对整数有意义,但对浮点数没有意义——即使对于整数,这也不是你想要的:
>>> a = [1, 2, 3, 4]
>>> a * 2
[1, 2, 3, 4, 1, 2, 3, 4]
>>> a * 1.5
TypeError: can't multiply sequence by non-int of type 'float'
您的 Harmonic
函数返回 list
,而不是 array
:
def Harmonic(x,time):
y0 = x[1]
y1 = (-1)*x[0]
return ([y0,y1])
但是您正试图将该函数的结果乘以一个数字。这对数组有意义,但对列表没有意义。
所以你可能只想改变它:
def Harmonic(x,time):
y0 = x[1]
y1 = (-1)*x[0]
return np.array([y0,y1])
我的代码有问题,我的代码是用 Runge Kutta 算法数值求解谐振子的。不幸的是,我收到一条错误消息,提示我无法将序列乘以浮点类型的非整数。考虑到这段代码几乎是从教育文本中逐字记录的,我看不出错误在哪里。有人可以帮我吗?感谢您友好的邻居蜘蛛侠。
import numpy as np
import matplotlib.pyplot as plt
#Variable Definitions
N = 500
x0 = 1.0
v0 = 0.0
dur = 10.0
dt = dur/float(N-1)
#creating the array
y = np.zeros([N,2])
y[0,0] = x0
y[0,1] = v0
#runge kutta algorithm
def rk4(y, time, dt, deriv)
k1 = dt * deriv(y,time)
k2 = dt * deriv(y + 0.5*k1,time + 0.5*dt)
k3 = dt * deriv(y + 0.5*k2, time + 0.5*dt)
k4 = dt * deriv(y + k3, time + dt)
y_next = y + (k1 + 2*(k2+k3)+k4)/6
return y_next
#Harmonic oscillator
def Harmonic(x,time):
y0 = x[1]
y1 = (-1)*x[0]
return ([y0,y1])
#forming data points
for i in range(N-1):
y[i+1] = rk4(y[i],0, dt, Harmonic)
time = np.linspace(0, dur, N)
#plotting
plt.plot(time,y[:,1])
plt.show()
错误在第 33 行。
TypeError: 无法将序列乘以 'float'
类型的非整数我敢打赌,问题在于您混淆了 NumPy 数组和普通 Python 列表。
您在整个代码中都使用了 NumPy 数组。他们知道如何做各种很酷的事情,比如元素操作。例如:
>>> a = np.array([1, 2, 3, 4])
>>> a * 1.5
array([ 1.5, 3. , 4.5, 6. ])
但是 Python 列表不知道该怎么做。 (另一方面,它们知道如何做 NumPy 数组做不到的其他事情,比如将新值附加到末尾,或者在切片时自动制作副本,而不是仅在您明确告诉它们时才制作副本。)乘以 Python 按数字列出只是意味着重复列表多次。它对整数有意义,但对浮点数没有意义——即使对于整数,这也不是你想要的:
>>> a = [1, 2, 3, 4]
>>> a * 2
[1, 2, 3, 4, 1, 2, 3, 4]
>>> a * 1.5
TypeError: can't multiply sequence by non-int of type 'float'
您的 Harmonic
函数返回 list
,而不是 array
:
def Harmonic(x,time):
y0 = x[1]
y1 = (-1)*x[0]
return ([y0,y1])
但是您正试图将该函数的结果乘以一个数字。这对数组有意义,但对列表没有意义。
所以你可能只想改变它:
def Harmonic(x,time):
y0 = x[1]
y1 = (-1)*x[0]
return np.array([y0,y1])