pgfplots, intersections, Geradengleichung

Tabellen und Grafiken erstellen und anordnen


jensjj
Forum-Newbie
Forum-Newbie
Beiträge: 4
Registriert: Do 20. Apr 2017, 09:39

pgfplots, intersections, Geradengleichung

Beitrag von jensjj »

Hallo aus dem hohen Norden,

ich suche nach einer Möglichkeit, Steigung und Achsenabschnitt einer Geraden, die zwei intern berechente Koordinaten (berechnet über "intersections") verbindet, zu berechnen.
Alternativ käme ich auch weiter, wenn ich die x- und y-Werte aus den Koordinaten herausextrahieren könnte. Es geht mir in dem Minimalbeispiel um die rote Gerade zwischen den Koordinaten P1 und P2, also um eine Lösung, die auf diesen Koordinaten basiert. Ich hoffe, ich habe bei meiner Suche nicht die offensichtliche Lösung übersehen. Dann wäre ich für einen Hinweis sehr dankbar.


\documentclass{standalone}
\usepackage[utf8]{inputenc}
\usepackage{pgfplots}
\usetikzlibrary{math, calc, intersections}
\pgfplotsset{compat=newest}
\begin{document}
\begin{tikzpicture}
	\begin{axis}[
	domain=0:1,
	height=9cm,
	width=9cm,
	xlabel={$x_A$},
	ylabel={$y_A$},
	grid=major,
	clip=false,
	xmin=0, xmax=1,
	ymin=0, ymax=1
	]
	\addplot[mark=none, name path=A]{3.5*x/(1+2.5*x)};
	\addplot[green!50!black, mark=none, name path=B]{0.6876*x+0.19875};
	\draw[blue, mark=none, name path=C](0.9,0) -- +(0,0.9);
	\draw[green, mark=none, name path=D](0.3,0) -- +(0,0.7);
	\path [name intersections={of=A and D,by=P1}];
	\draw [red] (P1) circle[radius=2pt] node [xshift=10pt] {\footnotesize {P1}};
	\path [name intersections={of=B and C,by=P2}];
	\draw [red] (P2) circle[radius=2pt] node [xshift=10pt] {\footnotesize {P2}};
	\draw[red](P1) -- (P2);
\end{axis}
\end{tikzpicture}
\end{document}
Vielen Dank!
Dateianhänge
Minimalbild_Steigung.pdf
(35.04 KiB) 225-mal heruntergeladen
Viele Grüße
Jens

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Leider verrätst Du nicht, was Du mit Steigung und Achsenabschnitt dann tun willtst.
\documentclass{standalone} 
\usepackage[utf8]{inputenc} 
\usepackage{pgfplots} 
\pgfplotsset{compat=newest}
\usetikzlibrary{math, calc, intersections} 
\begin{document} 
\begin{tikzpicture} 
   \begin{axis}[ 
   domain=0:1,
   height=9cm, 
   width=9cm, 
   xlabel={$x_A$}, 
   ylabel={$y_A$}, 
   grid=major, 
   clip=false, 
   xmin=0, xmax=1, 
   ymin=0, ymax=1 
   ] 
   \addplot[mark=none, name path=A]{3.5*x/(1+2.5*x)}; 
   \addplot[green!50!black, mark=none, name path=B]{0.6876*x+0.19875}; 
   \draw[blue, mark=none, name path=C](0.9,0) -- +(0,0.9); 
   \draw[green, mark=none, name path=D](0.3,0) -- +(0,0.7); 
   \path [name intersections={of=A and D,by=P1}]; 
   \draw [red] (P1) circle[radius=2pt] node [xshift=10pt] {\footnotesize {P1}}; 
   \path [name intersections={of=B and C,by=P2}]; 
   \draw [red] (P2) circle[radius=2pt] node [xshift=10pt] {\footnotesize {P2}}; 
   \draw[red](P1) -- (P2)\pgfextra{\pgfgetlastxy{\xii}{\yii}};
   \path let \p1=(P1), \p2=(P2) in \pgfextra{%
      \pgfmathparse{(\y2-\y1)/(\x2-\x1)} \xdef\steigung{\pgfmathresult}%
      \pgfmathparse{\y1-\steigung*\x1} \xdef\achsenabschnitt{\pgfmathresult}%
   };
   \draw[yellow](0pt,\achsenabschnitt pt)--(P1);
   \draw[yellow](P2)--(210.5pt,210.5pt*\steigung+\achsenabschnitt pt);
