We solved the radioactive decay problem in the continuum limit
In fact the differential equation is for the continuum limit
We can’t formulate a differential equation for a single atom!
Discrete jump from “not decayed yet” to “decayed” is not continous
QM is not predictable we can only say something about the probability of
Need to model random processes!
Monte Carlo Methods model processes dictated by “chance”
Monte carlo methods are used when
If you have a fair coin you have:
$$P(\rm{heads}) = P(\rm{tails}) = 0.5$$
Continuum behaviour after $N$ tosses:
$$ N_{\rm{tails}}= N ,P(\rm{tails}) $$
To model a coin toss in a computer code we can use the algorithm
import random
r = random.random()
if r < 0.5:
print("Heads")
else:
print("Tails")
Tails
A computer is supposed to follow completly logical steps in a reliable and reproducible manner
How can we get random numbers out of such a system?
Two ways:
A pseudo random number generator can create a series of numbers that
Sometimes even better!
Because they are reproducible we can investigate problems more easily.
Qualities we want of a random number generator
Anything wrong with this sequence of random numbers?
0.9832267678460693 0.2203662995876763 0.5037457350292935
0.2911137865294745 0.8357817407439925 0.0419691134185419
0.5154070108633051 0.3943863586181417 0.6730444827985615
0.0742773193541438 0.5915453237049658 0.0572064848443438
0.9824507804581079 0.0322811404885930 0.7705440927755651
0.0444644149953312 0.7895013430936832 0.1347927519097241
0.7405181856832592 0.1776195737214916 0.6245760606806046
0.2650806034557952 0.5096497831548584 0.2540509628898961
0.7364134626737031 0.1886737203862982 0.5270875993230715
0.2786651187207341 0.5721228608009541 0.4686535423481123
0.5706138822082498 0.1526963541438493 0.5197948121139808
0.0886715176391272 0.5772852573553948 0.4773593278511974
0.5205314031359037 0.1930917641679141 0.6747961509818463
0.2379674540658641 0.8914451447612017 0.2354200626544225
0.7197981988398199 0.3905317988962405 0.9073705801288487
0.0928109303724942 0.7180298967997073 0.0597337035056059
0.7426005764932174 0.4088670008509029 0.8281958112697092
0.3513294745241624 0.9049702918656014 0.0785847923920087
0.5774232478735082 0.4202395825972462 0.8600639899205031
What would happen if I played head and tails using this sequence?
Anything wrong with this sequence?
0.9340324366518361 0.1942452239758620 0.8298772041601081
0.8822262494087305 0.3389889468301139 0.4509975096682632
0.0070456259245537 0.5874930203333821 0.0560788697075302
0.0009495039349679 0.6221623994563103 0.1197775721080866
0.3884797971270016 0.3792289703359487 0.0220684806817498
0.0335221851689879 0.0130903276329845 0.0002137087429244
0.2369270622811057 0.9310350222585495 0.0041682881249771
0.2927764245430143 0.2170614672860193 0.3617582811578795
0.0079083368035081 0.3352441106121863 0.0726763438695857
0.3096171944471465 0.4155532958746210 0.2313959905774670
0.1261948518760176 0.0620767795787906 0.8714511850852505
0.2055606962048173 0.2810709053139540 0.0003724732597431
0.2581675669811334 3.341114460547e-05 0.0206693607733099
0.2235653013334817 0.1423910910576281 0.0029349521483490
0.3451897478667201 0.0268970573977557 0.3106169935665632
0.0208068282004552 0.8785445710217358 0.5944101164846329
0.9157210006493821 0.0199452814420822 0.0932647062752953
0.0015673383465112 0.0766092137025405 0.6504624209078468
0.0314505521617040 0.0238920440179584 0.9114877115461886
0.0238861352694834 0.6953713549000397 0.0016861540589159
0.1491377175579094 0.1222147775922735 0.1167642156263871
0.6666119229791445 0.2265140367783565 0.6129172054284729
0.2216904236008489 0.6680512255469221 0.7771614309994124
...
Let’s histogram it …
Using the same (bad) PRNG for a while longer we get
Are the random numbers from python any good?
import matplotlib.pyplot as plt
%matplotlib inline
l = []
for i in range(100000):
l.append(random.random())
plt.hist(l);
A PNRG has a state that is modified after each call, so if you know the state of the generator you can reproduce the series of pseudo random numbers.
The random number generators often use the current time to seed the generator so two sequences are always different.
random.seed(1234)
print(random.random())
print(random.random())
random.seed(1234)
print(random.random())
print(random.random())
0.9664535356921388
0.4407325991753527
0.9664535356921388
0.4407325991753527
import numpy
sample = numpy.random.uniform(4, 9, size=(10**6))
plt.hist(sample, bins=numpy.arange(2,10, 0.1));
import numpy
sample = numpy.random.normal(3.2, 1.8, size=(10**5))
plt.hist(sample, bins=numpy.arange(-3, 10, 0.1));
import numpy
sample = numpy.random.poisson(7, size=(10**5))
plt.hist(sample, bins=numpy.arange(0.5,20.5, 1.0));
Let’s look at the fraction of heads if we simulate many coin tosses
The fraction tends to $ 1/2 $ as expected.
If we estimate the error on the fraction from our set of curves we get
This shows that the expected error on the fraction of heads is decreasing. With what power?
The scaling is $1/\sqrt{N}$
Now that we know how to use random numbers to model random process let’s revisit the radioactive decay problem we treated in the continuum limit before.
The probability per time unit of decaying is given by $1/\tau$ where $\tau$ is the mean lifetime.
$$ \frac{dN}{dt}= -\frac{N}{\tau}$$
For a simgle atom, for a small time $\Delta t$ the probability of decaying is given by:
$$p = \frac{1}{\tau} \Delta t $$
For this to be valid we need $\Delta t \ll \tau$. For larger time step we need to integrate:
$$ \frac{1}{\tau}\int_0^{\Delta t} e^{-t/\tau} dt = \left(1-e^{-\Delta t/\tau}\right)$$
We can model the life of a single nucleus by repeating the following steps many times:
Think of it as a kind of russian roulette…
Let’s use a log scale to see that we have something resembling an exponential decay:
If we increase the number of nuclei we recover the continuum limit:
The other extreme is the case of a single nucleus: