我可以使用循环使迭代更容易吗?

时间:2018-11-18 14:54:10

标签: python list loops numpy iteration

我是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)

2 个答案:

答案 0 :(得分: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))

一般原理是 accumulation 之一,您可以在其中生成函数重复应用程序的运行输出。因此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向量化计算

答案 1 :(得分:1)

可能更容易阅读为:

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])