2013-07-21 2 views
1

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

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. Что здесь происходит?

+1

Почему распад изменения вероятности с течением времени? – user2357112

+1

Экспоненциальное распределение вероятностей [без памяти] (http://en.wikipedia.org/wiki/Memorylessness), поэтому вероятность распада не должна изменяться. Замечание стиля: в методе 'sim' почему вы перебираете индексы? Сделайте 'для атома в self.struct: если atom.isalive и random() Bakuriu

+0

@Bakuriu Я обычно нахожу, что это практическая практика пищи, чтобы перебирать индексы в случае, когда мне когда-либо понадобится индекс для чего-то. –

ответ

1

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

def __init__(self, halflife): 
    self.probdecay = 1 - 0.5 ** (1.0/halflife) 
    ... 
+0

Спасибо, брат. Я не химик или что-то еще, поэтому я не знаю этого;) –