【问题标题】:Can I make this iteration easier by using a loop?我可以通过使用循环使这个迭代更容易吗?
【发布时间】:2019-04-21 01:52:52
【问题描述】:

我对 python 比较陌生,但我在以前制作的程序中使用过循环,但它们相对简单。 我想知道是否有一种方法涉及循环或其他方式来使这个迭代更简洁。

基本上有一种方法可以让我拥有一个名为“t”的变量,它将 t1、t2 和 t3 的值保存在一个列表中,然后在“eq”和“der”中使用,而不是复制和粘贴相同的值一段代码?

我已经尝试在这里和其他地方寻找答案,但到目前为止我发现的解决方案似乎不适用于我所拥有的/我没有足够的 Python 知识来理解它们。

import numpy as np
U235_Decay_Constant = 9.72e-10
U238_Decay_Constant = 1.54e-10


t0 = 4.1e9


eq = ((np.exp(U238_Decay_Constant*t0)-1)-(0.0167* 
((np.exp(U235_Decay_Constant*t0)-1)))-0.0094)
der = (U238_Decay_Constant*(np.exp(U238_Decay_Constant*t0)))-(0.0167* 
(U235_Decay_Constant*(np.exp(U235_Decay_Constant*t0))))

t1 = t0 - (eq/der)


eq = ((np.exp(U238_Decay_Constant*t1)-1)-(0.0167* 
((np.exp(U235_Decay_Constant*t1)-1)))-0.0094)
der = (U238_Decay_Constant*(np.exp(U238_Decay_Constant*t1)))-(0.0167* 
(U235_Decay_Constant*(np.exp(U235_Decay_Constant*t1))))

t2 = t1 - (eq/der)

eq = ((np.exp(U238_Decay_Constant*t2)-1)-(0.0167* 
((np.exp(U235_Decay_Constant*t2)-1)))-0.0094)
der = (U238_Decay_Constant*(np.exp(U238_Decay_Constant*t2)))-(0.0167* 
(U235_Decay_Constant*(np.exp(U235_Decay_Constant*t2))))

t3 = t2 - (eq/der)
print(t3)

【问题讨论】:

  • 欢迎来到 stackover 流程​​!所以基本上你想要一个创建 t3 值的循环?您可以编辑您的问题,以便我们更轻松地提供帮助;)
  • 很高兴您发现这两个答案都有帮助!但是,您只能选择其中的 一个 作为“已接受”的答案。选择完全由您自己决定,选择一个您认为可能对您最有帮助的人,两者都不选也是一种选择。

标签: python list loops numpy iteration


【解决方案1】:

是的,迭代可以在这里提供帮助。将您的值添加到列表中,然后t? 是迄今为止列表中的最后一个值;将您的 t? 引用替换为 t[-1] 给出:

t = [4.1e9]
for _ in range(3):
    eq = (
        (np.exp(U238_Decay_Constant * t[-1]) - 1)
        - (0.0167 * ((np.exp(U235_Decay_Constant * t[-1]) - 1)))
        - 0.0094
    )
    der = (U238_Decay_Constant * (np.exp(U238_Decay_Constant * t[-1]))) - (
        0.0167 * (U235_Decay_Constant * (np.exp(U235_Decay_Constant * t[-1])))
    )
    t.append(t[-1] - (eq / der))

一般原则是累加之一,您可以在其中产生重复应用函数的运行输出。所以itertools.accumulate() function 也可以在这里提供帮助:

from itertools import accumulate, chain, repeat

def u238_decay(t, _):
    eq = (
        (np.exp(U238_Decay_Constant * t) - 1)
        - (0.0167 * ((np.exp(U235_Decay_Constant * t) - 1)))
        - 0.0094
    )
    der = (U238_Decay_Constant * (np.exp(U238_Decay_Constant * t))) - (
        0.0167 * (U235_Decay_Constant * (np.exp(U235_Decay_Constant * t)))
    )
    return t - (eq / der)

series = accumulate(chain([4.1e9], repeat(None)), u238_decay)

以上产生了一系列无休止的衰减值:

>>> series = accumulate(chain([4.1e9], repeat(None)), u238_decay)
>>> next(series)
4100000000.0
>>> next(series)
4081406102.7439713
>>> next(series)
4081163259.5641546
>>> next(series)
4081163218.6509323
>>> next(series)
4081163218.650931

你可以考虑创建一个numpy universal function,这样你就可以对numpy.ufunc.accumulate() method做同样的事情。

但是,我怀疑您的公式可以重新转换为不依赖于先前的输入,而仅作为起始金额的公式和 t 作为时间,此时您可以使用完整的 numpy 矢量化计算。

【讨论】:

    【解决方案2】:

    可能会更容易阅读:

    import numpy as np
    U235_Decay_Constant = 9.72e-10
    U238_Decay_Constant = 1.54e-10
    
    
    t = [4.1e9, None, None, None]
    
    t[0] = 4.1e9
    for i in range(3):
        eq = ((np.exp(U238_Decay_Constant*t[i])-1)-(0.0167*
        ((np.exp(U235_Decay_Constant*t[i])-1)))-0.0094)
    
        der = (U238_Decay_Constant*(np.exp(U238_Decay_Constant*t[0])))-(0.0167*
        (U235_Decay_Constant*(np.exp(U235_Decay_Constant*t[0]))))
    
        t[i+1] = t[i] - (eq/der)
    
    print(t[3])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-30
      • 2014-02-18
      • 2013-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多