【问题标题】:Why am I receiving the error that I am multiplying by non-int type 'float'?为什么我会收到我乘以非 int 类型“float”的错误?
【发布时间】:2015-05-05 05:28:16
【问题描述】:

我的代码存在问题,该代码是一种用于数值求解谐振子的 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”类型的非整数

【问题讨论】:

  • 它说你的错误发生在哪一行?
  • Harmonic 返回列表。当您将其中一个列表乘以浮点数时,您期望会发生什么?
  • 在问题中发布您的实际异常(带有回溯),不要只是模糊地描述它。
  • @user2357112:如果他是一名数字程序员,他可能期望它返回一个新列表,其中每个值都乘以该浮点数。 (在这种情况下,他可能应该使用 NumPy 数组,而不是列表。)
  • 只是出于好奇,教科书是什么?

标签: python integer numerical runge-kutta


【解决方案1】:

我敢打赌,问题在于您混淆了 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])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 2017-01-04
    • 1970-01-01
    • 2022-06-29
    • 1970-01-01
    • 2020-11-05
    相关资源
    最近更新 更多