Seite 1 von 1

Tikz Schnittpunkte zweier Funktionen auf X-Achse einzeichnen

Verfasst: Mi 23. Nov 2011, 02:41
von sf
Hallo,

ich versuche zur Zeit meine Mathematik-Mitschrift mit Latex zu realisieren, beschäftige mich allerdings noch nicht allzulange mit dem Thema.

Im speziellen versuche ich zur Zeit mit Hilfe von Tikz ein Koordinatensystem zu erstellen,
in welches ich zwei Funktionen, sowie deren Schnittpunkte mit einer gestrichelten Linie auf der X-Achse einzeichnen möchte.
Diese Punkte möchte ich dann noch mit xi* bezeichnen.

Alles bis auf die Bezeichnung habe ich auch schon mehr oder weniger hinbekommen, da allerdings die Position der Bezeichnung variieren müsste,
bin ich mir nich sicher, wie ich dies realisieren könnte.

Google habe ich natürlich auch schon brav befragt, dort hab ich aber leider nur eine Lösung gefunden um den Punkt sowohl auf X- als auch Y-Achse einzuzeichnen (d.h. zwei Striche).

Hier mein Code bisher:
\documentclass{scrartcl}

\usepackage[latin1]{inputenc}
\usepackage{ifthen}
\usepackage{tikz}
\usetikzlibrary{intersections}
\usetikzlibrary{calc}

\begin{document}
\begin{tikzpicture}[domain=-2:2,scale=2]

	\draw[ultra thin,color=lightgray][step=5mm] (-1.9,-1.3) grid (1.9,1.3);   % Grid
	\draw[semithick,<->] (-2.0, 0.0)--( 2.0, 0.0) node (xaxis) [right] {$x$}; % X-Achse
	\draw[semithick,<->] ( 0.0,-1.4)--( 0.0, 1.4) node (yaxis) [above] {$y$}; % Y-Achse

	% Farbdefinition
	\xdefinecolor{darkgreen}{RGB}{0, 127, 14}

	% Funktionen
	\draw[semithick,color=red, name path=F] plot[id=f]
	function{0.6*x-0.1} node[right] {$f(x)=0.6x-0.1$};
	\draw[semithick,color=darkgreen, name path=G] plot[id=g]
	function{sin(x)}    node[right] {$g(x)=\sin x$};

	\fill[name intersections={of=F and G,total=\t}][color=blue]
	\foreach \s in {1,...,\t}{(intersection-\s) circle (1pt)};

  \draw[name intersections={of=F and G,total=\t}][dashed,semithick,color=blue]
	\foreach \s in {1,...,\t}
	{
		let
    	\p1=(intersection-\s)
		in
			(\x1,0)-- (intersection-\s)
	};

\end{tikzpicture}
\end{document}
Ich einer früheren Version habe ich die Schnittpunkte von Hand bestimmt und eingezeichnet.
Falls es allerdings eine automatische Realisierung gibt, wäre es sicher für zukünftige Graphen nicht schlecht zu wissen, wie diese funktioniert.

Im Anhang habe ich ein Bild angefügt, wie die Bezeichnung aussehen soll.

Vielen Dank für jegliche Hilfe im Vorraus,
mit freundlichen Grüßen

