Matroids Matheplanet Forum Index
Moderiert von mire2
Mathematische Software & Apps » Andere Softwarepakete » gnuplot: Plotten einer impliziten Funktion f(x,y) in 2D
Autor
Kein bestimmter Bereich J gnuplot: Plotten einer impliziten Funktion f(x,y) in 2D
Ehemaliges_Mitglied
  Themenstart: 2019-08-05

Hallo. Es geht um das Problem: Finde alle Punkte X mit |AX| + |BX|= |CX| für feste A,B,C. Es geht um das Plotten der impliziten Funktion $f(x,y)=0= 4\cdot ((x -x_A)^2 + (y - y_A)^2)\cdot((x -x_B)^2 + (y -y_B)^2) -\bigl[ ((x -x_C)^2 + (y -y_C)^2) -((x -x_A)^2 + (y -y_A)^2) -((x -x_B)^2 + (y -y_B)^2) \bigr]^2$ für verschiedene Paramter $x_*,~ y_*$. Mein Versuch: \sourceon gnuplot xA=0; yA=0; xB=1; yB=0; xC=0.5; yC=0.5*sqrt(3); f(x,y)=4*((x -xA)**2 +(y -yA)**2)*((x -xB)**2 +(y -yB)**2) -(((x -xC)**2 +(y -yC)**2) -((x -xA)**2 + (y -yA)**2) -((x -xB)**2 +(y -yB)**2))**2; set contour base; set cntrparam levels discrete 0.01; unset surface; set view map; set isosample 300,300; set size square; splot f(x,y); \sourceoff Hinweis: Ich kenne mich mit gnuplot nicht besonders aus, ich weiß nicht, ob man den Kram unter f(x,y) wirklich alles braucht. Ich erhalte erstmal sowas lückenhaftes mit Loops: https://matheplanet.de/matheplanet/nuke/html/uploads/b/51007_42_55555555.png Wenn ich dann ranzoome wie wahnsinnig, bekomme ich: https://matheplanet.de/matheplanet/nuke/html/uploads/b/51007_4_9999999999999.jpg Das ist schon eher das Gesuchte. Wobei mir gerade unklar ist, warum das zwei Kreise sind. Also die Frage wäre: Wie muss ich gnuplot optimal einstellen? Danke.


   Profil
AlphaSigma
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 23.11.2012
Mitteilungen: 462
  Beitrag No.1, eingetragen 2019-08-05

Hallo HyperPlot, die Frage ist auch, ob f für die gewählten Parameter xA, xB, etc. überhaupt Nullstellen hat. Zu gnuplot: Um die contour von f(x,y) = 0 zu sehen, muss die Zeile \sourceon gnuplot set cntrparam levels discrete 0.0 \sourceoff lauten. Mit \sourceon gnuplot set cntrparam levels discrete -1.0, -0.1, 0.0, 0.1, 1.0 \sourceoff kannst Du Dir zur Kontrolle auch mehrere Kontouren anzeigen lassen. Die Funktion f als 3D/Plot siehst Du ohne \sourceon gnuplot unset surface \sourceoff Wenn ich mir die Funktion anschaue sehe ich mit den angegebenen Parametern nur Konturen für positive z-Werte. \sourceon gnuplot set cntrparam levels discrete -0.1, 0, 0.1, 0.5, 1.0 \sourceoff https://www.matheplanet.de/matheplanet/nuke/html/uploads/b/35344_gnuplot_cntr.png Eine Anleitung zu gnuplot findest Du hier http://www.gnuplot.info/


   Profil
Ehemaliges_Mitglied
  Beitrag No.2, vom Themenstarter, eingetragen 2019-08-05

Aha, jetzt weiß ich schonmal deutlich mehr. Irgendwie ist das komisch: Für \showon set cntrparam levels discrete 0.0; \sourceon gnuplot xA=0; yA=0; xB=1; yB=0; xC=0.5; yC=0.5*sqrt(3); f(x,y)=4*((x -xA)**2 +(y -yA)**2)*((x -xB)**2 +(y -yB)**2) -(((x -xC)**2 +(y -yC)**2) -((x -xA)**2 + (y -yA)**2) -((x -xB)**2 +(y -yB)**2))**2; set contour base; set cntrparam levels discrete 0.0; unset surface; set view map; set isosamples 300; set size square; splot f(x,y); \sourceoff \showoff zeichnet er (wie schon festgestellt) gar nichts (da er hier scheints nur positive Werte mag). Hier sollte sowas wie der Umkreis für das (gleichseitige) Dreieck aus den Punkten x*, y* rauskommen.... Für \showon set cntrparam levels discrete 0.1; \sourceon gnuplot xA=0; yA=0; xB=1; yB=0; xC=0.5; yC=0.5*sqrt(3); f(x,y)=4*((x -xA)**2 +(y -yA)**2)*((x -xB)**2 +(y -yB)**2) -(((x -xC)**2 +(y -yC)**2) -((x -xA)**2 + (y -yA)**2) -((x -xB)**2 +(y -yB)**2))**2; set contour base; set cntrparam levels discrete 0.1; unset surface; set view map; set isosamples 300; set size square; splot f(x,y); \sourceoff \showoff zeichnet er mir zwei Kreise.


   Profil
