|
Autor |
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  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  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  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  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  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. |
|
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]
|