Autor |
Beitrag |
JerryW
Hält's aus hier
Beiträge: 2
|
Verfasst: Sa 15.10.11 10:05
Hallo,
ich möchte gerne "realistischen" radioaktiven Zerfall für einzelne Atome simulieren und stehe vor dem Problem, wie ich das modellieren soll. Ich möchte also einen radioaktiven Zerfall realistisch simulieren, wenn ich die Zerfallskonstante vorgebe (z.B. lambda = 0,07 1/s) Meine anfängliche Idee, jeden Atomkern einzeln zu betrachten, ist natürlich auf die enorme Atommenge unvorstellbar. Deshalb suche ich gerade eine Idee, wie man das Problem anders lösen kann. Meine Überlegung bisher:
Ich habe beispielsweise eine Menge eines radioaktiven Materials, das aus 100.000 Atomen besteht (ich weiß, das ich wenig, aber als Berechnungsgrundlage reicht das erstmal). Jetzt könnte ich jede Sekunde (z.B. über einen Timer) über eine Schleife alle noch aktiven Kerne ansteuern und einen Zufallsgenerator starten, der für jedes einzelne Atom überprüft, ob es in diesem Moment zerfällt oder nicht. Ist es zerfallen, verringert sich die übrig bleibende Atomanzahl um 1. Für wenige Atome ist das kein Problem und führt auch zum gewünschten Ergebnis. Bei sehr vielen Atomen lässt sich das aber natürlich nicht realisieren.
Jetzt meine Frage: habt ihr eine Idee, wie man das machen kann, dass ich eine hohe Anzahl an Atomen vorgebe und nach jeder Sekunde abhängig von der Zerfallskonstante die aktuelle Zahl der noch aktiven Atomkerne erhalte? Damit meine ich jetzt nicht über die Berechnung mit dem Zerfallsgesetzt, weil das liefert mir ja die noch zu erwartende Anzahl aktiver Atome. Ich benötige eine Anzahl, die zufällig um diesen berechenbaren Mittelwert liegt. Ich hoffe, ich habe mich verständlich ausgedrückt
Habt Ihr eine Idee, wie ich das lösen könnte?
Grüße,
Jerry
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Sa 15.10.11 10:14
Was du machen könntest, du berechnest den Zerfall in "Gruppen". D.h. wenn du 100.000 Atome hast, dann rechnest du 1000 aus, ob ein Zerfall eingetreten ist, und wenn ja, dann zerfallen 100 auf einmal. Dann kannst du aber auch gleich nur 1000 Atome vorgeben
Das Problem ist, dass ja in echt jedes Atom vermutlich unabhängig von den andren zerfällt. Unabhängiger Zufall, d.h. du muss für jedes einzeln berechnen.
Es gäbe natürlich noch Möglichkeiten, dass es nur so aussieht als würdest du es simulieren. Z.B. rechnest du per Zerfallsgesetz aus wieviele noch da sind und wieviele nächste Sekunde noch da sind und lässt dann in der Sekunde die Differenz +- x zerfallen. Mit Simulation hat das freilich wenig zu tun...
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
mandras
      
