You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeError: float类型无len()方法问题求助(数值计算场景)

解决TypeError: object of type 'float' has no len()错误

问题场景

运行纯数值计算代码时触发TypeError: object of type 'float' has no len(),错误指向eignfun函数的eigf = np.zeros((len(n), len(x)))行。单独调用eignfun(x, n)时可正常处理数组参数并返回结果,但在fnt函数中通过quad调用时出错。

错误原因

fnt函数中使用quad调用eignfun时,传入的是单个float类型的n[i],但原eignfun的n参数预期接收数组,执行len(n)时因float无长度属性报错。此外,quad要求被积分函数的第一个参数是积分变量,原eignfun的参数顺序(n在前,x在后)与quad的调用逻辑不匹配,进一步加剧了参数类型错误。

修复方案

  1. 调整eignfun的参数顺序:将积分变量x作为第一个参数,单个n值作为第二个参数,适配quad的调用规则。
  2. 修改eignfun的计算逻辑:由于quad会逐个传入x的单值,无需再处理数组的循环,直接返回单个x对应的计算结果。
  3. 修正fnt中quad的调用方式,确保参数传递正确。

修正后的关键代码

修正后的eignfun函数

def eignfun(x, n_val):
    # x是单个数值,n_val是单个整数/浮点数,直接计算对应值
    return -np.exp(-(x - 2)**2) * np.cos(((n_val * np.pi)/(2 * L))*(x + L))

修正后的fnt函数中quad调用部分

for i in range(len(n)):
    # quad会将x作为第一个参数传给eignfun,args传入n[i]作为第二个参数
    integral = quad(eignfun, -L, L, args=(n[i],))

完整修正代码

import numpy as np
from scipy.integrate import quad
from scipy.optimize import fsolve
from scipy.misc import derivative
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt

L = 5
gr = 10
h0 = 1
x0 = 2
n0 = 5
n=np.arange(1,n0)
x = np.arange(-L, L)
t = np.linspace(0,1, 5)
kn = np.array([(i * np.pi) / (2 * L) for i in range(1,len(n)+1)])

def xn(n, x):
    xn = np.zeros((len(n), len(x)))
    for i in range(len(n)):
        for j in range(len(x)):
            xn[i, j] = np.cos(kn[i] * (x[j] + L))
    return xn

xnx = xn(n, x)

def f(t):
    return (t**2)

def g(x):
    return -(x - x0)**2

omega_n = np.array([np.sqrt(gr * kn[i] * np.tanh(kn[i] * h0)) for i in range(len(n))])

# 修正后的特征函数,适配quad积分需求
def eignfun(x, n_val):
    return -np.exp(-(x - 2)**2) * np.cos(((n_val * np.pi)/(2 * L))*(x + L))

def fnt(n, t):
    fntt = np.zeros((len(n), len(t)))
    dfdt = derivative(f, t, dx=1e-6, n=1)
    d3fdt = derivative(f, t, dx=1e-10, n=3, order=5)
    for i in range(len(n)):
        integral = quad(eignfun, -L, L, args=(n[i],))
        for j in range(len(t)):
            fntt[i, j] = np.exp(-kn[i]*h0) * ((kn[i]*gr*dfdt[j] - d3fdt[j])/kn[i]) * integral[0]
    return fntt

# 测试特征函数(若需批量计算数组x的结果,可通过np.vectorize包装)
# 示例:计算数组x的特征函数值
eignfun_vec = np.vectorize(eignfun)
print(eignfun_vec(x, n[0]))

# 调用fnt函数
result = fnt(n, t)
print(result)

内容的提问来源于stack exchange,提问作者GGt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 18:24:59