Coulombkraft SIM HD

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
Max_der_Held
Beiträge: 595
Registriert: 18.04.2006 17:01
Wohnort: Bavaria
Kontaktdaten:

Coulombkraft SIM HD

Beitrag von Max_der_Held »

Hallo Forum,
  • Mein Physiklehrer behauptete, innerhalb einer Kugel würden sich die Coulombkräfte komplett aufheben. Wenn man sich die Formel ansieht kommt raus

    Code: Alles auswählen

    F = D *   ( 1/r² ) 
    wobei D der unwichtige Formelrest ist und r der Radius Probeladung-Kugel_ladung, wobei alle Kugelladungen regelmäßig verteilt auf der kugel sitzen. Wird r jetzt unendlich klein, also der Abstand Ladung der Kugel zu Probeladung, dann wird die Kraft unendlich groß und das kann von andren Kräften nicht ausgeglichen werden. sprich -> auf Kugel wirkt eine Coulombkraft!
also Lehrergesagtes = Unsinnig?

Ich habe heute während des Unterrichts schnell und unauffällig eine Simulationssoftware geschrieben, die sagts wie folgt:

Tastaturbelegung:
  • drücke F6 zum Kugel-hinzufügen [oder rechts]
    und F1 zum Löschen der Ladungen,
    F4 zum einschalten der Vektoraddition, die alle KraftVektoren einfach aneinanderkettet.

    siehe angezeigten Programmtext.

    DOWNLOAD Exe + Code
Code:

Code: Alles auswählen

; Coulombkraft Simulator
; (c) Aigner, Max
; Erstellt am 12.01.2010 um 11:30
; in Purebasic 4.10
#Window_0 = 0
#max_pfeillength = 30

Enumeration ; mausart
   #mouse_art_none
   #mouse_art_tipped
   #mouse_art_pressed 
   #mouse_art_Released 
EndEnumeration 


Structure vector
  x.f
  y.f
  x2.f ; zielx 
  y2.f ; ziely
EndStructure

Structure ladung
  x.f
  y.f
  farbe.i
  vec.vector ; ihr vektor, der angezeigt wird..
EndStructure

Structure probeladung
  x.f
  y.f
EndStructure 

Global screenwidth.w = 770
Global screenheight.w = 480
Global mousex.f
Global mousey.f
Global mousebutton1.w
Global mousebutton2.w
Global mousedeltax.w
Global mousedeltay.w
Global circle_width.f = 440
Global circle_height.f= 440
Global circle_x.f     = screenwidth / 2 - circle_width / 2
Global circle_y.f     = screenheight/2 - circle_width / 2
Global button_add_x   = 130
Global button_add_y   = 40
Global button_add_width = 90
Global button_add_height = 30
Global button_del_x = 200
Global button_del_y = 80
Global button_del_width = 90 
Global button_del_height = 30
Global is_anziehend = 1 
Global status_display_kraftplan = 0
Global status_display_krafte = 1 
Global status_move_probeladung


Global NewList ladung.ladung()
Global probeladung.probeladung 