AlphaSigma
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 23.11.2012
Mitteilungen: 462
  Beitrag No.3, eingetragen 2019-08-05

Was genau findest Du daran komisch? Was ist, wenn z.B. die Funktion überall >= 0 ist. Dann könnte gnuplot Schwierigkeiten haben, numerisch mit begrenzter Genauigkeit die Punkte mit f(x,y) = 0 zu finden.


   Profil
AlphaSigma
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 23.11.2012
Mitteilungen: 462
  Beitrag No.4, eingetragen 2019-08-05

Hier noch ein Bild mit \sourceon gnuplot set isosample 500,500 set cntrparam levels discrete 0, 0.001, 0.01, 0.1, 1.0 \sourceoff erzeugt. https://www.matheplanet.de/matheplanet/nuke/html/uploads/b/35344_1_gnuplot_cntr.png


   Profil
Ehemaliges_Mitglied
  Beitrag No.5, vom Themenstarter, eingetragen 2019-08-06

Es geht übrigens um das Problem: Finde alle Punkte X mit |AX| + |BX|= |CX| für feste A,B,C. Also ich habe das mal mit Sage(math) überprüft: \showon Fall, der geht: Lustige Lemniskate wird gezeichnet. https://matheplanet.de/matheplanet/nuke/html/uploads/b/51007_43_55555555.png \sourceon Sage x,y= var('x,y') xA=0 yA=0 xB=1 yB=0 xC=0 yC=1 f(x,y)=4*((x -xA)^2 +(y -yA)^2)*((x -xB)^2 +(y -yB)^2) -(((x -xC)^2 +(y -yC)^2) -((x -xA)^2 + (y -yA)^2) -((x -xB)^2 +(y -yB)^2))^2; implicit_plot(f, (x, -5, 5), (y, -5, 5)) \sourceoff \showoff \showon Fall hier, der nicht geht: Nichts wird gezeichnet. \sourceon Sage x,y= var('x,y') xA=0 yA=0 xB=1 yB=0 xC=0.5 yC=0.5*sqrt(3) f(x,y)=4*((x -xA)^2 +(y -yA)^2)*((x -xB)^2 +(y -yB)^2) -(((x -xC)^2 +(y -yC)^2) -((x -xA)^2 + (y -yA)^2) -((x -xB)^2 +(y -yB)^2))^2; implicit_plot(f, (x, -5, 5), (y, -5, 5)) \sourceoff \showoff Dann nehme ich an, dass an meiner Herleitung irgendwas nicht stimmt bzw. die Formel nicht den Fall des gleichseitigen Dreiecks ABC andeckt.


   Profil
AlphaSigma
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 23.11.2012
Mitteilungen: 462
  Beitrag No.6, eingetragen 2019-08-06

Hallo HyperPlot, hast Du meinen Beitrag No. 3 gelesen und verstanden, was ich damit sagen will? Was kannst Du über die Lösung von f = 0 folgern, wenn ein Plot-Programm keine Konturen für z = 0 anzeigt? Stichworte: Numerische Approximation und endliche Rechengenauigkeit. \sourceon gnuplot xA=0 yA=0 xB=1 yB=0 xC=0.5 yC=0.5*sqrt(3) f(x,y)=4*((x -xA)**2 +(y -yA)**2)*((x -xB)**2 +(y -yB)**2) -(((x -xC)**2 +(y -yC)**2) -((x -xA)**2 + (y -yA)**2) -((x -xB)**2 +(y -yB)**2))**2 set contour base set cntrparam levels discrete 0, 0.1, 0.01, 1.0e-3, 1.0e-4 unset surface set view map set size square set isosamples 1000,1000 set samples 1000,1000 set xrange [-0.5:1.5] set yrange [-0.5:1.5] set label 1 "A" at 0,0 center set label 2 "B" at 1,0 center set label 3 "C" at 0.5,0.866 center splot f(x,y) \sourceoff https://www.matheplanet.de/matheplanet/nuke/html/uploads/b/35344_gnuplot_contour.png


   Profil
Ehemaliges_Mitglied
  Beitrag No.7, vom Themenstarter, eingetragen 2019-08-06

Ja, kein schlechter Trick. Man müsste es nur noch irgendwie schaffen, dass der Grenzfall eine schöne Kreislinie ergibt.


   Profil
AlphaSigma
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 23.11.2012
Mitteilungen: 462
  Beitrag No.8, eingetragen 2019-08-06

