Python传入ndarray作为函数参数引发TypeError的问题分析与修复
解决变加速度运动计算中的TypeError问题
错误原因
调用numeriek(x0, v0, versnelling(t), t)时,versnelling(t)会立即执行并返回一个numpy数组(因为输入的t是数组),但numeriek函数的第三个参数a_func要求传入可调用的函数对象,而非数组。当函数内部执行a_func(t[0])时,实际是在尝试调用一个数组,因此触发TypeError: 'numpy.ndarray' object is not callable。
此外原代码还有两处逻辑错误:
- 未定义变量
a0,直接使用会引发NameError a_func(i)传入循环索引而非对应时间点,不符合加速度是时间函数的定义
修正步骤
- 修正函数调用方式:直接传入函数对象
versnelling,而非调用后的数组结果 - 修复numeriek函数内部逻辑:
- 移除未定义的
a0,通过a_func(t[i+1])计算对应时间点的加速度 - 将
a_func(i)改为a_func(t[i+1]),传入正确的时间参数 - 调整欧拉法更新逻辑,保证速度和位置计算基于当前时刻的加速度
- 移除未定义的
完整修正代码
import numpy as np import matplotlib.pyplot as plt dt = 0.1 t0 = 0.0 t1 = 10.0 x0 = 0.0 v0 = 0.0 m = 5.0 t = np.linspace(0, 10, 101) def versnelling(t): return (0.7 * np.sin(3 * t)) / m def numeriek(x0, v0, a_func, t): x = np.zeros(len(t)) v = np.zeros(len(t)) a = np.zeros(len(t)) x[0] = x0 v[0] = v0 a[0] = a_func(t[0]) for i in range(len(t) - 1): dt = t[i + 1] - t[i] # 计算下一个时间点的加速度 a[i + 1] = a_func(t[i+1]) # 欧拉法更新速度和位置 v[i + 1] = v[i] + a[i] * dt x[i + 1] = x[i] + v[i] * dt return x, v, a # 正确调用方式:传入函数对象versnelling x, v, a = numeriek(x0, v0, versnelling, t) # 可选:绘制结果验证 plt.figure(figsize=(12,8)) plt.subplot(311) plt.plot(t, x) plt.title('位置随时间变化') plt.ylabel('位置') plt.subplot(312) plt.plot(t, v) plt.title('速度随时间变化') plt.ylabel('速度') plt.subplot(313) plt.plot(t, a) plt.title('加速度随时间变化') plt.ylabel('加速度') plt.xlabel('时间') plt.tight_layout() plt.show()
验证说明
修正后调用numeriek(x0, v0, versnelling, t),函数会在循环中每次调用versnelling并传入对应时间点t[i],正确计算每个时刻的加速度,避免了类型错误,同时修复了内部逻辑问题,得到正确的位置、速度、加速度数组。
内容的提问来源于stack exchange,提问作者Seb
相关产品推荐
相关产品推荐

