Почему мой экспоненциальный спад не работает?

Я моделирую экспоненциальный спад. Почему это не работает? Вот код

from math import *
from random import random
from time import sleep

class atom():
    def __init__(self, pos):
        self.pos = pos
        self.isalive = True

class substance():
    def __init__(self, halflife):
        self.halflife = float(halflife)
        self.rate = float(log(2) / self.halflife)
        self.life = float(0)
        self.probdecay = float(0)
        self.struct = [atom(i) for i in range(100)]
        self.isalive = True
        print self.rate

    def sim(self):
        print self.probdecay
        for i in range(len(self.struct)):
            if self.struct[i].isalive:
                if random() < self.probdecay:
                    self.struct[i].isalive = False

        self.life += 1.0
        self.probdecay = 1.0 - pow(1.0 - self.rate, self.life)

    def getstr(self):
        s = ""
        for i in self.struct:
            if i.isalive:
                s += "o"
            else:
                s += " "
        return s

s = substance(5)

while s.isalive:
    s.sim()
    print s.getstr()
    sleep(1)

Вот результат

0.138629436112
0.0
oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
0.138629436112
oooooo o ooooooooooo oooooooo ooooooo o oooooooooooo oooooo oooooooo oooo ooo oooooooo  oooo   oooo 
0.258040751667
o  ooo o   oo oo ooo o    ooo o ooooo o oo  oooooo o   oooo  oo oooo oo   ooo ooo  ooo   ooo   oo   
0.360898143882
   o o     oo     oo o    ooo   ooo o   oo  o o oo     o o    o    o o    ooo o o   oo   o o   oo   
0.449496473814
   o        o        o    o o    o      o     o        o      o      o     o                   oo   
0.525812467226
   o        o                    o      o     o                      o                              
0.591548817506
            o                           o                                                           
0.648172174615

0.696945867656

0.738958091134

0.775146183762

Очевидно, что это не экспоненциальный распад с периодом полураспада 5. Что здесь происходит?


person Thor Correia    schedule 21.07.2013    source источник
comment
Почему вероятность распада меняется со временем?   -  person user2357112 supports Monica    schedule 21.07.2013
comment
Экспоненциальное распределение вероятностей без памяти, поэтому вероятность затухания не должна меняться. Примечание к стилю: почему в методе sim вы перебираете индексы? Сделайте for atom in self.struct: if atom.isalive and random() < self.probdecay: atom.isalive = False.   -  person Bakuriu    schedule 21.07.2013
comment
@Bakuriu Обычно я считаю пищевой практикой перебирать непристойности на случай, если мне когда-нибудь понадобится использовать индекс для чего-то.   -  person Thor Correia    schedule 22.07.2013


Ответы (1)


Похоже, вы перепутали вероятность распада частицы на определенном шаге и вероятность распада частицы на заданном шаге. Вероятность распада частицы на любом заданном шаге одинакова, независимо от того, какой это шаг, а вероятность распада частицы на заданном шаге монотонно возрастает . Вместо постепенного увеличения probdecay установите его один раз при инициализации substance:

def __init__(self, halflife):
    self.probdecay = 1 - 0.5 ** (1.0 / halflife)
    ...
person user2357112 supports Monica    schedule 21.07.2013
comment
Спасибо, бро. Я не химик или что-то в этом роде, поэтому я не знаю этого ;) - person Thor Correia; 22.07.2013