PS: Falls man das Beispiel vereinfachen kann, z.B. die foreach Schleifen oder ähnliches zusammenfassen, bitte ich dies zu verzeihen, ich habe es nicht anders hinbekommen :(

sf

Verfasst: Mi 23. Nov 2011, 11:03
von bloodworks
Like this... Ich denke mal das isses.
\documentclass{scrartcl} 

\usepackage[latin1]{inputenc} 
\usepackage{ifthen} 
\usepackage{tikz} 
\usetikzlibrary{intersections} 
\usetikzlibrary{calc} 


\begin{document} 
\begin{tikzpicture}[domain=-2:2,scale=2] 

    \draw[ultra thin,color=lightgray][step=5mm] (-1.9,-1.3) grid (1.9,1.3);   % Grid 
    \draw[semithick,<->] (-2.0, 0.0)--( 2.0, 0.0) node (xaxis) [right] {$x$}; % X-Achse 
    \draw[semithick,<->] ( 0.0,-1.4)--( 0.0, 1.4) node (yaxis) [above] {$y$}; % Y-Achse 

    % Farbdefinition 
    \xdefinecolor{darkgreen}{RGB}{0, 127, 14} 

    % Funktionen 
    \draw[semithick,color=red, name path=F] plot[id=f] 
    function{0.6*x-0.1} node[right] {$f(x)=0.6x-0.1$}; 
    \draw[semithick,color=darkgreen, name path=G] plot[id=g] 
    function{sin(x)}    node[right] {$g(x)=\sin x$}; 
    \fill[name intersections={of=F and G,total=\t}][color=blue] 
    \foreach \s in {1,...,\t}{(intersection-\s) circle (1pt)};

   \draw[ name intersections={of=F and G,total=\t}][dashed,semithick,color=blue] 
    \foreach \s in {1,...,\t} 
    { 
       let 
        \p1=(intersection-\s) 
       in 
         (intersection-\s) -- (\x1,0)
         \ifdim \x1 >0pt
   node[below] {$x_\s^*$} \else node[above] {$x_\s^*$} \fi } ; 

\end{tikzpicture} 
\end{document}
Ich hoffe jetzt mal einfach, dass der Nullpunkt auf wirklich bei 0pt liegt, sonst ist diese Lösung nicht allgemein. Und bitte frag mich nicht, was er macht, wenn man die scale oder die domain ändert. Es sieht für mich so aus, als würde sich da \total verändern. Warum und wieso ist mit aber völlig unklar. Wenn man das verhindern will muss man ggf. eine weitere Schleife einbauen, die die subscripte bei den x Bezeichnern durchgeht.

Verfasst: Mi 23. Nov 2011, 14:46
von sf
bloodworks hat geschrieben:Und bitte frag mich nicht, was er macht, wenn man die scale oder die domain ändert. Es sieht für mich so aus, als würde sich da \total verändern. Warum und wieso ist mit aber völlig unklar.
Das ist echt seltsam. Das Problem tritt seltsamerweise bei unterschiedlichen Scale Werten auch unterschiedlich auf. Mal sind es 6 Schnittpunkte, mal 4. Die Domain scheint aber, solange der Scale Wert stimmt egal zu sein.

Ich werd später ein wenig recherchieren ob ich dazu eine Lösung finde. Danke dir auf jeden Fall schonmal für deine schnelle Hilfe. :)

Verfasst: Mi 23. Nov 2011, 16:25
von sf
Hallo,

ich denke ich habe meinen Fehler gefunden. Es gibt eine Option "smooth" die dafür sorgt, dass eine Funktion als Kurve anstatt zusammengesetzter Linien geplottet wird.
The smooth option joins these points with a curve, in contrast to line segments.
Quelle: http://www.tug.org/TUGboat/tb28-1/tb88mertz.pdf

Wenn ich also...
(...)
    \draw[smooth,semithick,color=red, name path=F] plot[id=fx] function{0.6*x-0.1} node[right] {$f(x)=0.6x-0.1$};
(...)
schreibe, entstehen auch bei anderen Scale Werten nur 3 Punkte.

PS: Nochmal danke für deine Lösung mit der if Bedingung!

Mfg

Verfasst: Mi 23. Nov 2011, 16:34
von bloodworks
Ah ja das hört sich vernünftig an. Allerdings frage ich mich, warum es dann mehr als zwei Nummern gibt. Ich würde ja erwarten, dass dort nur zwei Segmente sind.

Verfasst: Mi 23. Nov 2011, 16:36
von sf
Gute Frage, versteh ich auch nicht so ganz. Aber wie gesagt, ich habe verschiedene Scale Werte durchprobiert und festgestellt, dass die Anzahl der Punkte immer variiert hat. Deswegen hatte ich dann die Vermutung, dass es sich um irgendeine Art von Ungenauigkeit handeln müsste.