Beiträge: 431
Erhaltene Danke: 107
Win 10
Delphi 6 Prof, Delphi 10.4 Prof
|
Verfasst: Sa 15.10.11 12:26
Es geht ja glaub ich darum daß bei der Simulation die "e"-Funktion rauskommt
Wenn es "realistisch" sein soll bleibt nur für jedes Atom zu prüfen ob es gerade zerfallen ist oder nicht, da der Zerfall ja wirklich ein Einzelevent eines Atomkerns ist, völlig unabhängig von der Umgebung und der Anzahl der vorhandenen Atome (ja, das ist idealisiert, in der Realität hängt der Zerfall tatsächlich noch von anderen Faktoren ab).
Ansonsten um es programmtechnisch zu meistern:
Anhand der Zeit und der vorh. Anzahl Atome N ermittelst du wie viele zerfallen sein sollten (z.B. n) und löscht per Zufallsgenerator genau n Stück aus Deiner Liste.
Aber wie gesagt, das impliziert ja die Abhängigkeit von N (und nimmt so das Ergbnis vorweg)
|
|
Yaddle
Hält's aus hier
Beiträge: 9
|
Verfasst: Do 10.11.11 17:06
Da du dich hier in der Kernphysik befindest und nur mit Wahrscheinlichkeiten arbeiten kannst, würde ich an deiner Stelle ausrechnen, wie hoch die Wahrscheinlichkeit für einen Kern ist, dass er zerfällt. Du weißt bestimmt, dass man Zerfallsprozesse durch Exponentialfunktionen beschreibt. n(t) = n0 * b^t. Auf die konkrete Gleichung kannst du kommen, wenn du die Halbwertszeit deiner Atome kennst, bzw. sie determinierst. n0 entspräche deiner gesamten Atomanzahl. t ist die Variable und b ergäbe sich dann als 0.5 * n0 = n0 * b ^Halbwertszeit
=> 0.5 = b ^ Halbwertszeit. Dann musst du nur noch die entsprechende Wurzel aus 0,5 ziehen und hast dein b.
b ist der relative Anteil der Teilchen, der pro Sekunde zerfällt, also deine Zerfallswahrscheinlichkeit. Ich persönlich verstehe nicht warum du umbedingt jedes einzeln berechnen willst, da es bei 100000 Atomen eigentlich eh egal ist, ob Atom a oder Atom b zerfallen ist.
Also wie oben dargestellt, solltest du dich auf jeden Fall durch die Exponentialgleichung nähern. Ob du jedes Atom einzeln zerfallen lassen willst ist dann deine Entscheidung.
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Do 10.11.11 18:38
Hallo,
der Ansatz von Yaddle gibt das Ergebnis ja haargenau vor, das ist unhübsch.
Ich stelle mir das beispielsweise so vor.
Wenn theoretisch 117 Atome zerfallen sein müssten, dann macht man eine Streuung ähnlich einer Glockenkurve um diese 117 herum.
Ach, wikepedia hilft.
de.wikipedia.org/wik...le_zeitliche_Abnahme
mit den Schwankungen
de.wikipedia.org/wik...stische_Schwankungen
also Poissonverteilung,aber:
Zitat: | Symmetrie [Bearbeiten]
Die Poisson-Verteilung Pλ hat für kleine Mittelwerte λ eine stark asymmetrische Gestalt. Für größer werdende Mittelwerte wird Pλ symmetrischer und lässt sich für λ > 30 in guter Näherung durch die Gauß-Verteilung darstellen. |
Solange man also mehr als Lambda= 30 Zerfälle erwartet, kann man die Gaußverteilung benutzen und dann einen zufälligen Wert wählen.
Dazu braucht es eine Umkehrfunktion, damit ich aus einer Zufallszahl aus dem Bereich 0..1 = Fläche unter der Glockenkurve , die umgerechnete Zerfallszahl wird.
der Wert 0,5 entspräche genau dem Erwartungswert mue = lambda.
0,14=0,5-0,36 entspräche Erwartungswert-sigma = lambda-Wurzel(Lambda) bei 30 = 24,55
Also müsste man das Integral der Dichtefunktion von - unendlich bis x als Tabelle in kleinen Schritten anlegen.
Zum Beispiel 0,5..1 in 0,001 Schritten da es symmetrisch ist siehe.
Dazu kann man ja die Tabelle de.wikipedia.org/wik...dardnormalverteilung
umrechnen.
Bekäme man 0,84 als Wert würde in der Tabelle +1,00 als Vielfachheit von sigma stehen.
Der Wert wäre Erwartungswert +sigma hier also 30+Wurzel(30)=35,47
Bekäme man 0,99534 als Wert, würde in der Tabelle 2,60 als Vielfachheit von sigma stehen.
Der Wert wäre Erwartungswert +sigma hier also 30+2,60*Wurzel(30)= 44,24
Jetzt berechnest Du eben immer de Anzahl lambda der Zerfälle nach Formel.
Per Zufallszahl erhälst Du eine Vielfachheit von sigma= Wurzel( Lambda) und berechnest eben Deine wahren Zerfälle. Diesse spiel läft dann weiter bis es weniger als ein hundert sind und gut ist.
Bei konstanten Zeitabständen zerfallen ja immer x % vom gesamten = Erwartungswert also liesse sich das ganz schnell mit etwas Zufall simulieren.
Gruß Horst
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Do 10.11.11 22:56
Hallo,
Es gibt doch schon Fertiges um die Umkehrfunktion der aufsummierten Verteilungsfunktion der Standardnormalverteilung
home.online.no/~pjacklam/notes/invnorm/
und eine Delphi Implementierung
home.online.no/~pjac...mccormick/icnorm.pas
Ich habe es mal zusammengefügt und mit einer Halbwertszeit von 20000 gerechnet und den Zeitpunkt der Unterschreitung der jeweiligen nächsten Hälfte ausgegeben.
Die Abweichung durch den Zufall sind aber nicht allzu groß.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| Anzahl Startteilchen :4000000000000000000 Zerfallsrate : 28853.900818 Zeitschritt : 1.761102 Teilchen Zeit relative Anzahl/Startanzahl 1999941821429194691 19999.078228 0.49999999 999941822977905392 39999.917558 0.25000000 499986883951449921 59998.995786 0.12500000 249986170125587534 79999.835116 0.06250000 124997078351718219 99998.913344 0.03125000 62496721300924186 119999.752675 0.01562500 31249359015550997 139998.830903 0.00781250 15624224990150054 159999.670233 0.00390625 7812362172225107 179998.748461 0.00195312 3906067409437409 199999.587791 0.00097656 1953096129085077 219998.666019 0.00048828 976519663736823 239999.505349 0.00024414 488275463745699 259998.583577 0.00012207 244130625669631 279999.422908 0.00006104 122069221777148 299998.501136 0.00003052 61032835641411 319999.340466 0.00001526 30517390864625 339998.418694 0.00000763 15258248747979 359999.258024 0.00000381 7629366425927 379998.336252 0.00000191 3814574063448 399999.175582 0.00000095 .... |
Ich hätte mal einen kürzeren Zeitschritt probieren sollen, aber das Programm hängt sich dann in einer Endlosschleife auf.
Gruß Horst
Einloggen, um Attachments anzusehen!
Zuletzt bearbeitet von Horst_H am Fr 11.11.11 08:51, insgesamt 1-mal bearbeitet
|
|
Tranx
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Fr 11.11.11 03:46
Das Problem bei der Simulation ist immer, nicht durch die Art der Annahme das Ergebnis vorweg zu nehmen. Wenn ich schon davon ausgehe, dass eine bestimmte Anzahl Atome im Zeitraum t zerfallen, dann kann ich gleich die e-Funktion nehmen. Dann brauche ich das nicht zu simulieren. Die Annahme bestimmt eben das Ergebnis. Man muss erst einmal schauen, wieso bei 100.000 Atomen mit der Halbwertzeit von - sagen wir 100 s - in den ersten 100 s 50.000 zerfallen und den zweiten eben nicht wieder 50.000, sondern nur 25.000 und so weiter. Also sind die Zerfälle nicht unabhängig von den Bedingungen der einzelnen Atome. Außerdem eine interessante Frage ist dabei. Es gibt 50.000 Atome mit der Lebensdauer 50 s (Mittel), 25.000 Atome mit der mittleren Lebensdauer von 150 s... d.h. es gibt Atoime, die sehr kurzlebig sind und welche, die sehr langlebig sind. Das ist ein interessanter Aspekt dabei. Ich glaube, ohne ein gründliches Studiums des Kernzerfalls geht da gar nichts.
_________________ Toleranz ist eine Grundvoraussetzung für das Leben.
Für diesen Beitrag haben gedankt: Martok
|
|
Delphi-Laie
      
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: Fr 11.11.11 13:36
Das Grundproblem ist, daß man zur Simulation des radiaktiven Zerfalles (und anderer Abkling- bzw. Sättigungsprozesse) eine exponentialverteilte Zufallsgröße benötigt.
Delphie stellt mit seinem Zufallsgenerator jedoch nur eine gleichverteilte bereit.
Das Problem grenzt sich also dahingehend ein, daß man die gleichverteilte in eine exponentielle Verteilung transformieren muß. (Aus der einen eine andere "basteln" oder gar "zaubern"). Ob das grundsätzlich möglich ist, ist mir unbekannt.
|
|
mandras
      
