2013-07-21 69 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'方法中,爲什麼要遍歷索引?做'for atom中的原子:如果atom.isalive和random() Bakuriu

+0

@Bakuriu我通常會發現它的食品實踐迭代indecies萬一我需要使用索引的東西。 –

回答

1

看起來你混了個顆粒上腐爛某一步的概率,粒子通過的規定工序的衰減的概率。任何給定步驟的粒子衰減的概率是相同的,而不管它是哪一步,而粒子已經衰減的概率是給定的步驟是單調增加的。取而代之的逐漸增加probdecay,將它設置一次,當你初始化substance

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

感謝兄弟。我不是化學家或其他任何人,所以我不知道這些東西;) –