Hallo HyperPlot, mir ging es eigentlich hpts. darum zu verdeutlichen, dass ein Plot-Programm nicht das Mittel der Wahl ist solche Gleichungen zu lösen. Besser wäre es wohl die Lösung in Form eines parametrisierten Kreises darzustellen und in 2D zu plotten. Der Ansatz mit dem Konturplot in gnuplot ergibt mit z = 1e-5 und lw 2 dieses Bild im png-Format (1280x1280): https://www.matheplanet.de/matheplanet/nuke/html/uploads/b/35344_1_gnuplot_contour.png


   Profil
Ehemaliges_Mitglied
  Beitrag No.9, vom Themenstarter, eingetragen 2019-08-06

\quoteon(2019-08-06 22:51 - AlphaSigma in Beitrag No. 8) mir ging es eigentlich hpts. darum zu verdeutlichen, dass ein Plot-Programm nicht das Mittel der Wahl ist solche Gleichungen zu lösen. Besser wäre es wohl die Lösung in Form eines parametrisierten Kreises darzustellen und in 2D zu plotten. Der Ansatz mit dem Konturplot in gnuplot ergibt mit z = 1e-5 und lw 2 dieses Bild im png-Format (1280x1280): \quoteoff Das hat auch niemand gesagt. Es ging auch nicht so sehr darum, um diesen Einzelfall, um jeden Preis einen Kreis zu zeichnen, was sicher einfacher geht, sondern eine Methode zu haben die für beliebige Dreiecke funktioniert. Wie dem auch sei, mit \showon \sourceon gnuplot xA=0; yA=0; xB=1; yB=0; xC=0.5; yC=0.5*sqrt(3); f(x,y)=2*sqrt((x -xA)**2 +(y -yA)**2)*sqrt((x -xB)**2 +(y -yB)**2) -(((x -xC)**2 +(y -yC)**2) -((x -xA)**2 + (y -yA)**2) -((x -xB)**2 +(y -yB)**2))**1; set contour base; set cntrparam levels discrete 1.0e-5; unset surface; set view map; set size square; set isosamples 1000,1000; set samples 1000,1000; set xrange [-0.5:1.5]; set yrange [-0.5:1.5]; set label 1 "A" at 0,0 center; set label 2 "B" at 1,0 center; set label 3 "C" at 0.5,0.866 center; splot f(x,y); \sourceoff \showoff scheint es gut rauszukommen. Damit habe ich mein eigentliches Programm komplett: \showon \sourceon latex % arara: pdflatex: {shell: yes} \documentclass[margin=5mm, tikz]{standalone} \usepackage{pgfplots} \pgfplotsset{compat=newest} \begin{document} % Ecken \pgfmathsetmacro\xA{0} \pgfmathsetmacro\yA{0} \pgfmathsetmacro\xB{1} \pgfmathsetmacro\yB{0} \pgfmathsetmacro\xC{0.5} \pgfmathsetmacro\yC{0.5*sqrt(3))} %%% Ecken \pgfmathsetmacro\xA{0} \pgfmathsetmacro\yA{0} \pgfmathsetmacro\xB{1} \pgfmathsetmacro\yB{0} \pgfmathsetmacro\xC{0} \pgfmathsetmacro\yC{1} \begin{tikzpicture} \begin{axis}[ axis equal, % restrict y to domain = -4:4, ] \addplot[ no markers, raw gnuplot, thick, ] gnuplot { xA=\xA; yA=\yA; xB=\xB; yB=\yB; xC=\xC; yC=\yC; f(x,y)=2*sqrt((x -xA)**2 +(y -yA)**2)*sqrt((x -xB)**2 +(y -yB)**2) -(((x -xC)**2 +(y -yC)**2) -((x -xA)**2 + (y -yA)**2) -((x -xB)**2 +(y -yB)**2))**1; set contour base; set cntrparam levels discrete 1.0e-5; unset surface; set view map; set size square; set isosamples 1000,1000; set samples 1000,1000; set xrange [-2:2]; set yrange [-2:2]; splot f(x,y); }; \addlegendentry{$X$} \addplot[no marks] coordinates {(\xA,\yA) (\xB,\yB) (\xC,\yC) (\xA,\yA) }; \draw[fill=white] (\xA,\yA) circle (1.75pt) node[anchor=north east]{$A(\xA,\yA)$}; \draw[fill=white] (\xB,\yB) circle (1.75pt) node[anchor=north]{$B(\xB,\yB)$}; \draw[fill=white] (\xC,\yC) circle (1.75pt) node[anchor=east]{$C(\xC,\yC)$}; \end{axis} \end{tikzpicture} \end{document} \sourceoff \showoff Also danke für die Hilfe.


   Profil
Ehemaliges_Mitglied hat die Antworten auf ihre/seine Frage gesehen.
Ehemaliges_Mitglied hat selbst das Ok-Häkchen gesetzt.

Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2023 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]