Beiträge: 431
Erhaltene Danke: 107
Win 10
Delphi 6 Prof, Delphi 10.4 Prof
|
Verfasst: Fr 11.11.11 13:57
Delphi-Laie hat folgendes geschrieben : | Das Grundproblem ist, daß man zur Simulation des radiaktiven Zerfalles (und anderer Abkling- bzw. Sättigungsprozesse) eine exponentialverteilte Zufallsgröße benötigt. |
Ich meine nein.
Wenn man "von Grund auf" simulieren möchte betrachtet man erstmal ein einzelnes Atom.
Dies zerfällt innerhalb einer gegebenen Zeitspanne mit einer gewissen Wahrscheinlichkeit.
Falls es nicht zefällt wird in der Simulation irgendwann in der Zukunft nochmal geprüft.
Auch hier ist die Wahrscheinlichkeit die gleiche bei gleicher angenommener Zeitspanne ("die Atome altern nicht")
Insofern meine ich ein gleichverteilter Zufallsgenerator (Yes/No) ist anzuwenden.
Daß hinterher eine e-Funktion für den Zerfall herauskommt liegt dann daran daß
ein einmal zerfallenes Atom dauerhaft aus der Simulation wegfällt.
|
|
Gammatester
      
Beiträge: 328
Erhaltene Danke: 101
|
Verfasst: Fr 11.11.11 14:20
Delphi-Laie hat folgendes geschrieben : | Das Grundproblem ist, daß man zur Simulation des radiaktiven Zerfalles (und anderer Abkling- bzw. Sättigungsprozesse) eine exponentialverteilte Zufallsgröße benötigt. |
Falsch! Der radioaktiven Zerfall gehorcht keiner Exponentialverteilung, sondern einer Poissonverteilung, oder näherungsweise einer Normalverteilung (wie es Horst_H gemacht hat).
|
|
Delphi-Laie
      
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: Fr 11.11.11 14:21
Und wie groß soll die "gewisse Zeitspanne" gewählt werden, mandras?
Wählt man "zufällig" die Halbwertszeit, dann ist nach dieser Zeit "plötzlich" die Hälfte der Atome weg - kurz vorher waren noch alle vorhanden. Das kann man sooft wiederholen, bis alle Atome zerfallen sind.
Das ist dann aber extrem ruckartig und hat mit der Simulation eines annähernd kontinuierlichen Prozesses nichts mehr gemein.
Also: Wesentlich kleinere Zeiträume wählen. Bei Wahrscheinlichkeiten dicht an 1 bzw. 0 muß man dann aber aufpassen, daß sich nicht Rechenungenauigkeiten unangenehm bemerkbar machen.
Moderiert von Narses: Beiträge zusammengefasst
Gammatester hat folgendes geschrieben : | Falsch! Der radioaktiven Zerfall gehorcht keiner Exponentialverteilung, sondern einer Poissonverteilung, oder näherungsweise einer Normalverteilung (wie es Horst_H gemacht hat). |
Wir reden aneinander vorbei: Ich meine die Anzahl der Restatome. Diese ist zwar endlich und impliziert damit eigentlich eine diskrete Verteilung, allerdings so riesig, daß eine Exponentialverteilung als eine stetige Verteilung dennoch eine sehr gute Annäherung ist.
Zuletzt bearbeitet von Delphi-Laie am Fr 11.11.11 14:31, insgesamt 1-mal bearbeitet
|
|
Gammatester
      
Beiträge: 328
Erhaltene Danke: 101
|
Verfasst: Fr 11.11.11 14:40
Moderiert von Narses: Komplett-Zitat des letzten Beitrags entfernt.
Mag sein, aber: Wenn Du schon reinsteckst, was durch Simulation erst zeigen willst, bringt das Ganze nicht viel. Daß die Anzahl der Atome exponentiell abnimmt (dies ist keine Exponentialverteilung im Sinne von Wahrscheinkeitsverteilungen!) wird ja nicht bezweifelt, sondern soll herauskommen, wenn man die richtige Zerfallswahrscheinlichsverteilung (Poisson) reinsteckt.
|
|
Delphi-Laie
      
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: Fr 11.11.11 14:53
Gammatester hat folgendes geschrieben : | Moderiert von Narses: Komplett-Zitat des letzten Beitrags entfernt.
Mag sein, aber: Wenn Du schon reinsteckst, was durch Simulation erst zeigen willst, bringt das Ganze nicht viel. |
Schau mal in den Titel dieser Diskussion: Es soll radioaktiver Zerfall simuliert werden und nicht, wie eine Exponential-/Poisson- oder was weiß ich Verteilung über Wahrscheinlichkeiten "entsteht".
Wenn die Anzahl der Atome nicht über eine Exponentialverteilung abnimmt, über welche dann?
Edit: In der peinlichen Internetenzyklopädie findet man unter "Exponentialverteilung" übrigens auch einen funktionalen Zusammenhang mit der stetigen Gleichverteilung.
|
|
Gammatester
      
