Поэтому я относительно новичок в python, но я использовал циклы в предыдущих программах, которые я сделал, но они были относительно простыми. Мне было интересно, был ли метод, связанный с циклом или каким-либо другим способом сделать эту итерацию более кратким.
В принципе, есть способ для меня иметь переменную с именем 't', которая содержит значения для t1, t2 и t3 в виде списка, который затем используется в 'eq' и 'der' вместо копирования и вставки одного и того же фрагмента кода ?
Я уже пытался найти ответ здесь и в других местах, но решения, которые я нашел до сих пор, похоже, не работают с тем, что у меня есть / я не питон, достаточно грамотный, чтобы понять их.
Заранее спасибо.
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 ответа
Может быть, немного легче читать:
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])
Да, итерация может помочь здесь. Добавьте свои значения в список, затем 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()
может помочь здесь:
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, чтобы вы могли сделать то же самое с numpy.ufunc.accumulate()
.
Тем не менее, я подозреваю, что ваша формула может быть переклассифицирована, чтобы не зависеть от предыдущего ввода, но только как формула начального количества и t
как время, и в этот момент вы можете использовать полностью нумерованные векторизованные вычисления.