Macro Formel() 
    (( is_anziehend * 1.6  * 1.6)/( 4* #PI * 8.85) )/ Pow(math_get_dist ( probeladung\x , probeladung\y , ladung()\x , ladung()\y )/10 ,2) * 1000000
EndMacro 
; deklarationen:

;{ Declarations
Declare ladung_add( x.f = -1 , y.f = -1)
Declare ladung_verschieben(x.f,y.f) ; berechnen aller neuen Vectoren 
Declare Displaystuff()
Declare.f math_get_dist( x.f , y.f, x2.f , y2.f) ; gibt betrag zurück
Declare math_vec_copy ( *vec.vector , *target.vector)
Declare math_vec_normalize( *vec.vector) ; vector auf länge 1 normalisieren.
Declare mouse_in_box( x.f,y.f,width.f,height.f)
Declare examine  ( menumodus = 0 )
Declare ende ()
Declare MouseStatus ( Button )
Declare initstuff()
;}


Procedure initstuff()
   InitSprite()
   InitKeyboard()
   UseJPEGImageEncoder()
   ExamineDesktops ( )
   
    If OpenWindow(#Window_0, 130, 0, 836, 522, "physik",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
        OpenWindowedScreen ( WindowID(#Window_0)  , 30 , 70 , screenwidth , screenheight , 0 , WindowWidth(#Window_0) - 770 , WindowHeight(#Window_0) - 640)
    EndIf
  
EndProcedure 

Procedure MouseStatus ( Button )
   
   If Button = 1
      ProcedureReturn mousebutton1 
   ElseIf Button = 2
      ProcedureReturn mousebutton2 
   ElseIf Button=3 
      ProcedureReturn mousebutton3
   EndIf 
      
EndProcedure

Procedure ende ()
   End 
EndProcedure 

Procedure examine  ( menumodus = 0 )
   Protected  markieren_endx , markieren_endy 
   ExamineKeyboard (             )
   FlipBuffers     (             )
   ClearScreen     (23           )
   ladung_verschieben ( mousex , mousey )
   If IsWindow     ( #Window_0 ) 
      If WaitWindowEvent( 10 ) = #PB_Event_CloseWindow 
         ende ()
      EndIf 
   EndIf 
   
   ;{ mousestuff..
   If IsWindow ( #Window_0 ) 
        windowx= WindowX( #Window_0) + 30
        windowy= WindowY ( #Window_0 ) + 70 + 20
   EndIf 
   smousex     = mousex 
   smousey     = mousey
   mousex      = DesktopMouseX() - windowx 
   mousey      = DesktopMouseY() - windowy 
   mousedeltax = smousex - mousex
   mousedeltay = smousey - mousey
   
   If getasynckeystate_( 1 )
      If mousebutton1 = 0
         mousebutton1 = 1
      ElseIf mousebutton1 = 1
         mousebutton1 = 2
      EndIf  
   Else 
      If mousebutton1 > 0 And mousebutton1 < 3
         mousebutton1 = 3
      Else
         mousebutton1 = 0
      EndIf 
   EndIf 
   
   If getasynckeystate_( 2 )
      If mousebutton2 = 0 
         mousebutton2 = 1
      ElseIf mousebutton2 = 1
         mousebutton2 = 2
      EndIf  
   Else 
      If mousebutton2 > 0 And mousebutton2 < 3
         mousebutton2 = 3
      Else 
         mousebutton2 = 0
      EndIf 
   EndIf 
   
   ;}
         
      
      If MouseStatus(1) > 0 
         ladung_verschieben( mousex , mousey )
      EndIf 
         
      If MouseStatus( 2 ) = #mouse_art_tipped
         ladung_add( mousex , mousey )
      EndIf 
      
      If KeyboardReleased( #PB_Key_F2 )
         is_anziehend = 1
      EndIf 
      
      If KeyboardReleased( #PB_Key_F3 ) 
         is_anziehend = -1 
      EndIf 
      
      If KeyboardReleased(1)   
         ende() 
      EndIf 
      
      If KeyboardReleased (#PB_Key_F4 )
         If status_display_kraftplan = 0
            status_display_kraftplan = 1
            status_display_krafte    = 0
         Else 
            status_display_kraftplan = 0
            status_display_krafte    = 1
         EndIf 
      EndIf 
      
      If KeyboardReleased ( #PB_Key_F5 ) 
         If status_display_krafte = 0
            status_display_krafte = 1 
         Else 
            status_display_krafte = 0
         EndIf 
      EndIf 
      
      If KeyboardPushed(#PB_Key_F6 ) 
         ;Delay(1) 
         ladung_add( )
      EndIf 
      
      If KeyboardReleased ( #PB_Key_F7)
         anzahl = Val( InputRequester("Physik Projekt" ,"Geben Sie die gewünschte anzahl Ladungen ein" , "10"))
         ClearList ( ladung())
         For x = 1 To anzahl
            ladung_add()
         Next 
      EndIf 
      
      If KeyboardReleased(#PB_Key_F1)
         ClearList( ladung())
      EndIf 
      
EndProcedure  

Procedure mouse_in_box( x.f,y.f,width.f,height.f)
   If mousex > x And mousey > y 
      If mousex + width < x And mousey + height < y 
         ProcedureReturn 1 
      EndIf 
   EndIf 
EndProcedure 

Procedure math_vec_normalize( *vec.vector) ; vector auf länge 1 normalisieren.
   If *vec < = 0 :   ProcedureReturn :    EndIf 
   
   lange.f  = *vec\x2 - *vec\x  ; x - abschnitt
   breite.f = *vec\y2 - *vec\y ; y - abschnitt
   gesamt.f = Sqr( lange *lange + breite* breite )  ; diagonale berechnen
   lange  / gesamt
   breite / gesamt
   *vec\x2 = *vec\x + lange
   *vec\y2 = *vec\y + breite 
   
EndProcedure 

Procedure math_vec_copy ( *vec.vector , *target.vector)
   *target\x  = *vec\x 
   *target\x2 = *vec\x2 
   *target\y  = *vec\ y
   *target\y2 = *vec\y2 
EndProcedure 

Procedure.f math_get_dist( x.f , y.f, x2.f , y2.f) ; gibt betrag zurück
   x2 = Abs(x2) - Abs(x )
   y2 = Abs(y2) - Abs(y )
   ProcedureReturn Sqr( x2 *x2 + y2* y2 )
   
EndProcedure 


Procedure Displaystuff()
   Protected vec.vector 
   Protected veclengh.f
   
   ; anzeigen von kreis und ladungen.
   ; sowie buttons
   If StartDrawing( ScreenOutput()) 
      
      DrawingMode( #PB_2DDrawing_Outlined )
      Circle     ( circle_x+ circle_width/2  , circle_y + circle_height/2 , circle_width / 2 , RGB(255,23,23))
      DrawText   ( 10 , 2 , "clear ladungen: F1       Q*q > 0 : F2        Q*q < 0 : F3      Display Vektorplan F4       Display Vektoren F5 ")
      DrawText   ( 10 , 17 , "Add ladung: Rechtsklick       F6: Quick add Ladungen        F7: Manuelle Ladungszahl-Eingabe" )
      DrawText   ( 10 , 32 , "(c) Aigner Max, Gemusoft." )
      DrawText   ( 10 , 47 , "erstellt am 12.01.11 um 11:12 Uhr")
      
      DrawingMode( #PB_2DDrawing_Default )
      Circle     ( probeladung\x , probeladung\y , 10 , RGB( 23,255,23))
      
      ; vectoren ausrechnen und anzeigen als striche.
      
          ForEach ladung()
            If status_display_krafte = 1 
              ladung()\vec\x2 = ladung()\x
              ladung()\vec\y2 = ladung()\y
              ladung()\vec\x  = probeladung\x 
              ladung()\vec\y  = probeladung\y 
              
              math_vec_copy (  ladung()\vec , vec)
              veclengh = Formel()
              math_vec_normalize( vec ) ; dann hab ich die richtung
              LineXY( probeladung\x , probeladung\y , (vec\x2 - vec\x )  * veclengh + probeladung\x, (vec\y2 - vec\y )* veclengh + probeladung\y , ladung()\farbe)
            EndIf 
              Circle( ladung()\x +3, ladung()\y+3 , 8 , ladung()\farbe)
          Next 
        
          ; anzeigen des kräfteplans: 
         
         If status_display_kraftplan 
            x = screenwidth/ 2 
            y = screenheight / 2 
            
            ForEach ladung()
               ladung()\vec\x2 = ladung()\x
               ladung()\vec\y2 = ladung()\y
               ladung()\vec\x  = probeladung\x 
               ladung()\vec\y  = probeladung\y 
               
               veclengh = Formel()
               math_vec_copy( ladung()\vec , vec )
               math_vec_normalize( vec  )
               
               breite = (vec\x2 - vec\x ) * veclengh
               hohe   = (vec\y2 - vec\y ) * veclengh
               LineXY ( x , y , x + breite , y + hohe , ladung()\farbe )
               x + breite
               y + hohe
            Next 
            LineXY ( screenwidth /2 , screenheight / 2 , x , y , RGB(255,0,0))
            x = (x + screenwidth/2 ) / 2
            y = (y + screenheight/2 ) / 2
            DrawText ( x , y , "F RES (rote linie)" , RGB( 255,0,0))
         EndIf 
      StopDrawing( )
   EndIf 
EndProcedure


Procedure ladung_verschieben(x.f,y.f) ; berechnen aller neuen Vectoren 
   ; bei maus-linksklick wird einfach dahin verschoben
   probeladung\x = x
   probeladung\y = y
   
EndProcedure

Procedure ladung_add_alt( x.f = -1 , y.f = -1)
   Protected vec.vector, *ladung.ladung 
   
   If x = -1 Or y = -1 ; randommäßig hinzufügen
      x = Random( screenwidth  ) 
      y = Random( screenheight )
   EndIf 
   
   vec\x = screenwidth / 2 
   vec\y = screenheight /2
   vec\x2 = x
   vec\y2 = y 
   
   math_vec_normalize ( vec )
   length = circle_width / 2 
   vec\x2 = (vec\x2 -vec\x) * length
   vec\y2 = (vec\y2 -vec\y) * length
   
   AddElement( ladung())
      ladung()\x = vec\x2 + screenwidth / 2 
      ladung()\y = vec\y2 + screenheight /2 
      ladung()\farbe = RGB( Random(245) + 10  , Random(245) + 10 , Random(245) + 10 ) 
      *ladung = ladung()
   AddElement ( ladung() ) 
      ladung()\x = screenwidth /2  -vec\x2 
      ladung()\y = screenheight /2 - vec\y2
      ladung()\farbe = *ladung\farbe 
      
      
EndProcedure

Procedure ladung_add(x.f = -1 , y.f = -1 )
    Protected vec.vector, *ladung.ladung , deltafi.f , listsize, Fi.f , z
    
   AddElement( ladung())
   ladung()\farbe = RGB( Random(245) + 10  , Random(245) + 10 , Random(245) + 10 ) 
   listsize = ListSize( ladung())
   deltafi = 2*#PI / listsize  
   
    ForEach ladung()
      ladung()\x = Cos( Fi )* circle_width / 2 + screenwidth / 2  
      ladung()\y = Sin( Fi )* circle_height / 2 + screenheight / 2 
      Fi + deltafi 
    Next 
    
EndProcedure 

initstuff()
Repeat 
    examine()
    Displaystuff()
    
ForEver 
; IDE Options = PureBasic 4.41 (Windows - x86)
; CursorPosition = 56
; FirstLine = 32
Zuletzt geändert von Max_der_Held am 12.01.2011 17:56, insgesamt 1-mal geändert.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Coulombkraft SIM HD

Beitrag von STARGÅTE »

In der Aussage deines Leherer bzw jetzt in deiner Aussage fehlen aber n menge Informationen !

Du nennst hier haufenweise Kugeln, aber sagst nichts über ihre Ausdehung oder Material aus!

Die Formel die du benutzt gilt für Punktladungen, sie lässt sich also z.B. innerhalb einer homogen geladenen Metallkugel garnicht anwenden.

In deinem Beispielprogramm geht leider nicht hervor was dieser große Kreis sein soll.
Außer das auf ihm alle Ladungen sitzen, hat er keine Eigenschaften ?
wenn nicht, ist das ein normales System, und die Kräfte heben sich natürlich nur im Mittelpunkt auf.
_____

>> "Mein Physiklehrer behauptete, innerhalb einer Kugel würden sich die Coulombkräfte komplett aufheben."
Was dein Physiker meinte ist vermutlich der Faradaysche Effekt der innerhalb einer Metallkugel eintritt.

Die Ladungen im richten sich nach dem äußeren Feld aus und erzeugen dabei ein Gegenfeld, was dazu führt das es innerhalb der Kugel wirklich überall keine Kräfte gibt.
Bild

Wäre nett wenn du noch ein Paar Infos geben würdest!
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Max_der_Held
Beiträge: 595
Registriert: 18.04.2006 17:01
Wohnort: Bavaria
Kontaktdaten:

Re: Coulombkraft SIM HD

Beitrag von Max_der_Held »

nun.. das ist ein Radialsymmetrisches Feld, weshalb alle Ladungen radial symmetrisch auf der Oberfläche der Kugel sitzen.
(hier dargestellt durch einen zweidimensionalen Kreis)

Das Material ist leitfähig (Metall) , ansonsten beliebig.
auch Radius der (Metall)kugel ist frei wählbar.

ACHTUNG: es ist KEIN Homogenes Feld, deine Grafik gilt nur für homogene Felder.

aber danke für die antwort.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Coulombkraft SIM HD

Beitrag von STARGÅTE »

Das feld muss auch nicht homogen sein, es muss ja nicht mal ein symetrischer Körper sein.
WIKI - Abschirmung elektrostatischer Felder hat geschrieben: [...] Wird eine elektrisch leitende Hülle, beispielsweise eine Hohlkugel, in ein von außen aufgebrachtes elektrostatisches Feld E gebracht, kommt es aufgrund der Kraftwirkung auf die in der Hülle frei beweglichen Ladungen Q zu räumlichen Umverteilung der Ladungen an der Oberfläche bis die tangential auf der Oberfläche stehende elektrische äußere Feldkomponente null wird und damit ein Ausgleich gefunden ist. Dadurch entspringt bzw. endet im statischen Fall der elektrische Fluss an der Oberfläche der Hülle, womit das Innere der Hülle feldfrei bleibt. Diese Schirmwirkung ist nicht an eine bestimmte Form der Hülle gebunden und tritt bei beliebig geformten Hohlkörpern auf, sofern sie elektrisch leitfähig sind.
hier noch ein Link von meiner UNI, da kannst du das selbst austesten:
http://www.itp.tu-berlin.de/menue/lehre ... /emstatic/
zB mit Setup: Charge+Plane
Das ist zwar keine Kugel, aber alleine das es Metall ist, schirmt es die Ladungen von außen ab, und auf der anderen Seite existiert kein Feld.
Du kannst im Applet auch n "kugelige Wand" bauen, und darum Ladungen setzen, es wird kein feld im inneren entstehen.

Bild
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Max_der_Held
Beiträge: 595
Registriert: 18.04.2006 17:01
Wohnort: Bavaria
Kontaktdaten:

Re: Coulombkraft SIM HD

Beitrag von Max_der_Held »

Hey Stargate,
Die Anwendung hat's auf jeden Fall ins ich!.
Ich hab damit mal ein bisschen rumgebastelt, aber was mir aufgefallen ist..
Du kannst im Applet auch n "kugelige Wand" bauen, und darum Ladungen setzen, es wird kein feld im inneren entstehen.
Die Abschirmenden Metall"wände" sind doch selbst nicht geladen! deswegen schirmen Sie ja auch alles ab (wie auch beim Magnetfeld etc.)

in Meinem Fall sind die "Wände" der (übrigens massiven) Metallkugel ja SCHON geladen, sprich ich HABE ein Feld im Inneren der Kugel!
Man korrigiere mich, wenn ich irre....?

lg
max
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Coulombkraft SIM HD

Beitrag von STARGÅTE »

Max_der_Held hat geschrieben:in Meinem Fall sind die "Wände" der (übrigens massiven) Metallkugel ja SCHON geladen, sprich ich HABE ein Feld im Inneren der Kugel!
Man korrigiere mich, wenn ich irre....?
Nein.
Ich verstehe aber dein Problem.
Du verstehst nicht, warum viele Puntladungen nicht gleich einer Kugelschalde sind.

Das Problem hierbei ist, das du für dein Beispiel ein Gesetz nimmst, was für Fernfelder gilt.
Das heißt du kannst es außerhalb deine Punktladungssammlung benutzen!
Im inneren gelten aber andere Gesetze, Nahfeld.
Und in dem Augenblick wo es immer mehr Punkteladungen werden, kommt es zum "Übergang"

Hier noch mal ein anderer Link der darauf (kurz) eingeht:
http://wwwex.physik.uni-ulm.de/lehre/gk ... ode12.html

ich versuch es noch mal etwas genauer mit Formeln dir Herzuleiten ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Max_der_Held
Beiträge: 595
Registriert: 18.04.2006 17:01
Wohnort: Bavaria
Kontaktdaten:

Re: Coulombkraft SIM HD

Beitrag von Max_der_Held »

Ja... also die Coulombkraft scheint überhaupt nicht so recht zu wirken einfach so.. soviel habich inzwischen schon begriffen ;P
dass es wie ein faredaiischer Käfig (rechtschreibung um die zeit= böse) wirkt ist aber nicht so richtig, weil es stimmt zwar dass die ladungen an der oberfläche bleiben, aber das magnetfeld sollte durchkommen.. denke ich vor allem aufgrund folgenden linkes, den ich entdeckt habe:
http://www.matheplanet.com/matheplanet/ ... opic=80605
da wird was von einem homogenen Feld und einer Gauß Formel erwähnt..
leider bin ich gerade nicht in der Lage diese physikalisch hochwertigen Informationen auszuwerten..
eventuell gelingt mir das später des tages nach einem gesunden Schlaf in der Schule.

Mein Lehrer hat von solch einer Gauß-Formel aber nichts erwähnt.. der Meinte es würde die Coulombkraft wirken.....
evtl hat er was verwechselt..

gn8
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Coulombkraft SIM HD

Beitrag von Nino »

Max_der_Held hat geschrieben:eventuell gelingt mir das später des tages nach einem gesunden Schlaf in der Schule.

Mein Lehrer hat von solch einer Gauß-Formel aber nichts erwähnt.. der Meinte es würde die Coulombkraft wirken.....
evtl hat er was verwechselt..
In der Schule aufpassen statt zu schlafen (und bei Bedarf direkt den Lehrer fragen) könnte auch helfen.
Antworten