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

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)传入循环索引而非对应时间点,不符合加速度是时间函数的定义

修正步骤

  1. 修正函数调用方式:直接传入函数对象versnelling,而非调用后的数组结果
  2. 修复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:01:29