python - 对序列进行数学求和

标签 python math

我缺乏基础数学知识,想知道是否有比循环该算法更有效的方法:

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/

相关文章:

math - 如何计算 f(2) 度量?

math - Octave 中的 1-of-K 编码

math - n 次多项式生成

javascript - 获取鼠标相对于饼图的位置(方程式)

python - 如何加入4个mongo集合

python - 获取 Python 错误 "from: can' t read/var/mail/Bio"

python - 为什么我会收到 TypeError : get() takes exactly 2 arguments (1 given)? Google App Engine

python - Django 中的 UpdateView 显示空白表单而不是数据库以前的数据

Python venv 项目随机停止能够找到 python3 二进制文件

algorithm - 学生积木组合设计