gpt4 book ai didi

python - 当 scipy.integrate.odeint 中输出达到 0 时停止积分

转载 作者:太空宇宙 更新时间:2023-11-03 21:28:12 25 4
gpt4 key购买 nike

我编写了一段代码,用于查看物体在拖动过程中的抛射运动。我正在使用 scipy 中的 odeint 来执行前向欧拉方法。集成将持续运行直至达到时间限制。我想在达到此限制时或当 ry = 0 的输出(即射弹已着陆)时停止积分。

def f(y, t):
# takes vector y(t) and time t and returns function y_dot = F(t,y) as a vector
# y(t) = [vx(t), vy(t), rx(t), ry(t)]

# magnitude of velocity calculated
v = np.sqrt(y[0] ** 2 + y[1] **2)

# define new drag constant k
k = cd * rho * v * A / (2 * m)

return [-k * y[0], -k * y[1] - g, y[0], y[1]]


def solve_f(v0, ang, h0, tstep, tmax=1000):
# uses the forward Euler time integration method to solve the ODE using f function
# create vector for time steps based on args
t = np.linspace(0, tmax, tmax / tstep)

# convert angle from degrees to radians
ang = ang * np.pi / 180

return odeint(f, [v0 * np.cos(ang), v0 * np.sin(ang), 0, h0], t)

solution = solve_f(v0, ang, h0, tstep)

我已经尝试了几个循环和类似的尝试在 ry = 0 时停止积分。并在下面发现了这个问题,但无法使用 odeint 实现类似的东西。 Solution[:,3] 是 ry 的输出列。有没有一种简单的方法可以用 odeint 来做到这一点?

最佳答案

checkout scipy.integrate.ode here 。它比 odeint 更灵活,可以帮助您完成您想做的事情。

一个使用垂直射击的简单示例,集成直到接触地面:

from scipy.integrate import ode, odeint
import scipy.constants as SPC

def f(t, y):
return [y[1], -SPC.g]

v0 = 10
y0 = 0

r = ode(f)
r.set_initial_value([y0, v0], 0)

dt = 0.1
while r.successful() and r.y[0] >= 0:
print('time: {:.3f}, y: {:.3f}, vy: {:.3f}'.format(r.t + dt, *r.integrate(r.t + dt)))

每次调用r.integrate时,r都会存储当前时间和y值。如果您想存储它们,可以将它们传递到列表。

关于python - 当 scipy.integrate.odeint 中输出达到 0 时停止积分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53705708/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com