Verfasst: Mi 23. Nov 2011, 16:44
von bloodworks
Ja in der Tat. Also Ungenau ist TeX in der Tat. Das kann man aber auch mit dem Einsatz von Gnuplot und einer hohen samples Rate verbessen. zB http://www.disk0s1.de/posts/latex/ein-p ... -pgfplots/

Aber im großen und ganzen holt pgf schon das Maximale aus (La)TeX raus.

Grüße

Verfasst: Mi 23. Nov 2011, 22:05
von guy.brush™
Ich kann gerade den Code nicht ausprobieren, aber mir fiel noch ein Befehl ein, vielleicht erleichtert der das Gewünschte etwas?
(2,3) |- (4,2)
[Im Handbuch bei "perpendicular" zu finden.]

Letztendlich bezeichnet obiger Ausdruck, so wie ich das verstanden habe, den Schnittpunkt einer vertikalen Linie durch den Punkt (2,3) und einer horizontalen Linie durch den Punkt (4,2).

Verfasst: Mi 23. Nov 2011, 23:06
von cgnieder
An guy.brush(TM)s Vorschlag musste ich auch spontan denken. Geht damit auch, ob es einfacher ist, wage ich allerdings zu bezweifeln...
\documentclass{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage{ifthen,tikz}
\usetikzlibrary{intersections,calc}

\begin{document}
\begin{tikzpicture}[domain=-2:2,scale=2]
  \draw[ultra thin,color=lightgray][step=5mm] (-1.9,-1.3) grid (1.9,1.3);  % Grid
  \draw[semithick,->] (-2.0, 0.0)--( 2.0, 0.0) node (x-axis) [right] {$x$}; % X-Achse
  \draw[semithick,->] ( 0.0,-1.4)--( 0.0, 1.4) node (y-axis) [above] {$y$}; % Y-Achse
  \draw[semithick] (1,.05) -- (1,-.05) node [below] {\small$1$};
  \draw[semithick] (.05,1) -- (-.05,1) node [left] {\small$1$};

  % Farbdefinition
  \xdefinecolor{darkgreen}{RGB}{0, 127, 14}

  % Funktionen
  \draw[smooth,semithick,color=red, name path=F] plot[id=f]
    function{0.6*x-0.1} node[right] {$f(x)=0.6x-0.1$};
  \draw[smooth,semithick,color=darkgreen, name path=G] plot[id=g]
    function{sin(x)}    node[right] {$g(x)=\sin x$};
  \fill[name intersections={of=F and G,total=\t}][color=blue]
    \foreach \s in {1,...,\t}{(intersection-\s) circle (1pt)};

  \draw[ name intersections={of=F and G,total=\t}][dashed,semithick,color=blue]
    \foreach \s in {1,...,\t}
      {
        (intersection-\s) -- (intersection-\s |- x-axis)
        ($(intersection-\s |- x-axis)!1.1mm!180:(intersection-\s)$) node {$x_\s^*$}
      };
\end{tikzpicture}
\end{document}
Gruß

Verfasst: Do 24. Nov 2011, 00:47
von sf
Oh, interessant. Damit war auch das von mir erwähnte Beispiel[1] gelöst, bei dem jeweils eine Linie zu jeder Achse gezeichnet wurde. Genau genommen stammen daher überhaupt erst die Namen für die Achsen in meinem Code. Die hatte ich ursprünglich nämlich nicht benannt.

Leider habe ich es nicht geschafft genanntes Beispiel für meine Bedürfnisse umzusetzen. Muss ich mir aber in einer ruhigen Minuten auf jeden Fall auch noch einmal genauer anschauen, damit ich dahinter steige.

Danke auf jeden Fall auch dir für deine Lösung.

MfG
sf

[1] http://www.texample.net/tikz/examples/i ... ing-lines/