Vektorkonstrukte in Java visualisieren

Antworten
asterix
Beiträge: 289
Registriert: 23.05.2018, 08:24

01.07.2020, 11:15

Vektorvisualisierung in Vpython geht eigentlich ziemlich einfach. Leider ist Python relativ langsam, wenn iteriert werden muss. Java ist da schon deutlich schneller. Die Realisierung der  Vektorvisualisierung ist in Java aber deutlich komplizierter. Es gibt zum Glück eine Unmenge freier Programmteile, die man nutzen kann um auch in Java relativ einfach zu einer Visualisierung von Vektoren zu kommen. Meinen Dank an die Autoren. Ich habe da einmal einiges zusammengesucht um damit eine entsprechende Ausgabemöglichkeit zu programmieren.

Wenn man komplexe Iterationen realisieren will,  ist die eine graphische Darstellung des zur Iteration konstruierten Vektorkonstrukts aus mehreren Gründen sehr hilfreich. Man erkennt Fehler in der Regel auf den ersten Blick, und der Konstrukt ist eigentlich schon die programmtechnische Lösung. Man muss nur noch die Iterationsformeln  richtig darin platzieren.  

Die eigene Grafik/Iteration wird in der Klasse myGraphic angelegt. Den Rest des Programms braucht man gar nicht zu kennen. Da wir hier schon oft mit Stromschleifen herum operiert haben, habe ich dazu einige Beispiel zur Darstellung/Dokumentation ausprobiert. Ein Beispiel erzeugt folgenden Konstrukt:

Abb1.gif
Abb1.gif (25.75 KiB) 345 mal betrachtet
ArrowRing(Vektor pos,Vektor axis,double ringRad,double tubeRad)

Eine Basis für eine rotierende Schleife. Man macht praktisch Dokumentation und Iterator gleichzeitig.

Für ein komplettes Beispiel, habe ich eine nur auf der X-Achse positionierbare Schleife benutzt. Als Beispiel bietet sich hier einmal eine Darstellung des Magnetfeldes einer Leiterschleife mit Hilfe vom Biot-Savart-Gesetz an.

Formel1.gif
Formel1.gif (2.23 KiB) 345 mal betrachtet
https://de.wikipedia.org/wiki/Biot-Savart-Gesetz

Der Strom I erzeugt in einem Stück Leiterschleife dl  am Ort r‘ ein Magnetfeld, aus dem  am Messpunkt r eine magnetische Flussdichte dB(r) resultiert. Die Summe aller Anteile der Leiterschleifenstücke ergibt die gesamte magnetische Flussdichte  am Messpunkt r.

Die Leiterstücke dl kann man mit der Funktion ArrowRingX(double x0,double ringRad,double tubeRad) erzeugen.

Abb2.gif
Abb2.gif (13.21 KiB) 345 mal betrachtet
ArrowRingX(double x0,double ringRad,double tubeRad)

Die Vektoren r‘ und dl sind schon einmal vorhanden. Um die Formel anzuwenden braucht man aber noch den Vektor r, aus dem ja die Distanz (r-r‘) zwischen dem Leiterstück dl und dem Messpunkt r resultiert. An die Funktion muss daher noch die Position des Messpunktes r übergeben werden. Die Funktion für die garphische Darstellung sieht dann wie folgt aus:

Group Gr_MagnFlussdichte(double x0,double ringRad,double tubeRad,Vektor r)
    {
    double dphi=2.0*Math.PI/(double)steep;
    double phi=0.0;
    Group g=new Group();
    Vektor r_str=new Vektor(x0,ringRad*Math.cos(phi),ringRad*Math.sin(phi));
    for(int i=0;i < steep;++i)
      {
      phi+=dphi;
      Vektor r_str1=new Vektor(x0,ringRad*Math.cos(phi),ringRad*Math.sin(phi));
      Vektor dl=r_str1.Subtrahieren(r_str);
      Vektor dist=r.Subtrahieren(r_str);
      if(i==1)
        {  
        g.getChildren().add(new Arrow(r_str,tubeRad/2,Color.AZURE,"r'"));
        g.getChildren().add(new Arrow(r_str,dl,tubeRad,Color.RED,"dl"));
        g.getChildren().add(new Arrow(r_str,dist,tubeRad/2,Color.AQUA,"dist"));
        g.getChildren().add(new Arrow(r,tubeRad/2,Color.LIGHTGRAY,"r"));
        }
      else
        g.getChildren().add(new Arrow(r_str,dl,tubeRad,Color.RED));
      r_str=r_str1;
      }  
    return g;  
    }      

