【问题标题】:How to do a Sigma in python 3如何在 python 3 中做一个 Sigma
【发布时间】:2015-10-29 19:00:44
【问题描述】:

我正在尝试为某些东西制作计算器,但公式使用 sigma,我不知道如何在 python 中计算 sigma,是否有运算符? 我会在这里放一个链接,上面有一个页面,上面有公式用于说明:http://fromthedepths.gamepedia.com/User:Evil4Zerggin/Advanced_cannon

【问题讨论】:

  • 我不熟悉这种形式的 sigma 符号。 Σ下面不应该有一个小“i=”吗?
  • @Kevin 我不确定 OP 表示该页面上的许多公式中的哪一个,但如果它是 sigma 表示法,如果没有提供索引,则总和被理解为超出了推断的某个预期范围从上下文。 OP:看看 Python 的 sum 命令。

标签: python python-3.x


【解决方案1】:

西格玛 (∑) 是 Summation 运算符。它多次计算某个表达式,变量略有不同,并返回所有这些表达式的sum

例如,在Ballistic coefficient 公式中

Python 实现如下所示:

# Just guessing some values. You have to search the actual values in the wiki.
ballistic_coefficients = [0.3, 0.5, 0.1, 0.9, 0.1]

total_numerator = 0
total_denominator = 0
for i, coefficient in enumerate(ballistic_coefficients):
    total_numerator += 2**(-i) * coefficient
    total_denominator += 2**(-i)
print('Total:', total_numerator / total_denominator)

您可能想查看enumerate function,并注意精度问题。

【讨论】:

    【解决方案2】:

    最简单的方法是创建一个返回总和的 sigma 函数,您几乎无法理解这一点,您不需要使用库。你只需要理解逻辑。

    def sigma(first, last, const):
        sum = 0
        for i in range(first, last + 1):
            sum += const * i
        return sum
    
    # first : is the first value of (n) (the index of summation)
    # last : is the last value of (n)
    # const : is the number that you want to sum its multiplication each (n) times with (n)
    

    【讨论】:

    • 这太过分了。只需将sum() 与生成器表达式一起使用:sum(const*i for i in range(first, last+1)
    • 另外,题外话,但sum 是一个错误的变量名,因为它是shadows builtin sum()。您可以改用 total 之类的名称,尽管就像我提到的那样,如果您只使用 sum() 本身,这将是一个有争议的问题。
    【解决方案3】:

    在 Python 中执行此操作的一种有效方法是使用 reduce()

    解决

    3
    Σ i
    i=1
    

    您可以使用以下内容:

    from functools import reduce
    result = reduce(lambda a, x: a + x, [0]+list(range(1,3+1)))
    print(result)
    

    reduce() 将接受可调用对象和可迭代对象的参数,并返回可调用对象指定的一个值。累加器是 a 并设置为第一个值 (0),然后是当前总和。可迭代对象中的当前值设置为x 并添加到累加器中。返回最终的累加器。

    sigma 右边的公式用 lambda 表示。我们求和的序列由 iterable 表示。您可以根据需要更改这些设置。

    例如,如果我想解决:

    Σ π*i^2
    i
    

    对于序列 I [2, 3, 5],我可以执行以下操作:

    reduce(lambda a, x: a + 3.14*x*x, [0]+[2,3,5])
    

    您可以看到以下两行代码产生了相同的结果:

    >>> reduce(lambda a, x: a + 3.14*x*x, [0]+[2,3,5])
    119.32
    >>> (3.14*2*2) + (3.14*3*3) + (3.14*5*5)
    119.32
    

    【讨论】:

    • reduce() 太过分了。请改用sum()sum(range(1, 3+1); sum(3.14*x**2 for x in [2, 3, 5])
    【解决方案4】:

    我已经查看了不同程序员和编码人员试图对您的查询给出的所有答案,但我无法理解其中任何一个,可能是因为我还是一名高中生,根据我的说法,使用 LIST 肯定会减轻一些痛苦编码,所以这是我认为形成 sigma 函数的最简单方法。

    #creating a sigma function
    a=int(input("enter a number for sigma  "))
    mylst=[]
    
    for i in range(1,a+1):
         mylst.append(i)
         b=sum(mylst)
    print(mylst)
    print(b)
    
        
    

    【讨论】:

    • 不需要该列表。 print(sum(range(1, a + 1))) 已经打印了答案。
    【解决方案5】:

    Captial sigma (Σ) 将其后面的表达式应用于范围的所有成员,然后对结果求和。

    在 Python 中,sum 将取一个范围的总和,您可以将表达式写为推导式:

    例如 Speed Coefficient

    枪口速度的一个因素是速度系数,它是 (非 外壳)部分,其中从头部开始的每个组件 i 都有一半 上一个的重量:

    因此,头部将始终决定至少 25% 的速度 系数。

    例如,假设外壳有一个复合头(速度修饰符 1.6)、固体弹头体(速度调节器 1.3)和超空泡 基础(速度修正 0.9)。然后我们有

    s0=1.6

    s1=1.3

    s2=0.9

    从示例中我们可以看到 i 从 0 开始,而不是通常的 1,所以我们可以这样做

    def speed_coefficient(parts):
        return (
            sum(0.75 ** i * si for i, si in enumerate(parts))
            /
            sum(0.75 ** i for i, si in enumerate(parts))
        )
    
    >>> speed_coefficient([1.6, 1.3, 0.9])
    1.3324324324324326
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-23
      • 2021-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-02
      • 1970-01-01
      相关资源
      最近更新 更多