我是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)
答案 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])