Der Ringvektoren dl werden wieder alle dargestellt. Die anderen nur für einen Schritt, weil es sonst zu unübersichtlich wird. Zur endgültigen Überprüfung, sollte man die aber einmal alle darstellen.

Abb3.gif
Abb3.gif (26.62 KiB) 345 mal betrachtet
Gr_MagnFlussdichte(double x0,double ringRad,double tubeRad,Vektor r)

Die zusätzlich noch dargestellte Distanz ergibt sich aus (r-r‘). In etlichen Veröffentlichungen wird die Distanz leider auch mit r bezeichnet.  Problematisch, wenn die Formeln dann ohne erläuternde Grafik irgendwo stehen.
Wenn die errechneten Vektoren in der Grafik alle richtig dargestellt werden, kann man sie dann in der Formel benutzen. Die Iteration ist die Gleiche, nur die Grafikausgabe wird entfernt bzw. durch die Formel ersetzt. Rückgabewert wird ein Vektor mit der Flussdichte am Messpunkt r. Die einzelnen Anteile dB werden in B aufsummiert und als Gesamtflussdichte  für den Messpunkt wird von der Funktion zurückgegeben.

Vektor MagnFlussdichte(double x0,double ringRad,double tubeRad,Vektor r)
    {
    Vektor B=new Vektor(0.0,0.0,0.0);   
    double I=1;
    double dphi=2.0*Math.PI/(double)steep;
    double phi=0.0;
    Vektor r_str=new Vektor(x0,ringRad*Math.cos(phi),ringRad*Math.sin(phi));
    for(int i=0;i < steep;++i)
      {
      phi+=dphi;
      Vektor r_str1=new Vektor(x0,ringRad*Math.cos(phi),ringRad*Math.sin(phi));
      Vektor dl=r_str1.Subtrahieren(r_str);
      Vektor dist=r.Subtrahieren(r_str);
      double bdist=dist.Betrag();
      Vektor krp=dl.Kreuzprodukt(dist.Skalardivision(bdist*bdist*bdist));
      Vektor dB=krp.Skalarmultiplikation(I*eps0/(4.0*Math.PI));
      B=B.Addieren(dB);
      r_str=r_str1;
      }  
    return B;  
    }      

Die Vektoren zu einer Menge von Messpunkten kann man dann auch zusammen mit der Schleife visualisieren.  Die Funktion Graphik_H_XY() erzeugt die folgende Ausgabe.

Abb4.gif
Abb4.gif (23.82 KiB) 345 mal betrachtet
Graphik_B_XY()

Die Funktion lässt sich hinsichtlich Geschwindigkeit sicher noch etwas optimieren. Der Übersicht halber habe ich sie aber möglichst 1:1 übertragen.

Analog zu der Methode kann man auch das Vektorpotential A darstellen.
Formel2.gif
Formel2.gif (2.49 KiB) 345 mal betrachtet
https://www.ate.uni-due.de/data/tet/TET ... statik.pdf  (Seite 22)

Abb5.gif
Abb5.gif (42.94 KiB) 345 mal betrachtet
Graphik_A_YZ() Vektorpotential in der Y-Z - Ebene


Abb6.gif
Abb6.gif (18.9 KiB) 345 mal betrachtet
Graphik_A_XY()Vektorpotential in der X-Y-Ebene



Die Beispiele kann man über den Reset-Button durchklicken.
In der Anlage befindet sich das Netbeans-Projekt.
Vektor3D.zip
(243.54 KiB) 8-mal heruntergeladen
Das ist meine persönliche Meinung dazu. Basierend auf einer nach bestem Wissen und Gewissen recherchierten Faktenlage.
Antworten
  • Information