Beiträge: 328
Erhaltene Danke: 101
|
Verfasst: Fr 11.11.11 15:09
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Fr 11.11.11 15:58
Hallo,
wie soll man einem Atom denn "ansehen", wann es zerfällt.
Man kennt nur die statistisch belegte Gesetzmäßigkeit für eine große Anzahl von Atomen.
Ich könnte natürlich jedem einzelnen Atom einen Zerfallszeitpunkt mitgeben, aber wie sollte ich diesen bestimmen.
Dann baue ich auch das Zerfallsgesetz ein.
Ich nehme eine Zufallszahl 0..1 und berechne daraus den Zerfallszeitpunkt-
Zufall = 1-e(-t/tau)-> t=-ln(1-Zufall)*tau ( es ginge auch ln(Zufall)*tau, wenn Zufall gleichverteilt ist)
Diese Zahlen sortiere ich nach t und zähle dann einfach durch.
Um das sortieren zu sparen erstelle ich ein Feld für jedes 0.01 x tau im Bereich bis 20 x tau. (e⁻20 ist sehr klein)
Also Zufall erzeugen -> nr = int(ln(Zufall) x 100 + 0,5) bilden und den Feldeintrag[nr] um 1 erhöhen.
Etwa so:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160:
| {$IFDEF FPC} {$Mode delphi} {$OPTIMIZATION ON} {$OPTIMIZATION RegVar} {$ELSE} {$APPTYPE Console} {$ENDIF}
uses sysutils; const N0 = 100000000; Skal = 16384; Cnt = 20*Skal; Zerfallsrate = 20000/ln(2); var Feld, sumfeld : array[0..Cnt] of integer; i ,Reste: integer; procedure Init; begin fillchar(Feld,SizeOF(Feld),#0); fillchar(sumFeld,SizeOF(Feld),#0); Reste := 0; randomize; end;
function Fill:longInt; var i,nr :longint; begin Result := 0; For i := 1 to N0 do begin nr := trunc((-Skal)*ln(random())+0.5); if nr < Cnt then inc(Feld[nr]) else inc(Result); end; end;
procedure SumUp; var i,sum :longint; begin sum := Feld[0]; For i := 1 to Cnt do begin inc(sum,Feld[i]); sumFeld[i] := sum; end; end;
begin Init; Reste:=Fill; SumUp; writeln (' x-fach'); writeln (' Zerfalls'); writeln (' rate Zerfaelle'); For i := 0 to Cnt do begin IF (i mod (Skal div 4)) = 0 then writeln(i*(1/Skal):8:3,SumFeld[i]:10); end; writeln; writeln ( 'Restatome :',Reste); readln; end. |
Natürlich stecke ich dort eine Exponentialverteilung rein.
Aber eine Aussage, wie in dt sind 0,2% zerfallen, macht genau das auch.
Zitat: | Jetzt könnte ich jede Sekunde (z.B. über einen Timer) über eine Schleife alle noch aktiven Kerne ansteuern und einen Zufallsgenerator starten, der für jedes einzelne Atom überprüft, ob es in diesem Moment zerfällt oder nicht. |
Also if random()< 0.2% dann zerfällt es.
Das ist die Zinseszinsformel mit q < 0,
de.wikipedia.org/wik...l#Zinseszinsrechnung der Term (1+q)^n == e^(ln(1+q)*n)
Bei grossen Zahlen ist alles gleichverteilt
Der Vorteil dieser Version gegenüber der des Threaderstellers ist, dass nur einmal der Zerfallszeitpunkt bestimmt wird, während seine Version nach jedem dt jedes verbliebene Atom auf Zerfall prüfte.
Das sind k+k*q+k*q² ... ==k*(q^(n+1)-1)/(q-1) Aufrufe
Wenn q = 1-0,2% = 0,998 ist und n = 1000 und k = 1e5 sind das 432* k = 4.32e7 Zufallszahlen.
Jetzt weiß ich, warum der Threadersteller verzweifelt ist  . Das braucht ja ewig,
Jetzt aber die Frage aller Fragen:
Wie groß ist die Abweichung zwischen diesen beiden Versionen Zerfalls.zip und dieser hier und ist dieser signifikant.
Es gibt da sicher Tests für.
Gruß Horst
|
|
Delphi-Laie
      
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: Fr 11.11.11 16:46
|
|
|