PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : pstricks - Parallelverschiebung



Spindoctor
19-06-2007, 09:19
Hallo!

Ich möchte in pstricks eine Grafik - ähnlich zu dieser hier (http://upload.wikimedia.org/wikipedia/de/7/70/Slutsky-Zerlegung.png) erzeugen.

Zu diesem Zweck muss ich einerseits Tangenten an Kurven anlegen und andererseits Kurven und daran anliegende Tangenten parallel verschieben.

Natürlich wäre es möglich, diese geometrischen Aufgaben vorher mit Zettel und Stift auszurechnen, und dann die Ergebnisse in eine pstricks-Umgebung hineinzuklopfen.

Ich frage mich aber, obs nicht einen eleganteren Weg gibt, Tangenten an Kurven anzulegen und/oder geometrische Objekte parallel zu verschieben. :confused:

Hat jemand eine Idee?

Danke im Vorraus

localghost
19-06-2007, 16:29
Folgen die Kurven IS, I1 und I2 einer Funktionsvorschrift? Und wenn ja, welcher?

Spindoctor
19-06-2007, 18:51
zunächst danke für die Antwort!

Die Kurven sollen schon einer Funktionsvorschrift entsprechen - welcher ist nicht so wichtig.

Wichtig ist nur, dass sie konvex sind, das für alle x gilt f(x) < f(x-1) und dass sie sich assymptotisch den beiden Achsen bzw. Parallelen der Achsen nähern und dass die Kurven entlang einer Geraden verschoben werden.

Vielleicht hab ich jetzt irgendeine Eigenschaft vergessen...

jdfs. würden die beiden Funktionen

f(x) = 1/x
und
g(x) = [1/(x-1)]+1

die Bedingungen erfüllen. (zum. im 1. Quadranten)

Die eine Frage ist jetz, ob ich die g(x) durch einen pstricks-Befehl aus f(x) erzeugen kann, ohne g(x) auszurechnen.

Die zweite Frage ist, ob ich mit einem pstricks-Befehl eine Tangente an eine der beiden Funktionen legen kann (etwa h(x) = 2-x ), ohne mir die Tangente vorher auszurechnen. (Klarerweise muss ich einen Punkt für die Tangente definieren, sonst gibt es ja unendlich viele Möglichkeiten).

Spindoctor
21-06-2007, 09:40
hat niemand eine idee?

sofa-surfer
21-06-2007, 09:54
Hallo,

für Tangenten kannst du dir mal den \psplotTangent-Befehl aus dem pstricks-add-Paket anschauen. Zur Parallelverschiebung kann ich dir gerad auch nicht so viel sagen. Wenn du die Funktion allerdings eh mit pstricks zeichnest, dann musst du doch aber nur die Funktionsvorschrift um eine additive Konstante erweitern, oder sehe ich da was falsch?

Matthias

Spindoctor
21-06-2007, 16:55
für Tangenten kannst du dir mal den \psplotTangent-Befehl aus dem pstricks-add-Paket anschauen.cool!
werd ich gleich mal machen
Zur Parallelverschiebung kann ich dir gerad auch nicht so viel sagen. Wenn du die Funktion allerdings eh mit pstricks zeichnest, dann musst du doch aber nur die Funktionsvorschrift um eine additive Konstante erweitern, oder sehe ich da was falsch?um 2 additive Konstanten - eine für jede Achse. Aber schwer is es nicht, da hast du recht!

localghost
21-06-2007, 20:31
Hier mal ein sehr grober Ansatz. Ist nicht besonders schön und daher stark ausbaufähig.

\begin{figure}[!ht]
\centering
\psset{llx=-1cm,lly=-1cm,xAxisLabel=X [ME],xAxisLabelPos={7.5cm,-1cm},yAxisLabel=Y [ME],yAxisLabelPos={-1cm,5cm}}
\begin{psgraph}[axesstyle=frame](0,0)(15,10){15cm}{10cm}
\psplot[algebraic,linecolor=blue]{0.75}{10}{1+(5/x)}
\psplotTangent[algebraic,linecolor=blue]{2}{4}{1+(5/x)}
\psplot[algebraic,linecolor=blue]{3.75}{13}{1+5/(x-3)}
\psplotTangent[algebraic,linecolor=blue]{6}{7}{1+5/(x-3)}
\psplot[algebraic,linecolor=red]{3.75}{14}{1.5+5/(x-3)}
\psplotTangent[algebraic,linecolor=red]{5}{4}{1.5+5/(x-3)}
\end{psgraph}
\caption{\textsc{Slutsky}"=Zerlegung}\label{fig:slutsky}
\end{figure}
Es wäre zu überlegen, ob die psgraph-Umgebung nicht durch eine pspicture*-Umgebung ersetzt werden sollte, damit die überlangen Tangenten nicht herausragen. Dann müssten allerdings auch die Achsen mit \psaxes gezeichnet und noch andere Anpassungen vorgenommen werden.

Spindoctor
22-06-2007, 10:44
Danke localghost!

Die psgraph-Umgebung will bei mir zwar nicht ganz (hab bisher immer pspicture verwendet), aber wenn ich die beiden Umgebungen austausche, beweist Dein Beispiel eindeutig, dass es funktionieren kann.

Leider ist psplotTangent ziemlich schlecht dokumentiert (ich hab jdfs. erst eine Anleitung gefunden). Der erste Parameter gibt den Wert auf der x-Achse an, in dem die Tangente die Kurve berührt. Der letzte Parameter gibt die abzuleitende Funktionsvorschrift an. Soweit so gut.
Aber was macht der 2. Parameter?

sofa-surfer
22-06-2007, 10:53
Hallo,

die Bedeutung der drei Argumente ist doch im entsprechenden Abschnitt der Doku (http://www.ctan.org/tex-archive/graphics/pstricks/contrib/pstricks-add/pstricks-add-doc.pdf) von pstricks-add (Seite 104) beschrieben ...

Matthias

Spindoctor
22-06-2007, 11:23
Die Worte las ich wohl, allein es fehlte... das Verständnis.
Zumindest bis jetzt. Habs mir nochmal angeschaut.
Der 2. Parameter sagt wieviele Einheiten auf der x-Achse nach rechts und nach links die Tangente gezeichnet werden soll (das wird in der Doku mit dx bezeichnet, was ich nicht auf Anhieb verstanden hab).

Na gut...
bleibt noch die frage, wie ich die tangente auf der einen seite abschneiden kann, damit sie nicht über die achsen hinaussteht.
aber das find ich ja vielleicht eh in der doku...
wenn das jemand allerdings ganz spontan weiß... ;)

danke,

Spin

localghost
22-06-2007, 16:22
[…] Na gut...
bleibt noch die frage, wie ich die tangente auf der einen seite abschneiden kann, damit sie nicht über die achsen hinaussteht.
aber das find ich ja vielleicht eh in der doku...
wenn das jemand allerdings ganz spontan weiß […]
Nun, die einfachste Möglichkeit wäre gewesen, die psgraph-Umgebung durch eine psgraph*-Umgebung zu ersetzen. Das hat aber zur Folge, das alles außerhalb der Achsen ebenfalls abgetrennt wird, also auch die Beschriftung und die Skalierung. Du kannst es ja mal testen. Deshalb ist es besser, den eigentlichen Inhalt des Diagramms in einen Clip zu setzen.

\begin{figure}[!ht]
\centering
\psset{llx=-1cm,lly=-1cm,xAxisLabel=X [ME],xAxisLabelPos={7.5cm,-1cm},yAxisLabel=Y [ME],yAxisLabelPos={-1cm,5cm}}
\begin{psgraph}[axesstyle=frame](0,0)(15,10){15cm}{10cm}
\begin{psclip}{\psframe[linestyle=none](0,0)(15,10)}
\psplot[algebraic,linecolor=blue]{0.75}{10}{1+(5/x)}
\psplotTangent[algebraic,linecolor=blue]{2}{5}{1+(5/x)}
\psplot[algebraic,linecolor=blue]{3.75}{13}{1+5/(x-3)}
\psplotTangent[algebraic,linecolor=blue]{6}{7}{1+5/(x-3)}
\psplot[algebraic,linecolor=red]{3.75}{14}{1.5+5/(x-3)}
\psplotTangent[algebraic,linecolor=red]{5}{5}{1.5+5/(x-3)}
\end{psclip}
\end{psgraph}
\caption{\textsc{Slutsky}"=Zerlegung}\label{fig:slutsky}
\end{figure}
Alles, was nicht zum Diagramm gehört (Linien und Bezeichnungen), setzt Du dann ganz normal außerhalb der psclip-Umgebung. Um noch alles unterzubringen, was da zwischen den Linien und unterhalb des Diagramms steht (Gesamtveränderung, …), musst Du die Werte für llx und lly (Trimwerte) anpassen. Eben halt entsprechend dem Platz, den du noch links neben oder unter dem Diagramm brauchst.

Spindoctor
22-06-2007, 16:27
Lieber localghost!

Das ist genau die Antwort, die ich heute schon vergeblich im Internet gesucht habe!

Vielen Dank!!!

Spin

localghost
22-06-2007, 16:34
Und wenn Du damit fertig bist, dann präsentiere uns das Ergebnis (mit Quelltext) doch mal.


Thorsten

Spindoctor
24-06-2007, 13:32
Liebe Leute!

Danke nochmal für die Hilfe.

Hier das Ergebnis
\documentclass[a4paper,twoside]{scrreprt}

\usepackage{pstricks-add}
\usepackage{pst-pdf}

\usepackage[margin=10pt,font=small,labelfont=bf,position=botto m,aboveskip=0pt,belowskip=10pt,format=plain,indent ion=.5cm]{caption}

\begin{document}

\begin{pspicture}(-0.5,-0.5)(15,12)
\psaxes[ticks=none,linewidth=1pt]{->}(0,0)(0,0)(13,10)
\rput(-0.2,-0.2){$0$}
\rput[r]{0}(13.2,-0.3){Freizeit (in Stunden)}
\rput[r]{90}(-0.3,10.2){Konsum (in Geldeinheiten)}

\begin{psclip}{\psframe[linestyle=none](0,0)(13,10)}
\psplot[algebraic,linewidth=1.5pt]{0.0001}{13}{(6/x)+1}

\psplotTangent[algebraic,linewidth=1.5pt]{4.38596}{10}{(6/x)+1}

\psplot[algebraic,linewidth=1.5pt]{3.0001}{13}{6/(x-3)+2}

\psplotTangent[algebraic,linewidth=1.5pt]{6}{10}{6/(x-3)+2}
\psplotTangent[algebraic,linewidth=1.5pt]{7.386}{10}{6/(x-3)+2}

\end{psclip}
\end{pspicture}

\end{document}

Es handelt sich hierbei nicht um eine Slutsky-Zerlegung (http://www.mikroo.de/hh/ks/hhksef.htm), wie ich es ursprünglich vor hatte, sondern um eine Hicks-Zerlegung (http://www.mikroo.de/hh/ks/hhksef_zb1.htm), die leichter zu verstehen ist und einen ähnlichen (ich würde nichtmal von einem schlechteren sprechen) Erklärungsgehalt hat.

Wenn man sich noch länger damit befasst, sollte man natürlich auch die Beschriftung im präsentierten Beispiel erweitern. Ich hab das aber doch nicht gemacht, weil ich mich schlußendlich dagegen entschieden hab, die pstricks-Grafik in meine Diplomarbeit einzubauen. In Büchern gibt es aussagekräftigere Grafiken und das einscannen erfordert weniger Arbeit als mich so lange mit den Zahlen spielen, bis alles passt. Natürlich ist ein Scan nicht ganz so schön...

Zu erwähnen bleibt, dass der Befehl \psplotTangent mir leider kaum geholfen hat. Es ist mir nämlich nicht erspart geblieben, jede einzelne verwendete Tangente mit Zettel und Stift auszurechnen, um die verwendeten x-Werte (4.38596 und 7.386) zu bekommen.

Ich versuche (unökonomisch) zu erklären warum:
Zuerst habe ich die Tangente
\psplotTangent[algebraic,linewidth=1.5pt]{6}{10}{6/(x-3)+2}erstellt.
Die Tangente zur Funktion
\psplot[algebraic,linewidth=1.5pt]{0.0001}{13}{(6/x)+1}musste die selbe Nullstelle wie diese erste Tangente haben (also durch den Punkt (??/0) gehen. Die Nullstelle hätte ich ohnehin ausrechnen müssen (sie ist (12/0)). Danach musste ich für den Befehl \psplotTangent allerdings auch noch jenen x-Wert auf der Funktion {(6/x)+1} finden, bei dem eine Tangente mit der Nullstelle (12/0) die Funktion {(6/x)+1} berührt.
Nach vielen Rechenschritten kam ich zum Ergebnis (x=4,38596) und
\psplotTangent[algebraic,linewidth=1.5pt]{4.38596}{10}{(6/x)+1}
Hier hätte ich also einen Befehl gebraucht, bei dem ich den Punkt (12/0) und die Funktion {(6/x)+1} angebe, und daraus die Tangente berechnet wird.

Im nächsten Schritt musste ich eine Tangente berechnen, die die selbe Steigung wie die zuvor ausgerechnete Tangente
\psplotTangent[algebraic,linewidth=1.5pt]{4.38596}{10}{(6/x)+1}hat, aber wieder an die obere Funktion
\psplot[algebraic,linewidth=1.5pt]{3.0001}{13}{6/(x-3)+2} angelegt ist. Auch hier habe ich mir den x-Wert (x=7.386) händisch ausrechnen müssen. Ich hätte einen Befehl gebraucht, in dem ich die zuletzt verwendete Tangente parallel verschiebe, bis sie die Funktion 6/(x-3)+2 in nur einem Punkt berührt.

Danke trotzdem für die Hilfe. Vielleicht ist der Befehl psplotTangent ja nicht für solche Anwendungen gedacht. Jdfs. wäre er in meinen Augen ausbaufähig.

Ciao,

Spin

P.S.: Was mich übrigens gewundert hat, ist dass (zumindest in FoxIt) der Befehl
\rput[r]{90}(-0.3,10.2){Konsum (in Geldeinheiten)}nicht "Konsum (in Geldeinheiten)" sondern das ganze Blatt (ausser "Konsum (in Geldeinheiten)") um 90 Grad gedreht hat.

Goldnas
03-08-2012, 00:31
\begin{document}

\begin{pspicture}(-0.5,-0.5)(15,12)
\psaxes[ticks=none,linewidth=1pt]{->}(0,0)(0,0)(13,10)
\rput(-0.2,-0.2){$0$}
\rput[r]{0}(13.2,-0.3){Freizeit (in Stunden)}
\rput[r]{90}(-0.3,10.2){Konsum (in Geldeinheiten)}

\begin{psclip}{\psframe[linestyle=none](0,0)(13,10)}
\psplot[algebraic,linewidth=1.5pt]{0.0001}{13}{(6/x)+1}

\psplotTangent[algebraic,linewidth=1.5pt]{4.38596}{10}{(6/x)+1}

\psplot[algebraic,linewidth=1.5pt]{3.0001}{13}{6/(x-3)+2}

\psplotTangent[algebraic,linewidth=1.5pt]{6}{10}{6/(x-3)+2}
\psplotTangent[algebraic,linewidth=1.5pt]{7.386}{10}{6/(x-3)+2}

\end{psclip}
\end{pspicture}

\end{document}[/CODE]

Es handelt sich hierbei nicht um eine Slutsky-Zerlegung (http://www.mikroo.de/hh/ks/hhksef.htm), wie ich es ursprünglich vor hatte, sondern um eine Hicks-Zerlegung (http://www.mikroo.de/hh/ks/hhksef_zb1.htm), die leichter zu verstehen ist und einen ähnlichen (ich würde nichtmal von einem schlechteren sprechen) Erklärungsgehalt hat.

Wenn man sich noch länger damit befasst, sollte man natürlich auch die Beschriftung im präsentierten Beispiel erweitern. Ich hab das aber doch nicht gemacht, weil ich mich schlußendlich dagegen entschieden hab, die pstricks-Grafik in meine Diplomarbeit einzubauen. In Büchern gibt es aussagekräftigere Grafiken und das einscannen erfordert weniger Arbeit als mich so lange mit den Zahlen spielen, bis alles passt. Natürlich ist ein Scan nicht ganz so schön......



P.S.: Was mich übrigens gewundert hat, ist dass (zumindest in FoxIt) der Befehl
\rput[r]{90}(-0.3,10.2){Konsum (in Geldeinheiten)}nicht "Konsum (in Geldeinheiten)" sondern das ganze Blatt (ausser "Konsum (in Geldeinheiten)") um 90 Grad gedreht hat.

Das Problem kenn ich auch, dafür hab ich bisher ebenfalls keine Lösung.

LG Goldnas