diff options
author | Karl Berry <karl@freefriends.org> | 2014-05-20 22:00:54 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2014-05-20 22:00:54 +0000 |
commit | 22ffe2908d71591f30ac96514d5ad0a71113766d (patch) | |
tree | c293af2202b3e0d95e3d11f6f721bd5c4eebc76b /Master/texmf-dist/tex/generic | |
parent | 8db754efe5c2736dfbd92d0fe891c6cc89e4071d (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')
-rw-r--r-- | Master/texmf-dist/tex/generic/pst-func/pst-func.tex | 170 |
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 |