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的调用逻辑不匹配,进一步加剧了参数类型错误。
修复方案
- 调整
eignfun的参数顺序:将积分变量x作为第一个参数,单个n值作为第二个参数,适配quad的调用规则。 - 修改
eignfun的计算逻辑:由于quad会逐个传入x的单值,无需再处理数组的循环,直接返回单个x对应的计算结果。 - 修正
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
相关产品推荐
相关产品推荐

