Могу ли я сделать эту итерацию проще, используя цикл?

Поэтому я относительно новичок в 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 как время, и в этот момент вы можете использовать полностью нумерованные векторизованные вычисления.


Есть идеи?

10000