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

代码模拟踢球后球位置始终为(0,0):是列表未更新还是公式错误?

问题描述

我正在编写代码模拟给定角度和初速度的球被踢出后,经过一定时间更新其位置。运行结果显示球始终处于(0,0)位置,请问这是position列表未更新,还是运动公式存在错误?

代码片段

import numpy as np
    
class Ball():
    def __init__(self, theta, v):
        self.position = [0, 0] # Position at ground is (0,0)
        self.theta = 0
        self.v = 0
        
    def step(self, delta_t = .1):
        ball.position[0] = ball.v*np.cos(ball.theta)*t
        ball.position[1] = (ball.v**2*np.sin(ball.theta))/9.81
        return ball.position
        
    
    
ball = Ball(theta = 30, v = 100)

for t in range(200):
    ball.step(delta_t = 0.05)

print(f'Ball is at x={ball.position[0]:.2f}m, y={ball.position[1]:.2f}m') # Check position

运行输出

Ball is at x=0.00m, y=0.00m

错误分析

你的代码存在多个核心问题,直接导致球的位置始终为(0,0):

  • 初始化参数未正确赋值:__init__方法里把self.theta和self.v硬设为0,完全忽略了传入的参数值。这意味着球的初速度和角度都是0,无论输入多少,计算出的位置必然是(0,0)。
  • 错误使用全局变量而非实例属性:step方法里直接调用全局的ball对象属性,而非用self访问实例自身的属性,逻辑混乱且易出错。
  • 运动公式完全错误:
    • x方向:循环中的t是0到199的整数,和实际运动时间无关,且没有累计时间;正确逻辑应该维护一个累计时间变量,用v0*cosθ * 累计时间计算x坐标。
    • y方向:你写的是抛体运动的最大高度公式,而非任意时刻的y坐标,正确公式应为v0*sinθ * 累计时间 - 0.5*g*(累计时间)²(g取9.81)。
  • 未利用delta_t参数:step方法里的delta_t没有被用来累计时间,无法模拟时间流逝。

修正后的代码示例

import numpy as np
    
class Ball():
    def __init__(self, theta, v):
        self.position = [0.0, 0.0]
        # 将角度转换为弧度(numpy三角函数默认用弧度计算)
        self.theta = np.deg2rad(theta)
        self.v0 = v  # 保存初速度
        self.total_time = 0.0  # 累计运动时间
        self.g = 9.81
        
    def step(self, delta_t=0.1):
        self.total_time += delta_t
        # 计算x方向位置(匀速直线运动)
        self.position[0] = self.v0 * np.cos(self.theta) * self.total_time
        # 计算y方向位置(匀变速直线运动)
        self.position[1] = self.v0 * np.sin(self.theta) * self.total_time - 0.5 * self.g * self.total_time**2
        # 球落地后不再更新y坐标(可选逻辑)
        if self.position[1] < 0:
            self.position[1] = 0.0
        return self.position
        
ball = Ball(theta=30, v=100)

for _ in range(200):
    ball.step(delta_t=0.05)

print(f'Ball is at x={ball.position[0]:.2f}m, y={ball.position[1]:.2f}m')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 01:20:31