summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/pst-func
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2014-05-20 22:00:54 +0000
committerKarl Berry <karl@freefriends.org>2014-05-20 22:00:54 +0000
commit22ffe2908d71591f30ac96514d5ad0a71113766d (patch)
treec293af2202b3e0d95e3d11f6f721bd5c4eebc76b /Master/texmf-dist/tex/generic/pst-func
parent8db754efe5c2736dfbd92d0fe891c6cc89e4071d (diff)
pst-func (19may14)
git-svn-id: svn://tug.org/texlive/trunk@34156 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/generic/pst-func')
-rw-r--r--Master/texmf-dist/tex/generic/pst-func/pst-func.tex170
1 files changed, 167 insertions, 3 deletions
diff --git a/Master/texmf-dist/tex/generic/pst-func/pst-func.tex b/Master/texmf-dist/tex/generic/pst-func/pst-func.tex
index cf5c27b9d78..790f1d01006 100644
--- a/Master/texmf-dist/tex/generic/pst-func/pst-func.tex
+++ b/Master/texmf-dist/tex/generic/pst-func/pst-func.tex
@@ -1,4 +1,4 @@
-%% $Id: pst-func.tex 897 2014-03-21 08:06:41Z herbert $
+%% $Id: pst-func.tex 918 2014-05-19 12:32:37Z herbert $
%%
%% This is file `pst-func.tex',
%%
@@ -23,6 +23,7 @@
\ifx\PSTricksLoaded\endinput\else \input pstricks.tex\fi
\ifx\PSTnodesLoaded\endinput\else \input pst-plot.tex\fi
\ifx\PSTmathLoaded\endinput \else \input pst-math.tex\fi
+\ifx\PSTtoolsLoaded\endinput \else \input pst-tools.tex\fi
\ifx\PSTricksAddLoaded\endinput\else\input pstricks-add.tex\fi
\ifx\PSTXKeyLoaded\endinput\else \input pst-xkey.tex \fi
%
@@ -30,8 +31,8 @@
% interface to the `xkeyval' package
\pst@addfams{pst-func}
%
-\def\fileversion{0.79}
-\def\filedate{2014/03/21}
+\def\fileversion{0.80}
+\def\filedate{2015/05/19}
\message{`PST-func' v\fileversion, \filedate\space (hv)}
%
\pstheader{pst-func.pro}
@@ -100,6 +101,47 @@
zeroLineWidth=0.5\pslinewidth,%
zeroLineColor=black}%
%
+\def\psGetZeros{\pst@object{psGetZeros}}
+\def\psGetZeros@i(#1,#2)#3{%
+ \pst@killglue
+ \begin@SpecialObj
+ \use@par
+ \typeout{>>> GetZeros}%
+ \addto@pscode{
+ tx@FuncDict begin
+ /xStart #1 def /xEnd #2 def
+ /x xStart def
+ /func { /x exch def \ifPst@algebraic (#3) AlgParser cvx exec \else #3 \fi } def
+ #1 Steffensen
+ \ifPst@markZeros \fi
+ end
+ }%
+ \end@SpecialObj
+\ignorespaces
+}
+\iffalse
+/Steffensen {% the start value and the function must be on top of the stack
+ /y0 exch def % the start value
+ /Iter 0 def /MaxIter 200 def
+ {
+ y0 Function /F exch def
+ F abs eps2 lt { exit } if
+ y0 F sub /Phi exch def
+ Phi Function /F2 exch def
+ F2 abs eps2 le { exit }{
+ Phi y0 sub dup mul Phi F2 sub 2 Phi mul sub y0 add Div /Diff exch def
+ y0 Diff sub /y0 exch def
+ Diff abs eps1 le { exit } if
+ } ifelse
+ /Iter Iter 1 add def
+ Iter MaxIter gt { exit } if
+ } loop
+ y0 % the returned value ist the zero point
+ 0 \tx@ScreenCoor pstack
+ 3 0 360 arc gsave 0 0 1 setrgbcolor fill grestore 1 setlinewidth stroke
+} def
+\fi
+%
\def\psPolynomial{\pst@object{psPolynomial}}
\def\psPolynomial@i#1#2{%
\pst@killglue%
@@ -1225,6 +1267,128 @@
\endgroup
\ignorespaces}
%
+\define@boolkey[psset]{pst-func}[Pst@]{Newton}[true]{}
+\define@boolkey[psset]{pst-func}[Pst@]{PrintCoord}[true]{}
+\define@boolkey[psset]{pst-func}[Pst@]{onlyNode}[true]{}
+\define@boolkey[psset]{pst-func}[Pst@]{onlyYVal}[true]{}
+\define@boolkey[psset]{pst-func}[Pst@]{originV}[true]{}
+\define@key[psset]{pst-func}{PointName}[]{\def\psk@PointName{#1}}
+\define@key[psset]{pst-func}{ydecimals}[2]{\pst@getint{#1}\psk@ydecimals }
+\psset[pst-func]{originV=false,onlyNode=false,ydecimals=2,
+ PrintCoord=false,onlyYVal=false,Newton=false,PointName=I,
+}
+%--------------------------------------------------------------------
+%------------- calculate the value of an intersectionpoint -----------
+%---------------------------------------------------------------------
+\def\psZero{\def\pst@par{}\pst@object{psZero}}
+\def\psZero@i(#1,#2)#3{\@ifnextchar[{\psZero@ii(#1,#2)#3}{\psZero@ii(#1,#2){#3}[0]}}
+\def\psZero@ii(#1,#2)#3[#4]#5{%
+% (#1,#2) Intervall für die Nullstelle, bzw #1 Startwert für Newton, #3 1. Funktion, #4 2. Funktion, #5 Knotenname
+ \begingroup
+ \pst@killglue
+% \addbefore@par{fontscale=40,PSfont=Times-Roman}%
+ \use@par
+ \pstVerb{
+ /FunctionA
+ \ifPst@algebraic (#3) tx@AlgToPs begin AlgToPs end cvx \else {#3} \fi def
+ /FunctionB
+ \ifPst@algebraic (#4) tx@AlgToPs begin AlgToPs end cvx \else {#4} \fi def
+ \ifPst@Newton % --------------------------- Newton-Verfahren --- TS 05.2014
+ /eps 1e-6 def % eps f\"{u}r (f(x+eps)-f(x))/eps
+ /x0 #1 def % Startwert wird vorgegeben
+ /Xend x0 def
+ {
+ /xe x0 eps add def % xe=x+eps
+ /x x0 def % x nun x0 setzen, damit f(x0) berechnet werden kann
+ /func0 FunctionA FunctionB sub def % func0=F(x0)-FB(x0)
+ func0 0 eq {exit} if % wenn func0 = 0 -> exit
+ /x xe def % x xe setzen
+ /func1 FunctionA FunctionB sub def % func1=F(xe)-FB(xe)
+ /Xend x0 func0 eps mul func1 func0 sub div sub def % Xend=x0-(func0*eps)/(func1-func0)
+ /x Xend def % x wird nun Xend
+ /funcend FunctionA FunctionB sub def % funcend=F(Xend)-FB(Xend)
+ funcend abs 1e-6 le {exit} if % Wenn funcend < 1e-6 -> exit
+ /x0 Xend def % sonst x0 = Xend und
+ } loop % die Schleife beginnt mit x0 = Xend
+ /xM Xend def
+ \else % -------------------- Intervallhalbierungsverfahren von Manuel L.
+ /Xinf #1 def % linker Wert des Intervalls, in dem die Nullstelle gesucht wird
+ /Xsup #2 def % linker Wert des Intervalls, in dem die Nullstelle gesucht wird
+ { /xM Xinf Xsup add 2 div def % Mittelwert -> Mitte des Intervalls ist xM2
+ /x Xinf def % Variable x wird als linker Wert festgelegt
+ /F_1 FunctionA FunctionB sub def % Definition der Differenzfunktion F_1 an der Stelle x=Xinf2
+ /x xM def % Variable x wird als Mittelwert festgelegt
+ /F_M FunctionA FunctionB sub def % Definition der Differenzfunktion F_M an der Stelle x=xM2
+ F_M 0 eq {exit} if % Ist F_M = 0 => fertig
+ F_1 F_M mul 0 ge {/Xinf xM def} {/Xsup xM def} ifelse % F_1 * F_M > 0 (F_1 und F_M haben gleiches VZ) => neuer linker x-Wert = xM2
+ Xinf Xsup sub abs 1e-6 le {exit} if } loop % Die Schleife endet, wenn die Differenz von linkem und rechtem Wert < 10^-6
+ \fi
+ /x xM def FunctionA /yM exch def % x wird Mittelwert und an dieser Stelle die Funktion berechnet und als yM2 definiert
+ }%
+ \pnode(! xM yM){#5}%
+ \addto@pscode{
+ \ifPst@onlyNode \else
+ /dec \psk@decimals\space def % Anzahl der Dezimahlen f\"{u}r x
+ /ydec \psk@ydecimals\space def % Anzahl der Dezimalen f\"{u}r y
+ /symb { /Symbol findfont \psk@fontscale\space scalefont setfont } bind def % Symbolschrift f\"{u}r Klammer und senkrechten Strich
+ /schrift { \psk@PSfont findfont \psk@fontscale scalefont setfont } bind def % Schrift f\"{u}r die Ergebnisse
+ /TiefSchrift { /Symbol findfont \psk@fontscale 1.6 div scalefont setfont } bind def % Schrift f\"{u}r tiefergestellte Buchstaben
+ /spdx \psk@fontscale 4 div def % Abstand, der mit der Schriftg\"{o}{\ss}e skaliert ist
+ /spdy \psk@fontscale 15 div def % Abstand, der mit der Schriftg\"{o}{\ss}e skaliert ist
+ /Wert { 10 dec exp mul round 10 dec exp div dec 0 eq {cvi 15 string cvs} {15 string cvs } ifelse % x-Wert runden und als string ablegen
+ \ifPst@comma dot2comma \fi show } def % gegebenenfalls Komma statt Punkt und Ergebnis anzeigen
+ /yWert { 10 ydec exp mul round 10 ydec exp div ydec 0 eq {cvi 15 string cvs} {15 string cvs } ifelse % y-Wert runden und als string ablegen
+ \ifPst@comma dot2comma \fi show } def % gegebenenfalls Komma statt Punkt und Ergebnis anzeigen
+ /FunctionA \ifPst@algebraic (#3) tx@AlgToPs begin AlgToPs end cvx \else {#3} \fi def
+ /FunctionB \ifPst@algebraic (#4) tx@AlgToPs begin AlgToPs end cvx \else {#4} \fi def
+ \ifPst@Newton
+ /eps 1e-6 def
+ /x0 #1 def
+ /Xend x0 def
+ { /xe x0 eps add def
+ /x x0 def
+ /func0 FunctionA FunctionB sub def
+ func0 0 eq {exit} if
+ /x xe def
+ /func1 FunctionA FunctionB sub def
+ /Xend x0 func0 eps mul func1 func0 sub div sub def
+ /x Xend def
+ /funcend FunctionA FunctionB sub def
+ funcend abs 1e-6 le {exit} if
+ /x0 Xend def
+ } loop
+ /xM Xend def
+ \else
+ /Xinf #1 def /Xsup #2 def
+ { /xM Xinf Xsup add 2 div def
+ /x Xinf def /F_1 FunctionA FunctionB sub def
+ /x Xsup def /F_2 FunctionA FunctionB sub def
+ /x xM def /F_M FunctionA FunctionB sub def
+ F_M 0 eq {exit} if
+ F_1 F_M mul 0 ge {/Xinf xM def} {/Xsup xM def} ifelse
+ Xinf Xsup sub abs 1e-6 le {exit} if } loop
+ \fi
+ /x xM def FunctionA /yM exch def
+ \ifPst@originV 0 0 \else
+ xM \psk@xShift\space add \pst@number\psxunit mul
+ yM \psk@yShift\space add \pst@number\psyunit mul
+ \fi
+ \ifPst@PrintCoord
+ moveto schrift (\psk@PointName) show
+ spdx neg spdy 2 mul neg rmoveto TiefSchrift (\psk@postString) show
+ 0 spdy 3 mul rmoveto symb (\string\050) show
+ 0 spdy neg rmoveto schrift xM Wert
+ spdx 3 div spdy rmoveto symb (\string\174) show
+ spdx 3 div spdy neg rmoveto yM yWert 0 spdy rmoveto symb (\string\051) show
+ \else
+ \ifPst@onlyYVal moveto schrift yM yWert \else moveto schrift xM Wert \fi
+ \fi\fi
+ }%
+ \ifPst@markZeros \psdot(#5)\fi
+\endgroup\use@pscode\ignorespaces
+}%
+%
+
\catcode`\@=\PstAtCode\relax
%
%% END: pst-func.tex