\end{axis}
\node[below]at(current axis.outer south){Steigung: \steigung, Achsenabschnitt: {\achsenabschnitt} pt};
\end{tikzpicture} 
\end{document}
Bild

Beachte dabei, dass \achsenabschnitt hier den Abstand des Schnittpunktes der Geraden mit der y-Achse vom Nullpunkt in pt angibt. Das hat also nichts mit den Einheiten zu tun, die an der Skale stehen. Ähnliches gilt für den Anstieg. Der enspricht nur dem Anstieg in der Geradengleichung, wenn eine y-Einheit genau so lang wie eine x-Einheit ist.

Wenn Du den Achsenabschnitt umrechnen möchtest, dann gib einen Wert für die x- und y-Einheiten vor:
\documentclass{standalone} 
\usepackage[utf8]{inputenc} 
\usepackage{pgfplots} 
\pgfplotsset{compat=1.14}
\usetikzlibrary{math, calc, intersections} 
\pgfplotsset{compat=newest} 
\begin{document} 
\begin{tikzpicture} 
   \newcommand*\plotunit{7.5cm}
   \begin{axis}[ 
   domain=0:1,
   x=\plotunit,
   y=\plotunit,
   xlabel={$x_A$}, 
   ylabel={$y_A$}, 
   grid=major, 
   clip=false, 
   xmin=0, xmax=1, 
   ymin=0, ymax=1 
   ] 
   \addplot[mark=none, name path=A]{3.5*x/(1+2.5*x)}; 
   \addplot[green!50!black, mark=none, name path=B]{0.6876*x+0.19875}; 
   \draw[blue, mark=none, name path=C](0.9,0) -- +(0,0.9); 
   \draw[green, mark=none, name path=D](0.3,0) -- +(0,0.7); 
   \path [name intersections={of=A and D,by=P1}]; 
   \draw [red] (P1) circle[radius=2pt] node [xshift=10pt] {\footnotesize {P1}}; 
   \path [name intersections={of=B and C,by=P2}]; 
   \draw [red] (P2) circle[radius=2pt] node [xshift=10pt] {\footnotesize {P2}}; 
   \draw[red](P1) -- (P2)\pgfextra{\pgfgetlastxy{\xii}{\yii}};
   \path let \p1=(P1), \p2=(P2) in \pgfextra{%
      \pgfmathparse{(\y2-\y1)/(\x2-\x1)} \xdef\steigung{\pgfmathresult}%
      \pgfmathparse{(\y1-\steigung*\x1)/\plotunit} \xdef\achsenabschnitt{\pgfmathresult}%
   };
   \draw[yellow](0pt,\achsenabschnitt)--(P1);
   \draw[yellow](P2)--(1,\steigung+\achsenabschnitt);
\end{axis}
\node[below]at(current axis.outer south){Steigung: \steigung, Achsenabschnitt: \achsenabschnitt};
\end{tikzpicture} 
\end{document}
Bild
Dateianhänge
gl_geradengleichung2.png
gl_geradengleichung2.png (17.89 KiB) 1323 mal betrachtet
gl_geradengleichung1.png
gl_geradengleichung1.png (17.97 KiB) 1332 mal betrachtet

jensjj
Forum-Newbie
Forum-Newbie
Beiträge: 4
Registriert: Do 20. Apr 2017, 09:39

Beitrag von jensjj »

Super esdd! Vielen Dank - auch für den Hinweis auf die Skalierung/Einheit ist für mich hilfreich, da ich mit den Daten rechne und z. B. Start- bzw. Endpunkte anderer, hiervon abhängiger Funktionen bestimme.

Dein Vorgehen zeigt mir durch den Lösungsweg auch, wie ich aus einer Koordinaten den x- und y-Anteil ermittle. Auch das wird mir an anderer Stelle sicher noch helfen. Also, nochmals vielen Dank!

Leider verrätst Du nicht, was Du mit Steigung und Achsenabschnitt dann tun willtst.
Ich hatte versucht, das Minimalbeispiel auf mein Problem zu reduzieren. Vieleicht sieht es deswegen etwas wirr aus.
Ich erstelle ein Arbeitsdiagramm für eine Destillationsanlage. Die Arbeitspunkte der Anlage liegen auf solchen konstruierten Geraden, deren Anfangs- und Endpunkte wiederum Schnittpunkte anderer Funktionen sind.
Mit Steigung und Achsenabschnitt fällt es deutlich leichter, Betriebspunkte auf diesen Geraden einzuzeichnen.
Viele Grüße
Jens

Antworten