我缺乏基础数学知识,想知道是否有比循环该算法更有效的方法:
dt = 1 / 60.
vel = 1000.
fri = 0.05
result = 0
while vel > 0.5:
vel -= vel * fri
result += vel * dt
print(result)
编辑:您可以在此处查看每次迭代的 vel 和结果示例:https://www.desmos.com/calculator/1dfvxzgxvt
最佳答案
如果您只是想在无限时间后得到答案,那么 Arndt Jonasson 就有答案。
加快代码速度
或者,如果您只是想加快现有代码的速度,那么 numba
对于这种数字类型的代码非常方便:
def fn():
dt = 1 / 60.
vel = 1000.
fri = 0.05
result = 0
while vel > 0.5:
vel -= vel * fri
result += vel * dt
return result
from numba import njit
numba_fn = njit(fn)
如果我们对两者进行计时,我们会发现很大的差异:
%timeit fn()
10.2 µs ± 12.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit numba_fn()
429 ns ± 5.86 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
积分随时获取距离
最后,如果您想在任何有限时间内解决这个问题,那么集成就是您的 friend 。您展示的算法由以下方程描述
dv / dt = - 60 fri v(t)
换句话说,速度的变化与速度成正比(60 只是来自原始时间步长的一个因子)。这称为一阶微分方程,有解
from math import exp
def v(t):
"""Velocity at time ``t``.
"""
return 950 * exp(-fri * 60 * t)
其中 950 是初始速度(不是 1000,因为您在“移动”之前更改它),因此我们通过求解上述方程 v(t) = 0.5 来计算速度达到 0.5 的时间:
from math import log
tf = log(0.5 / 1000) / (-fri * 60) # approx(2.53)
然后,为了获得 tf
之前行驶的距离,我们将 v(t)
从 0
积分到 tf
:
from scipy.integrate import quad
distance, err = quad(v, 0, tf)
print(distance)
316.50833333333327
或者确认无限时间答案:
import numpy as np
print(quad(v, 0, np.inf)[0])
316.6666666666584
关于python - 对序列进行数学求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49494658/