Mal 'n bisschen Physik: Rutherfordscher Streuversuch

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Olaf
Beiträge: 117
Registriert: 20.04.2006 14:51
Wohnort: 66606 St.Wendel (Niederlinxweiler, Dr.Albert-Schweitzer-Str.9)
Kontaktdaten:

Mal 'n bisschen Physik: Rutherfordscher Streuversuch

Beitrag von Olaf »

Hab mal ne Simulation für den Rutherfordschen Streuversuch gemacht.
Mit seinen Streuversuchen (Goldfolienbeschuss mit Alphateilchen) hatte Rutherford 1911 die Entdeckung gemacht,
dass Atome keine kompakten Kugeln sind, wie bisher angenommen (Daltonsches Atommodell), sondern zum größten
(räumlichen) Teil aus Nichts bestehen, was sich danach mit dem Kern-Hülle-Modell erklären ließ.
Aus Performancegründen werden jedoch in der Simulation die abstoßenden Kräfte zwischen den einzelnen Alphateilchen vernachlässigt.

Code: Alles auswählen

Enumeration
	#Window
	#Start
	#Stop
	#Pause
	#Clear
	#ISpeed
	#Speed
	#TSpeed
	#IMax
	#Max
	#TMax
	#Display
	#Screen
EndEnumeration

#Au_Ladung=79
#Alpha_Masse=4
#Alpha_Ladung=2
#DELTA_t=0.004
#Gravsonst=50
#Alpha_SpotX=0
#Alpha_SpotY=250

Structure Alpha
	x.d
	y.d
	vx.d
	vy.d
EndStructure

Global Speed.l,Max.l,NumberOfAu.l
NumberOfAuPerLine=16
NumberOfAu=3*NumberOfAuPerLine
Global NewList Alpha.Alpha()
Global Dim Au.Point(NumberOfAu)
Global Dim Screen.l(500)
Speed=20
Max=20
Global Drawing.l

Procedure DeltaPosition(*Alpha.Alpha,Au_x,Au_y,*Save.Alpha)
	With *Alpha
	Alpha_x.d=\x
	Alpha_y.d=\y
	Alpha_vx.d=\vx
	Alpha_vy.d=\vy
	EndWith
	r.d=Sqr((Alpha_x-Au_x)*(Alpha_x-Au_x)+(Alpha_y-Au_y)*(Alpha_y-Au_y))
	F.d=#Gravsonst*#Alpha_Ladung*#Au_Ladung/(r*r)
	Fx.d=F*(Alpha_x-Au_x)/r
	Fy.d=F*(Alpha_y-Au_y)/r
	ax.d=Fx/#Alpha_Masse
	ay.d=Fy/#Alpha_Masse
	delta_vx.d=ax*#DELTA_t
	delta_vy.d=ay*#DELTA_t
	delta_x.d=(Alpha_vx+delta_vx)*#DELTA_t
	delta_y.d=(Alpha_vy+delta_vy)*#DELTA_t
	With *Save
		\x+delta_x
		\y+delta_y
		\vx+delta_vx
		\vy+delta_vy
	EndWith
EndProcedure

Procedure CalcNewPosition(*Alpha.Alpha)
	Save.Alpha
	For Au=0 To NumberOfAu
		DeltaPosition(*Alpha,Au(Au)\x,Au(Au)\y,@Save)
	Next Au
	With *Alpha
		\x+Save\x
		\y+Save\y
		\vx+Save\vx
		\vy+Save\vy
	EndWith
EndProcedure

Procedure Simulation()
	ClearList(Alpha())
	For Screen=0 To 500
		Screen(Screen)=0
	Next Screen
	Repeat
		If CountList(Alpha())<Max
			AddElement(Alpha())
			DiffX=Random(20)-10
			Alpha()\x=#Alpha_SpotX
			Alpha()\y=#Alpha_SpotY+DiffX
			Streuung.d=DiffX/80*Random(20)/20
			DiffV=Random(5)
			Alpha()\vx=Cos(ATan(Streuung))*Speed*(5+DiffV)/10
			Alpha()\vy=Sin(ATan(Streuung))*Speed*(5+DiffV)/10
		EndIf
		ResetList(Alpha())
		While NextElement(Alpha())
			CalcNewPosition(Alpha())
			If Alpha()\x>=700 Or Alpha()\y<=0 Or Alpha()\y>=500 Or Alpha()\x<0
				If Alpha()\y<=500 And Alpha()\y>=0 And Alpha()\x>=700
					Screen(Int(Alpha()\y))+1
				EndIf
				DeleteElement(Alpha())
				If CountList(Alpha())<Max
					AddElement(Alpha())
					DiffX=Random(20)-10
					Alpha()\x=#Alpha_SpotX
					Alpha()\y=#Alpha_SpotY+DiffX
					Streuung.d=DiffX/80*Random(20)/20
					DiffV=Random(5)
					Alpha()\vx=Cos(ATan(Streuung))*Speed*(5+DiffV)/10
					Alpha()\vy=Sin(ATan(Streuung))*Speed*(5+DiffV)/10
				EndIf
			EndIf
		Wend
		StartDrawing(ImageOutput(#Display))
		Drawing=1
		Box(0,0,700,500,0)
		ResetList(Alpha())
		While NextElement(Alpha())
			Circle(Alpha()\x,Alpha()\y,2,RGB(255,0,0))
		Wend
		For Au=0 To NumberOfAu
			Circle(Au(Au)\x,Au(Au)\y,4,RGB(255,255,0))
		Next Au
		StopDrawing()
		Drawing=0
		StartDrawing(ImageOutput(#Screen))
		Drawing=1
			Box(0,0,70,500,16777215)
			For Screen=0 To 500
				Line(69,Screen,-Screen(Screen),0,RGB(255,0,0))
			Next Screen
		StopDrawing()
		Drawing=0
		SetGadgetState(#Display,ImageID(#Display))
		SetGadgetState(#Screen,ImageID(#Screen))
		Delay(4)
	ForEver
EndProcedure

Au1=Round(NumberOfAu/3,0)-1
Au2=NumberOfAu-Round(NumberOfAu/3,0)
StepAu=Int(500/(Au1+2))
For Au=0 To Au1
	Au(Au)\x=550
	Au(Au)\y=StepAu*(Au+1)
Next Au
For Au=Au1+1 To Au2
	Au(Au)\x=580
	Mod=(NumberOfAu+1)%3+1
	Au(Au)\y=StepAu*(Au-Au1-1)+Int(StepAu/Mod)
Next Au
For Au=Au2+1 To NumberOfAu
	Au(Au)\x=610
	Au(Au)\y=StepAu*(Au-Au2)
Next Au

OpenWindow(#Window,0,0,800,600,"Rutherfordscher Streuversuch",#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
CreateImage(#Display,700,500)
StartDrawing(ImageOutput(#Display))
	Box(0,0,700,500,0)
	For Au=0 To NumberOfAu
		Circle(Au(Au)\x,Au(Au)\y,4,RGB(255,255,0))
	Next Au
StopDrawing()
CreateImage(#Screen,70,500)
StartDrawing(ImageOutput(#Screen))
	Box(0,0,70,500,16777215)
StopDrawing()
	CreateGadgetList(WindowID(#Window))
		ImageGadget(#Display,10,10,700,500,ImageID(#Display),#PB_Image_Border)
		ImageGadget(#Screen,720,10,70,500,ImageID(#Screen),#PB_Image_Border)
		TextGadget(#ISpeed,10,530,90,20,"Geschwindigkeit :")
		TrackBarGadget(#Speed,110,520,440,20,1,50,#PB_TrackBar_Ticks)
		TextGadget(#TSpeed,110,540,440,20,"Min"+Space(132)+"Max")
		TextGadget(#IMax,10,570,90,20,"Anzahl :")
		TrackBarGadget(#Max,110,560,440,20,1,100,#PB_TrackBar_Ticks)
		TextGadget(#TMax,110,580,440,20," 1"+Space(137)+"100")
		ButtonGadget(#Start,560,520,110,30,"Start")
		ButtonGadget(#Stop,560,560,110,30,"Stop"):DisableGadget(#Stop,1)
		ButtonGadget(#Pause,680,520,110,30,"Pause"):DisableGadget(#Pause,1)
		ButtonGadget(#Clear,680,560,110,30,"Löschen"):DisableGadget(#Clear,1)
		SetGadgetState(#Speed,Speed)
		GadgetToolTip(#Speed,Str(Speed))
		SetGadgetState(#Max,Max)
		GadgetToolTip(#Max,Str(Max))
Repeat
	Event=WaitWindowEvent()
	Select Event
		Case #PB_Event_Gadget
			Select EventGadget()
				Case #Start
					Simulation=CreateThread(@Simulation(),0)
					DisableGadget(#Start,1)
					DisableGadget(#Stop,0)
					DisableGadget(#Pause,0)
					DisableGadget(#Clear,1)
					Pause=0
				Case #Stop
					If IsThread(Simulation)
						KillThread(Simulation)
						If Drawing=1
							StopDrawing()
						EndIf
					EndIf
					DisableGadget(#Start,0)
					DisableGadget(#Stop,1)
					DisableGadget(#Pause,1)
					DisableGadget(#Clear,0)
					Pause=0
				Case #Speed
					Speed=GetGadgetState(#Speed)
					GadgetToolTip(#Speed,Str(Speed))
				Case #Max
					Max=GetGadgetState(#Max)
					GadgetToolTip(#Max,Str(Max))
				Case #Pause
					If Pause=0
						Pause=1
						PauseThread(Simulation)
						If Drawing=1
							StopDrawing()
						EndIf
						StartDrawing(ImageOutput(#Display))
							Box(8,8,4,12,16777215)
							Box(16,8,4,12,16777215)
						StopDrawing()
						SetGadgetState(#Display,ImageID(#Display))
					Else
						Pause=0
						ResumeThread(Simulation)
					EndIf
				Case #Clear
					StartDrawing(ImageOutput(#Display))
						Box(0,0,700,500,0)
						For Au=0 To NumberOfAu
							Circle(Au(Au)\x,Au(Au)\y,4,RGB(255,255,0))
						Next Au
					StopDrawing()
					StartDrawing(ImageOutput(#Screen))
						Box(0,0,70,500,16777215)
					StopDrawing()
					SetGadgetState(#Display,ImageID(#Display))
					SetGadgetState(#Screen,ImageID(#Screen))
					DisableGadget(#Clear,1)
			EndSelect
	EndSelect
Until Event=#PB_Event_CloseWindow
CloseWindow(#Window)
End
PB 4.xx (Windows & Linux & Mac OS X)
Treffen sich 2 Kurven in der Unendlichkeit. Sagt die eine zur anderen: "Hau ab aus meinem Definitionsbereich oder ich leite dich ab!"
Darauf die andere: "Mach nur! Ich bin die e-Funktion." :lol:
Benutzeravatar
Macros
Beiträge: 1365
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag von Macros »

Warum werden deine Alphateilchen immer langsamer, bis sie schließlich umkehren, falls die Startgeschwindigkeit zu klein ist?
Bild
Benutzeravatar
Olaf
Beiträge: 117
Registriert: 20.04.2006 14:51
Wohnort: 66606 St.Wendel (Niederlinxweiler, Dr.Albert-Schweitzer-Str.9)
Kontaktdaten:

Beitrag von Olaf »

Wenn die Geschwindigkeit zu gering ist, reicht die Beschleunigung durch die absoßenden Kräfte zwischen Goldkernen und Alphateilchen
aus, um die Alphateilchen wieder zu "verscheuchen".
PB 4.xx (Windows & Linux & Mac OS X)
Treffen sich 2 Kurven in der Unendlichkeit. Sagt die eine zur anderen: "Hau ab aus meinem Definitionsbereich oder ich leite dich ab!"
Darauf die andere: "Mach nur! Ich bin die e-Funktion." :lol:
Benutzeravatar
Macros
Beiträge: 1365
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag von Macros »

Aber die Atomkerne würden die Teilchen doch erst abstoßen, wenn diese ihnen sehr nahe sind (näher als die halbe Distanz zischen 2 Kernen),

oder liege ich falsch?
Bild
Benutzeravatar
Olaf
Beiträge: 117
Registriert: 20.04.2006 14:51
Wohnort: 66606 St.Wendel (Niederlinxweiler, Dr.Albert-Schweitzer-Str.9)
Kontaktdaten:

Beitrag von Olaf »

@Macros:
Bei Metallkernen (hier Gold) is das'n bisschen anders. Die bevorzugen die dichtestmögliche Anordnung.
Ausserdem halten die Goldatome ja durch die gemeinsamen Hüllenelektronen (Atombindungen) zusammen.
Des Weiteren ist der Vorfaktor, der in der Berechnung der abstoßenden Kräfte vorkommt übermäßig hoch gewählt,
wodurch die starke Ablenkung der Alphateilchen zu erklären ist (bei nem niedrigeren Faktor wäre die Simulation
weniger interessant, da die meisten Alphateilchen glatt durchfliegen würden).
Ausserdem waren es ja im echten versuch einige tausend Goldatomschichten.
Gewisse Faktoren wurden also nicht maßstabsgetreu geändert, um eine Simulation überhaupt erst zu ermöglichen.
Für ne physikalisch völlig korrekte Simulation kann ich dir zwar auch den Code schreiben,
aber dann wirste dir nen Supercomputer zulegen müssen. :lol:
PB 4.xx (Windows & Linux & Mac OS X)
Treffen sich 2 Kurven in der Unendlichkeit. Sagt die eine zur anderen: "Hau ab aus meinem Definitionsbereich oder ich leite dich ab!"
Darauf die andere: "Mach nur! Ich bin die e-Funktion." :lol:
Benutzeravatar
Macros
Beiträge: 1365
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag von Macros »

Ok, danke :-)
Bild
Christian
Beiträge: 73
Registriert: 31.08.2004 16:02

Beitrag von Christian »

Hallo!

Vielen Dank für die beiden tollen Physik-Simulationen! (Grav.-Feld und Streuversuch)

Hoffe, dass du die nächsten auch mit uns teilst, sofern noch welche kommen! :)

Aber eine Frage hätte ich noch (auch wenn es jetzt etwas Offtopic ist): Ist es bei dem Streuversuch wirklich so, dass da ein Interferrenzmuster entsteht? Interferrieren die Alphateilchen wirklich an dem Atomgitter?

Gruß
Christian
Benutzeravatar
Macros
Beiträge: 1365
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag von Macros »

Ja, sie prallen an den Atomkernen der Goldatome ab.
In Wirklichkeit hat man natürlich viel viel mehr Alphateilchen,
und eine Chance gleich 0, den Atomkern zu treffen.

Mit diesem Experiment konnte man erstmals die Größe eines Atomkerns bestimmen.
Bild
Christian
Beiträge: 73
Registriert: 31.08.2004 16:02

Beitrag von Christian »

Hallo Macros!

Ich glaube da hast du was missverstanden. In der Simulation scheint auf dem Bildschirm hinter dem Atomgitter ein Interferrenzmuster zu entstehen (also Gebiete, in denen die Alphateilchen mit hoher Wahrscheinlichkeit und Gebiete, in denen die Alphateilchen mit niedriger Wahrscheinlichkeit anzutreffen sind, so wie bei sich überlagernden Lichtwellen am Doppelspalt).

Meine Frage war jetzt, ob die Simulation da korrekt ist und es wirklich so ist, dass die Alphateilchen ein Intererrenzmuster auf dem Bildschirm hinterlassen, wenn man das Experiment real durchführt. Dann wäre das Experiment ja auch gleichzeitig noch ein Beweis für ein anderes Teilgebiet der Physik.

Stimmt die Simulation da also?

Gruß
Christian
Benutzeravatar
Artus
Beiträge: 280
Registriert: 15.01.2005 20:53

Beitrag von Artus »

Hi Olaf,

Nettes Programm doch sind mir einige Fehler aufgefallen denk ich.
Also:
1. Deine Atomkerne sind viel zu groß^^ im verhältnis zu den Teilchen und der Abstand is zu klein^^
2.
gemeinsamen Hüllenelektronen (Atombindungen) zusammen
ich dachte immer es is ne Metallbindung und die Atomrümpfe ordnen sich in einem Metalgitter an welches sich in einem Elektronengas befindet (was sich aber nicht auf die darstellung auswirkt^^)
3. Die Teilchen werden schon knapp vor bzw neben dem atomkern abgelengt
von ihrer Bahn, da die abstoßungskräfte vorher schon zu groß sind

PS: Falls ich mich irre sagt bescheid^^
mfg Arthur
Antworten