diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /graphics/pstricks/contrib/pst-func/tex/pst-func.tex |
Initial commit
Diffstat (limited to 'graphics/pstricks/contrib/pst-func/tex/pst-func.tex')
-rw-r--r-- | graphics/pstricks/contrib/pst-func/tex/pst-func.tex | 1929 |
1 files changed, 1929 insertions, 0 deletions
diff --git a/graphics/pstricks/contrib/pst-func/tex/pst-func.tex b/graphics/pstricks/contrib/pst-func/tex/pst-func.tex new file mode 100644 index 0000000000..0bef36090b --- /dev/null +++ b/graphics/pstricks/contrib/pst-func/tex/pst-func.tex @@ -0,0 +1,1929 @@ +%% $Id: pst-func.tex 861 2018-12-13 20:40:06Z herbert $ +%% +%% This is file `pst-func.tex', +%% +%% IMPORTANT NOTICE: +%% +%% Package `pst-func.tex' +%% +%% Herbert Voss <hvoss@tug.org> +%% +%% This program can be redistributed and/or modified under the terms +%% of the LaTeX Project Public License Distributed from CTAN archives +%% in directory macros/latex/base/lppl.txt. +%% +%% DESCRIPTION: +%% `pst-func' is a PSTricks package to plot special functions +%% +%% For a ChangeLog go the the end +%% +\csname PSTfuncLoaded\endcsname +\let\PSTfuncLoaded\endinput +% Requires some PSTricks packages +\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 +% +\edef\PstAtCode{\the\catcode`\@} \catcode`\@=11\relax +% interface to the `xkeyval' package +\pst@addfams{pst-func} +% +\def\fileversion{0.93} +\def\filedate{2019/05/17} +\message{`PST-func' v\fileversion, \filedate\space (hv)} +% +\pstheader{pst-func.pro} +%\pstheader{pst-math.pro}% for GAMMALN +% +% Shortcuts .... + +\def\ChebyshevT{ tx@FuncDict begin ChebyshevT end } +\def\ChebyshevU{ tx@FuncDict begin ChebyshevU end } + +% +\define@key[psset]{pst-func}{epsilon}[1.e-08]{\def\psk@epsilon{#1 }} +\psset[pst-func]{epsilon=1.e-08} +\define@key[psset]{pst-func}{xShift}[0]{\def\psk@xShift{#1}} +\psset[pst-func]{xShift=0} +% +\define@key[psset]{pst-func}{cosCoeff}[0]{\def\psk@cosCoeff{#1}} +\define@key[psset]{pst-func}{sinCoeff}[1]{\def\psk@sinCoeff{#1}} +\psset[pst-func]{cosCoeff=0,sinCoeff=1} % coeff=a0 a1 a2 a3 ... +% +\def\psFourier{\@ifnextchar[{\psFourier@i}{\psFourier@i[]}} +\def\psFourier@i[#1]#2#3{{% + \pst@killglue + \psset{#1} + \psplot[algebraic=false]{#2}{#3}{% + /type (cos) def + /Fourier { + aload length /n exch def + n -1 roll 2 div n 1 roll % a0/2 + n 1 sub -1 0 { + /i exch def + i x mul 180 mul 3.141592 div + type (sin) eq {sin}{cos} ifelse + mul n 1 roll + } for + n 1 sub -1 1 { pop add } for + } def + [\psk@cosCoeff] Fourier + /type (sin) def + [0 \psk@sinCoeff] Fourier add + }% +}\ignorespaces} +% +\define@key[psset]{pst-func}{coeff}[0 1]{\def\psk@coeff{#1}} +\define@key[psset]{pst-func}{Derivation}[0]{\def\psk@Derivation{#1}} +\define@boolkey[psset]{pst-func}[Pst@]{markZeros}[true]{} +\define@key[psset]{pst-func}{epsZero}[0.1]{\def\psk@epsZero{#1}} +\define@key[psset]{pst-func}{dZero}[0.1]{\def\psk@dZero{#1}} +\define@key[psset]{pst-func}{zeroLineTo}[-1]{\def\psk@zeroLineTo{#1}} +\define@key[psset]{pst-func}{zeroLineColor}[black]{\pst@getcolor{#1}\psk@zeroLineColor} +\newdimen\psk@zeroLineWidth +\define@key[psset]{pst-func}{zeroLineWidth}[0.5\pslinewidth]{\pssetlength\psk@zeroLineWidth{#1}} +\define@key[psset]{pst-func}{zeroLineStyle}[dashed]{% + \@ifundefined{psls@#1}% + {\@pstrickserr{Line style `#1' not defined}\@eha}% + {\edef\psk@zeroLineStyle{#1}}% +} +\psset[pst-func]{% + coeff=0 1, % coeff=a0 a1 a2 a3 ... + Derivation=0, % 0 is the original function + markZeros=false,% no dots for the zeros + epsZero=0.1, % the distance between two zero points + dZero=0.1, % the distance of the x value for scanning the function + zeroLineTo=-1, % a line to the value of the lineTo's Derivation (-1= none) + zeroLineStyle=dashed,% + zeroLineWidth=0.5\pslinewidth,% + zeroLineColor=black}% +% +\def\psGetZeros{\pst@object{psGetZeros}} +\def\psGetZeros@i(#1,#2)#3{% + \pst@killglue + \begin@SpecialObj + \use@par + \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% + \begingroup% + \use@par% + \@nameuse{beginplot@\psplotstyle}% + \gdef\psplot@init{}% + \@nameuse{testqp@\psplotstyle}% + \addto@pscode{% + tx@FuncDict begin + /coeff [ \psk@coeff ] def + /x0 #1 def /x1 #2 def + /dx x1 x0 sub \psk@plotpoints\space div def + /Derivation \psk@Derivation\space def + /x x0 def + \ifPst@markZeros + 5 dict begin % hold all local! + gsave + \pst@number\psk@zeroLineWidth SLW + \pst@usecolor\psk@zeroLineColor + \psk@epsZero\space \psk@dZero\space FindZeros + aload length { % zero array is on stack + /xZero exch def + xZero \pst@number\psxunit mul /xPixel exch def + \psk@dotsize + \@nameuse{psds@\psk@dotstyle}% + xPixel 0 Dot + \psk@zeroLineTo\space 0 ge { % line to function \psk@lineTo + xPixel 0 moveto + xZero coeff \psk@zeroLineTo\space FuncValue + \pst@number\psyunit mul xPixel exch L + \@nameuse{psls@\psk@zeroLineStyle} + } if + } repeat + grestore + end + \fi + /xy { + x \psk@xShift\space sub coeff Derivation FuncValue \pst@number\psyunit mul + x \pst@number\psxunit mul exch + } def + xy moveto + }% + \if@pst% lines and dots + \psPolynomial@iii% + \else% curves + \psPolynomial@ii% + \fi% + \endgroup +\ignorespaces} +% +\def\psPolynomial@ii{% + \addto@pscode{% + xy \@nameuse{beginqp@\psplotstyle} + \psk@plotpoints { + xy \@nameuse{doqp@\psplotstyle} + /x x dx add def + } repeat + xy \@nameuse{doqp@\psplotstyle} + end + }% + \@nameuse{endqp@\psplotstyle}% +} +\def\psPolynomial@iii{% curves + \addto@pscode{% + mark + /n 2 def + \psk@plotpoints { + xy + n 2 roll + /n n 2 add def + /x x dx add def + } repeat + /x x1 def + xy + n 2 roll + end + }% + \@nameuse{endplot@\psplotstyle}% +} +% +% Bessel 2004-06-08 +% Manuel Luque, Herbert Voss +% Look at the end for some more documentation about the algorithm +% +\define@key[psset]{pst-func}{constI}[1]{\def\psk@constI{#1 }} +\define@key[psset]{pst-func}{constII}[0]{\def\psk@constII{#1 }} +\psset{constI=1,constII=0} +% +\def\psBessel{\@ifnextchar[{\psBessel@i}{\psBessel@i[]}} +\def\psBessel@i[#1]#2#3#4{{%%% #2 = n + \pst@killglue + \psset{plotpoints=500}% + \psset{#1}% + \parametricplot{#3}{#4}{% + /J1 0 def + /k { 57.29577951 mul } def + /xBessel t k def + 0 0.1 180 { + /tB exch k def + /J1 J1 0.1 xBessel + tB sin mul tB #2\space mul sub cos mul add def + } for + t J1 180 div \psk@constI mul \psk@constII add + }% +}\ignorespaces} +% +% +\def\psModBessel{\@ifnextchar[{\psModBessel@i}{\psModBessel@i[]}}%% hv 20111021 +\def\psModBessel@i[#1]#2#3{{%%% #2 = n + \pst@killglue% + \psset{nue=0,#1}% + \psplot{#2}{#3}[ /nue \psk@nue def /epsilon 1e-20 def ]{% + /Sum 0 def + /Iter 0 def + {/Sum_Iter + x dup mul 4 div Iter exp % nominator + nue Iter add 1 add GAMMA Iter tx@AddMathFunc begin ! end mul % denominator + Div def + Sum_Iter abs epsilon lt { exit } if + /Sum Sum Sum_Iter add def + /Iter Iter 1 add def + } loop + x 0.5 mul nue exp Sum mul + }% +}\ignorespaces} +% +\define@key[psset]{pst-func}{sigma}[0.5]{\def\psk@sigma{#1 }} +\define@key[psset]{pst-func}{mue}[0]{\def\psk@mue{#1 }} +\define@key[psset]{pst-func}{nue}[1]{\def\psk@nue{#1 }} +\psset[pst-func]{sigma=0.5,mue=0,nue=1} +% +\def\psGauss{\@ifnextchar[{\psGauss@i}{\psGauss@i[]}} +\def\psGauss@i[#1]#2#3{{% + \pst@killglue% + \psset{plotpoints=200}% + \psset{#1}% + \psplot[algebraic=false]{#2}{#3}{% + Euler x \psk@mue sub dup mul 2 div \psk@sigma dup mul div neg exp + 1.0 \psk@sigma div TwoPi sqrt div mul% + }% +}\ignorespaces} +% +\define@key[psset]{pst-func}{Simpson}[5]{\def\psk@Simpson{#1 }} +\psset[pst-func]{Simpson=5} +% +\def\psGaussI{\pst@object{psGaussI}} +\def\psGaussI@i#1#2{% + \addbefore@par{plotpoints=200,plotstyle=line} + \begin@OpenObj% + \addto@pscode{ + /a #1 def + /dx #2 #1 sub \psk@plotpoints\space div def + /b a dx add def + /scx { \pst@number\psxunit mul } def + /scy { \pst@number\psyunit mul } def + tx@FuncDict begin + /C 1 \psk@sigma div TwoPi sqrt div def + /SFunc {% x on Stack + Euler exch \psk@mue\space sub dup mul 2 div \psk@sigma\space dup mul div neg exp C mul + } def + end +% a scx 0 moveto + a scx 0 \@nameuse{beginqp@\psplotstyle} + \psk@plotpoints 1 sub { + a b \psk@Simpson false % a b M useXval on Stack + tx@FuncDict begin Simpson I end % y value on stack + scy b scx exch \@nameuse{doqp@\psplotstyle} %lineto + /b b dx add def + } repeat +% stroke + }% + \end@OpenObj% +} +% +\def\psSi{\pst@object{psSi}} +\def\psSi@i#1#2{% + \begin@OpenObj% + \addto@pscode{ + /x #1 def + /dx #2 #1 sub \psk@plotpoints\space div def + /scx { \pst@number\psxunit mul } def + /scy { \pst@number\psyunit mul } def + x scx x tx@FuncDict begin Si end scy moveto + \psk@plotpoints 1 sub { + x dup scx exch tx@FuncDict begin Si end scy lineto + /x x dx add def + } repeat + stroke + }% + \end@OpenObj% +} +\def\pssi{\pst@object{pssi}} +\def\pssi@i#1#2{% + \begin@OpenObj% + \addto@pscode{ + /x #1 def + /dx #2 #1 sub \psk@plotpoints\space div def + /scx { \pst@number\psxunit mul } def + /scy { \pst@number\psyunit mul } def + x scx x tx@FuncDict begin si end scy moveto + \psk@plotpoints 1 sub { + x dup scx exch tx@FuncDict begin si end scy lineto + /x x dx add def + } repeat + stroke + }% + \end@OpenObj% +} +% +\def\psCi{\pst@object{psCi}} +\def\psCi@i#1#2{% + \begin@OpenObj% + \addto@pscode{ + /x #1 def + /dx #2 #1 sub \psk@plotpoints\space div def + /scx { \pst@number\psxunit mul } def + /scy { \pst@number\psyunit mul } def + x scx x tx@FuncDict begin Ci end scy moveto + \psk@plotpoints 1 sub { + x dup scx exch tx@FuncDict begin Ci end scy lineto + /x x dx add def + } repeat + stroke + }% + \end@OpenObj% +} +\def\psci{\pst@object{psci}} +\def\psci@i#1#2{% + \begin@OpenObj% + \addto@pscode{ + /x #1 def + /dx #2 #1 sub \psk@plotpoints\space div def + /scx { \pst@number\psxunit mul } def + /scy { \pst@number\psyunit mul } def + x scx x tx@FuncDict begin ci end scy moveto + \psk@plotpoints 1 sub { + x dup scx exch tx@FuncDict begin ci end scy lineto + /x x dx add def + } repeat + stroke + }% + \end@OpenObj% +} +% +\define@key[psset]{pst-func}{PSfont}[NimbusRomNo9L-Regu]{\def\psk@PSfont{/#1 }} +\define@key[psset]{pst-func}{valuewidth}[10]{\pst@getint{#1}\psk@valuewidth } +\define@key[psset]{pst-func}{fontscale}[10]{\pst@checknum{#1}\psk@fontscale } +\define@key[psset]{pst-func}{decimals}[-1]{\pst@getint{#1}\psk@decimals } +\psset[pst-func]{PSfont=NimbusRomNo9L-Regu,fontscale=10,valuewidth=10,decimals=-1} +% +\def\psPrintValue{\pst@object{psPrintValue}} +\def\psPrintValue@i#1{\expandafter\psPrintValue@ii#1,,\@nil} +\def\psPrintValue@ii#1,#2,#3\@nil{% #1,#2 only for algebraic code + \begin@SpecialObj + \addto@pscode{ + gsave \psk@PSfont\space findfont \psk@fontscale scalefont setfont + \ifPst@algebraic + /x #1 def + /Func (#2) tx@AlgToPs begin AlgToPs end cvx def + Func + \else #1 \fi + \psk@decimals -1 gt { 10 \psk@decimals exp dup 3 1 roll mul cvi exch div } if + \psk@valuewidth string cvs %/Output exch def % save output + \ifPst@comma dot2comma \fi % do we have to change dot to comma + \psk@xShift\space 0 moveto %Output + show grestore + }% + \end@SpecialObj% +} + +\define@boolkey[psset]{pst-func}[Pst@]{round}[true]{}% +\define@boolkey[psset]{pst-func}[Pst@]{science}[true]{% + \ifPst@science\def\psk@Scin{true }\else\def\psk@Scin{false }\fi} +\psset[pst-func]{science=false,round=false} +\def\psPrintValueNew{\pst@object{psPrintValueNew}} +\def\psPrintValueNew@i#1{\expandafter\psPrintValueNew@ii#1,,\@nil} +\def\psPrintValueNew@ii#1,#2,#3\@nil{% #1,#2 only for algebraic code + \begin@SpecialObj + \addto@pscode{ % thanks to Buddy Ledger + /mfont { \psk@PSfont\space findfont \psk@fontscale scalefont setfont } bind def + /mfontexp { \psk@PSfont\space findfont \psk@fontscale 1.2 div scalefont setfont } bind def + /s1 { /StandardSymL findfont \psk@fontscale scalefont setfont } bind def + \ifPst@algebraic + /x #1 def + /Func (#2) tx@AlgToPs begin AlgToPs end cvx def + Func + \else #1 \fi + /value ED + \psk@Scin { + value 0 ne { value log floor cvi /expon ED }{ /expon 0 def } ifelse + value 10 expon exp div + \psk@decimals -1 gt { 10 \psk@decimals exp dup 3 1 roll mul + \ifPst@round round \else cvi \fi exch div } if + \psk@decimals 0 eq { cvi } if /numb ED + expon \psk@valuewidth string cvs /expon exch def + numb \psk@valuewidth string cvs + \ifPst@comma dot2comma \fi % do we have to change dot to comma + /Output exch def + /txspc \psk@fontscale 4 div def + \psk@xShift\space 0 moveto mfont Output show + txspc 0 rmoveto s1 (\string\264) show + txspc 0 rmoveto mfont (10) show + txspc 2 div txspc 1.5 mul rmoveto mfontexp expon show } + { value + \psk@decimals -1 gt { 10 \psk@decimals exp dup 3 1 roll mul + \ifPst@round round \else cvi \fi exch div } if + \psk@decimals 0 eq { cvi } if %inserted to handle decimals=0 + \psk@valuewidth string cvs + \ifPst@comma dot2comma \fi % do we have to change dot to comma + \psk@xShift\space 0 moveto mfont %Output + show + } ifelse + }% + \end@SpecialObj% +} +% +% Integrals 2006-01-16 +% Jose-Emilio Vila-Forcen, Herbert Voss +% +\def\psCumIntegral{\pst@object{psCumIntegral}} +\def\psCumIntegral@i#1#2#3{% + \begin@OpenObj% + \addto@pscode{ + /a #1 def + /dx #2 #1 sub \psk@plotpoints\space div def + /b a dx add def + /scx { \pst@number\psxunit mul } def + /scy { \pst@number\psyunit mul } def + tx@FuncDict begin + /SFunc \ifPst@algebraic (#3) tx@AlgToPs begin AlgToPs end cvx \else { #3 } \fi def + end + a scx 0 moveto + \psk@plotpoints 1 sub { + a b \psk@Simpson\space \ifPst@algebraic true \else false \fi % a b M useX on Stack + tx@FuncDict begin Simpson I end % y value on stack + scy b scx exch lineto + /b b dx add def + } repeat +% stroke + }% +% \psk@fillstyle% +% \pst@stroke% + \end@OpenObj% +} +% +\def\psIntegral{\pst@object{psIntegral}} +\def\psIntegral@i#1#2(#3,#4)#5{% + \begin@OpenObj% + \addto@pscode{ + /a #3 def + /dx #4 #3 sub \psk@plotpoints\space div def + /b #4 def + /aa #1 def + /dd #2 #1 sub \psk@plotpoints\space div def + /t aa dd add def + /scx { \pst@number\psxunit mul } def + /scy { \pst@number\psyunit mul } def + tx@FuncDict begin /SFunc { t #5 } def end + a b \psk@Simpson false % a b M useX on Stack + tx@FuncDict begin Simpson I end % y value on stack + scy t scx exch moveto + /t t dd add def + \psk@plotpoints 1 sub { + a b \psk@Simpson false % a b M useXon Stack + tx@FuncDict begin Simpson I end % y value on stack + scy t scx exch lineto + /t t dd add def + } repeat +% stroke + }% +% \psk@fillstyle% +% \pst@stroke% + \end@OpenObj% +} +% +\def\psConv{\@ifnextchar[{\psConv@i}{\psConv@i[]}} +\def\psConv@i[#1]#2#3(#4,#5)#6#7{% + \psIntegral[#1]{#2}{#3}(#4,#5){pop pop xVal #6\space xVal t neg add #7\space mul}% +}% +% +\define@key[psset]{pst-func}{PrintVLimit}[1e-6]{\def\psFunc@PrintVLimit{#1 }} +\define@key[psset]{pst-func}{Switch2Log}[80]{\def\psFunc@Switch2Log{#1 }} +\define@boolkey[psset]{pst-func}[Pst@]{printValue}[true]{} +\define@boolkey[psset]{pst-func}[Pst@]{LineEnding}[true]{} +\define@boolkey[psset]{pst-func}[Pst@]{VLines}[true]{} +\define@key[psset]{pst-func}{barwidth}[1]{\def\psFunc@barwidth{#1 }}% a factor, not a dimen +\define@key[psset]{pst-func}{rightEnd}[2]{\def\psFunc@rightEnd{#1 }} +\define@key[psset]{pst-func}{leftEnd}[2]{\def\psFunc@leftEnd{#1 }} +\define@key[psset]{pst-func}{labelangle}[90]{\def\psFunc@langle{#1 }} +\define@key[psset]{pst-func}{xlabelsep}[0]{\def\psFunc@xlabelsep{#1 }} +\define@key[psset]{pst-func}{radiusout}[2]{\def\psFunc@radiusout{#1 }} +\define@key[psset]{pst-func}{radiusinL}[0]{\def\psFunc@radiusinL{#1 }} +\define@key[psset]{pst-func}{radiusinR}[1.5]{\def\psFunc@radiusinR{#1 }} +\define@key[psset]{pst-func}{LabelColor}[black]{\pst@getcolor{#1}\psk@LabelColor} +\define@key[psset]{pst-func}{LineEndColorL}[green]{\pst@getcolor{#1}\psk@LineEndColorL} +\define@key[psset]{pst-func}{LineEndColorR}[red]{\pst@getcolor{#1}\psk@LineEndColorR} +\define@key[psset]{pst-func}{fillcolorA}[blue!40]{\pst@getcolor{#1}\psk@fillcolorA} +\define@key[psset]{pst-func}{fillcolorB}[red!40]{\pst@getcolor{#1}\psk@fillcolorB} +\define@key[psset]{pst-func}{vlinestyle}[solid]{\def\psvlinestyle{#1}} +\def\psfs@alternateColors{} +\def\pst@alternateColors{alternateColors} +% +\psset[pst-func]{printValue=false,barwidth=1,labelangle=90,xlabelsep=0,LabelColor=black,LineEndColorL=green,LineEndColorR=red,radiusout=2, radiusinL=0,radiusinR=1.5,LineEnding=true,leftEnd=1,rightEnd=2,VLines=false, + fillcolorA=blue!40,fillcolorB=red!40,PrintVLimit=1e-64,Switch2Log=80} +% +\def\psBinomial{\pst@object{psBinomial}} +\def\psBinomial@i#1#2{\psBinomial@ii#1,,,\@nil{#2}}% +\def\psBinomial@ii#1,#2,#3,#4\@nil#5{% + \def\pst@tempA{#2}% + \ifx\pst@tempA\@empty + \psBinomial@iii{0}{#1}{#1}{#5}% + \else + \def\pst@tempA{#3}% + \ifx\pst@tempA\@empty\psBinomial@iii{#1}{#2}{#2}{#5}% + \else\psBinomial@iii{#1}{#2}{#3}{#5}\fi + \fi} +% +\def\psBinomial@iii#1#2#3#4{% + \addbefore@par{valuewidth=15}% + \begin@OpenObj + \addto@pscode{% + /toggle false def + \ifx\psk@fillstylename\pst@alternateColors + /ColA { \pst@usecolor\psk@fillcolorA } def + /ColB { \pst@usecolor\psk@fillcolorB } def + \fi + /ValueSwitch2Log \psFunc@Switch2Log\space def + /scx { \pst@number\psxunit mul } def + /scy { \pst@number\psyunit mul } def + /m #1 def + /n #2 def + /N #3 def + /p #4 def + /dx \psFunc@barwidth 2 div def + /q 1 p sub def + /kOld dx neg m add def + kOld scx 0 moveto % starting point# +%%---------------------------------------------------------------------------------------------------------------------------------------------------------------- +%%-------------------- Code, der bei gro{\ss}em N \"{u}ber den Logarithmus arbeitet von Manuel Luque --------------------------------------------- + /SumLog {% log(1) + log(2) + ... + log(n) = log(n!) + 2 dict begin % Erwartet die Eingabe eines Wertes, n\"{a}mlich bis zu welchem Wert addiert werden soll ---> n + /nV exch def % der \"{u}bergebene Wert wird in nV abgespeichert + /iV 1 def % Startwert ist iV=1 + 0 nV { iV log add /iV iV 1 add def } repeat % 0 + log(1) + log(2) + ... + log(n) Die Null ist dazu n\"{o}tig um die erste Addition machen zu k\"{o}nnen + end + } def + /binomial_comb{ % log(N!) - log(k!) - log((n-k)!) = log[N!/(k!*(n-k)!)] + 2 dict begin + /nV exch def + /NV exch def + NV SumLog nV SumLog sub + NV nV sub SumLog sub + end + } def + /PnN { + 3 dict begin + /pV exch def + /nV exch def + /NV exch def + 10 + NV nV binomial_comb + nV pV log mul + NV nV sub 1 pV sub log mul add add + exp + end + } def +%%------------------------------------------------------------------------------------------------ +%%------------------------------------------------------------------------------------------------ + N ValueSwitch2Log gt + { } + { 0 1 m 1 sub + {% + /k exch def % save loop variable + k 0 eq + { /Y q N exp def } + { /Y Y N k sub 1 add mul k div p mul q div def } + ifelse + } for + } ifelse + m 1 n {% % n-m+1 times + /k exch def % save loop variable + N ValueSwitch2Log gt + { N k p PnN /Y exch def } + { k 0 eq + { /Y q N exp def } + { /Y Y N k sub 1 add mul k div p mul q div def } + ifelse + } + ifelse % recursive definition + \ifx\psk@fillstylename\pst@alternateColors + newpath + kOld scx 0 moveto + \fi + kOld scx Y scy L k dx add scx Y scy L + \ifPst@markZeros k dx add scx 0 L kOld 1 add scx 0 L \fi + \ifx\psk@fillstylename\pst@alternateColors + closepath + gsave toggle {ColA}{ColB} ifelse \tx@setTransparency fill grestore + /toggle toggle not def + \fi + \ifPst@printValue + gsave \psk@PSfont\space findfont \psk@fontscale scalefont setfont \pst@usecolor\psk@LabelColor % + Y \psFunc@PrintVLimit le { () } { Y \psk@valuewidth\space string cvs } ifelse + \ifPst@comma dot2comma \fi + k scx \psk@fontscale 2 div add \psFunc@xlabelsep scx add + Y scy \pst@number\pslabelsep add moveto + \psFunc@langle rotate show grestore + \fi + /kOld kOld 1 add def + } for + \ifPst@markZeros\else k dx add scx 0 L \fi % last line down to x-axis + }% +% \psk@fillstyle +% \pst@stroke + \end@OpenObj +}% +% +% +\def\psBinomialN{\pst@object{psBinomialN}}% +\def\psBinomialN@i#1#2{% + \leavevmode + \pst@killglue + \begingroup + \use@par + \init@pscode + \def\cplotstyle{curve}% + \ifx\psplotstyle\cplotstyle \@nameuse{beginplot@\psplotstyle}\fi + \addto@pscode{% + \ifx\psplotstyle\cplotstyle /Curve true def \else /Curve false def \fi + /scx { \pst@number\psxunit mul } def + /scy { \pst@number\psyunit mul } def + /N #1 def + /p #2 def % probability + /q 1 p sub def + /E N p mul def + /sigma E q mul sqrt def % variant + /dx 1.0 sigma div 2 div def + /xOld dx neg E sub sigma div def + /xEnd xOld neg dx add scx def + Curve + { /Coors [xOld dx sub scx 0] def }% saves the coordinates for curve + { xOld scx 0 moveto } % starting point + ifelse + 0 1 N {% % N times + /k exch def % save loop variable + k 0 eq + { /Y q N exp def } + { /Y Y N k sub 1 add mul k div p mul q div def } + ifelse % recursive definition + /x k E sub sigma div dx add def + /y Y sigma mul def % normalize + Curve + { x dx sub scx y scy Coors aload length 2 add array astore /Coors exch def} + { xOld scx y scy L x scx y scy L + \ifPst@markZeros x scx 0 L \fi % + } ifelse + \ifPst@printValue + gsave \psk@PSfont\space findfont \psk@fontscale scalefont setfont \pst@usecolor\psk@LabelColor % + y \psk@valuewidth string cvs %/Output exch def + \ifPst@comma dot2comma \fi % do we have to change dot to comma + x dx sub scx \psk@fontscale 2 div add \psFunc@xlabelsep scx add + y scy \pst@number\pslabelsep add moveto + \psFunc@langle rotate show grestore + \fi + /xOld x def + } for + Curve { [ xEnd 0 Coors aload pop } if% showpoints on top of the stack + }% + \ifx\psplotstyle\cplotstyle\@nameuse{endplot@\psplotstyle}\else + \psk@fillstyle + \pst@stroke + \fi + \use@pscode + \endgroup + \ignorespaces +}% +\def\psBinomialF{\pst@object{psBinomialF}} +\def\psBinomialF@i#1#2{\psBinomialF@ii#1,,,\@nil{#2}}% +\def\psBinomialF@ii#1,#2,#3,#4\@nil#5{% + \def\pst@tempA{#2}% + \ifx\pst@tempA\@empty + \psBinomialF@iii{0}{#1}{#1}{#5}% + \else + \def\pst@tempA{#3}% + \ifx\pst@tempA\@empty\psBinomialF@iii{#1}{#2}{#2}{#5}% + \else\psBinomialF@iii{#1}{#2}{#3}{#5}\fi + \fi}% +\def\psBinomialF@iii#1#2#3#4{% + \addbefore@par{valuewidth=15}% + \begin@OpenObj + \addto@pscode{% + /ValueSwitch2Log \psFunc@Switch2Log\space def + /scx { \pst@number\psxunit mul } def + /scy { \pst@number\psyunit mul } def + /m #1 def + /n #2 def + /N #3 def + /p #4 def + /dx \psFunc@barwidth 2 div def + /q 1 p sub def + \ifPst@markZeros /kOld dx neg m add def \else + /kOld m def \fi + \psFunc@leftEnd 0 eq + { } + { kOld 0 eq + { kOld \psFunc@leftEnd sub scx 0 moveto % starting point + \ifPst@LineEnding + kOld \psFunc@radiusout\pst@number\psxunit div sub scx 0 L stroke + kOld scx 0 newpath \psFunc@radiusout 0 360 arc kOld scx 0 + \psFunc@radiusinR 360 0 arcn closepath \pst@usecolor\psk@LineEndColorR fill + \else + kOld scx 0 L stroke + \fi + }{ } ifelse } ifelse + kOld scx 0 moveto % starting point +%%---------------------------------------------------------------------------------------------------------------------------------------------------------------- +%%-------------------- Code, der bei gro{\ss}em N \"{u}ber den Logarithmus arbeitet von Manuel Luque --------------------------------------------- + /SumLog {% log(1) + log(2) + ... + log(n) = log(n!) + 2 dict begin % Erwartet die Eingabe eines Wertes, n\"{a}mlich bis zu welchem Wert addiert werden soll ---> n + /nV exch def % der \"{u}bergebene Wert wird in nV abgespeichert + /iV 1 def % Startwert ist iV=1 + 0 nV { iV log add /iV iV 1 add def } repeat % 0 + log(1) + log(2) + ... + log(n) Die Null ist dazu n\"{o}tig um die erste Addition machen zu k\"{o}nnen + end + } def + /binomial_comb{ % log(N!) - log(k!) - log((n-k)!) = log[N!/(k!*(n-k)!)] + 2 dict begin + /nV exch def + /NV exch def + NV SumLog nV SumLog sub + NV nV sub SumLog sub + end + } def + /PnN { + 3 dict begin + /pV exch def + /nV exch def + /NV exch def + 10 + NV nV binomial_comb + nV pV log mul + NV nV sub 1 pV sub log mul add add + exp + end + } def +%%------------------------------------------------------------------------------------------------ +%%------------------------------------------------------------------------------------------------ + 0 1 m 1 sub { + /k exch def % save loop variable + N ValueSwitch2Log gt { k 0 eq + { N k p PnN /Y exch def /F Y def } + { N k p PnN /Y exch def /F F Y add def } + ifelse + }{ k 0 eq + { /Y q N exp def /F Y def } + { /Y Y N k sub 1 add mul k div p mul q div def + /F F Y add def + } ifelse + } ifelse + } for + m 1 n { % n-m+1 times + /k exch def % save loop variable + N ValueSwitch2Log gt + { k 0 eq + { N k p PnN /Y exch def /F Y def } + { N k p PnN /Y exch def /F F Y add def } + ifelse } + { k 0 eq + { /Y q N exp def /F Y def } + { /Y Y N k sub 1 add mul k div p mul q div def /F F Y add def + } ifelse + } ifelse % recursive definition + F 1 gt { /F 1 def } if + \ifPst@markZeros kOld scx F scy L k dx add scx F scy L k dx add scx 0 L kOld 1 add scx 0 L + \else + kOld scx F scy newpath \psFunc@radiusout 0 360 arc kOld scx F scy \psFunc@radiusinL 360 0 arcn closepath \pst@usecolor\psk@LineEndColorL fill + kOld \ifPst@LineEnding\psFunc@radiusout\pst@number\psxunit div add \fi + scx F scy moveto + k 1 add + \ifPst@LineEnding\psFunc@radiusout\pst@number\psxunit div sub \fi + k N eq + { \psFunc@rightEnd add } + { } ifelse + scx F scy L \pst@usecolor\pslinecolor [1 0] 0 setdash stroke + \ifPst@LineEnding + k N eq + { } + { k 1 add scx F scy newpath \psFunc@radiusout 0 360 arc k 1 add scx F scy \psFunc@radiusinR 360 0 arcn closepath \pst@usecolor\psk@LineEndColorR fill } + ifelse + \ifPst@VLines + Y \psFunc@radiusout\pst@number\psyunit div 2 mul le + { } + { k scx F Y sub \psFunc@radiusout\pst@number\psyunit div add scy moveto k scx F \psFunc@radiusout\pst@number\psyunit div sub scy L \pst@usecolor\pslinecolor [3 2] 0 setdash stroke } ifelse \fi + \else + \ifPst@VLines + Y \psFunc@radiusout\pst@number\psyunit div 0.1 mul le + { } + { k scx F Y sub scy moveto k scx F scy L \pst@usecolor\pslinecolor [3 2] 0 setdash stroke } ifelse + \fi\fi\fi + \ifPst@printValue + gsave \psk@PSfont\space findfont \psk@fontscale scalefont setfont \pst@usecolor\psk@LabelColor % + Y \psFunc@PrintVLimit le { () } { F \psk@valuewidth\space string cvs } ifelse + \ifPst@comma dot2comma \fi + k scx \psk@fontscale 2 div add \psFunc@xlabelsep scx add + F scy \pst@number\pslabelsep add moveto + \psFunc@langle rotate show grestore + \fi + /kOld kOld 1 add def + } for + }% + \end@OpenObj% +}% +% +\def\psBinomialFS{\pst@object{psBinomialFS}} +\def\psBinomialFS@i#1#2{\psBinomialFS@ii#1,,,\@nil{#2}}% +\def\psBinomialFS@ii#1,#2,#3,#4\@nil#5{% + \def\pst@tempA{#2}% + \ifx\pst@tempA\@empty + \psBinomialFS@iii{0}{#1}{#1}{#5}% + \else + \def\pst@tempA{#3}% + \ifx\pst@tempA\@empty\psBinomialFS@iii{#1}{#2}{#2}{#5}% + \else\psBinomialFS@iii{#1}{#2}{#3}{#5}\fi + \fi}% +\def\psBinomialFS@iii#1#2#3#4{% + \addbefore@par{valuewidth=15}% + \begin@OpenObj + \addto@pscode{% + /ValueSwitch2Log \psFunc@Switch2Log\space def + /scx { \pst@number\psxunit mul } def + /scy { \pst@number\psyunit mul } def + /m #1 def + /n #2 def + /N #3 def + /p #4 def + /dx \psFunc@barwidth 2 div def + /q 1 p sub def + \ifPst@markZeros /kOld dx neg m add def \else + /kOld m def \fi + kOld scx 0 moveto % starting point +%%---------------------------------------------------------------------------------------------------------------------------------------------------------------- +%%-------------------- Code, der bei gro{\ss}em N \"{u}ber den Logarithmus arbeitet von Manuel Luque --------------------------------------------- + /SumLog {% log(1) + log(2) + ... + log(n) = log(n!) + 2 dict begin % Erwartet die Eingabe eines Wertes, n\"{a}mlich bis zu welchem Wert addiert werden soll ---> n + /nV exch def % der \"{u}bergebene Wert wird in nV abgespeichert + /iV 1 def % Startwert ist iV=1 + 0 nV { iV log add /iV iV 1 add def } repeat % 0 + log(1) + log(2) + ... + log(n) Die Null ist dazu n\"{o}tig um die erste Addition machen zu k\"{o}nnen + end + } def + /binomial_comb{ % log(N!) - log(k!) - log((n-k)!) = log[N!/(k!*(n-k)!)] + 2 dict begin + /nV exch def + /NV exch def + NV SumLog nV SumLog sub + NV nV sub SumLog sub + end + } def + /PnN { + 3 dict begin + /pV exch def + /nV exch def + /NV exch def + 10 + NV nV binomial_comb + nV pV log mul + NV nV sub 1 pV sub log mul add add + exp + end + } def +%%------------------------------------------------------------------------------------------------ + 0 1 m 1 sub { + /k exch def % save loop variable + N ValueSwitch2Log gt { k 0 eq + { N k p PnN /Y exch def /F Y def /FS 1 F sub def } + { N k p PnN /Y exch def /F F Y add def /FS 1 F sub def } + ifelse } + { k 0 eq + { /Y q N exp def /F Y def /FS 1 F sub def } + { /Y Y N k sub 1 add mul k div p mul q div def + /F F Y add def /FS 1 F sub def } + ifelse } ifelse + } for + m 1 n { % n-m+1 times + /k exch def % save loop variable + N ValueSwitch2Log gt { k 0 eq + { N k p PnN /Y exch def /F Y def /FS 1 F sub def } + { N k p PnN /Y exch def /F F Y add def /FS 1 F sub def } ifelse } + { k 0 eq + { /Y q N exp def /F Y def /FS 1 F sub def } + { /Y Y N k sub 1 add mul k div p mul q div def + /F F Y add def /FS 1 F sub def } + ifelse + } ifelse % recursive definition + FS 0 lt { /FS 0 def } if + \ifPst@markZeros kOld scx FS scy L k dx add scx FS scy L k dx add scx 0 L kOld 1 add scx 0 L + \else + \ifPst@LineEnding + k 0 eq + { \psFunc@leftEnd neg scx 1 scy moveto \psFunc@radiusout neg 1 scy L gsave \pst@usecolor\pslinecolor stroke grestore } if + k m eq {kOld scx \psFunc@radiusout add FS Y add scy moveto kOld scx FS Y add scy newpath \psFunc@radiusout 0 360 arc kOld scx FS Y add scy \psFunc@radiusinR 360 0 arcn closepath + gsave \pst@usecolor\psk@LineEndColorR fill grestore } if + kOld scx FS scy newpath \psFunc@radiusout 0 360 arc kOld scx FS scy \psFunc@radiusinL 360 0 arcn closepath \pst@usecolor\psk@LineEndColorL fill % } ifelse + \fi + kOld \ifPst@LineEnding\psFunc@radiusout\pst@number\psxunit div add \fi +% k 0 eq +% { \psFunc@leftEnd sub } +% { } ifelse + scx FS scy moveto + k 1 add + \ifPst@LineEnding\psFunc@radiusout\pst@number\psxunit div sub \fi + k N eq + { \psFunc@rightEnd add } + { } ifelse + scx FS scy L \pst@usecolor\pslinecolor [1 0] 0 setdash stroke + \ifPst@LineEnding + k N eq + { } + { k 1 add scx FS scy newpath \psFunc@radiusout 0 360 arc k 1 add scx FS scy \psFunc@radiusinR 360 0 arcn closepath \pst@usecolor\psk@LineEndColorR fill } + ifelse + \ifPst@VLines + Y \psFunc@radiusout\pst@number\psyunit div 2 mul le + { } + { k scx FS Y add \psFunc@radiusout\pst@number\psyunit div sub scy moveto k scx FS \psFunc@radiusout\pst@number\psyunit div add scy L \pst@usecolor\pslinecolor [3 2] 0 setdash stroke } ifelse \fi + \else + \ifPst@VLines + Y \psFunc@radiusout\pst@number\psyunit div 0.1 mul le + { } + { k scx FS Y add scy moveto k scx FS scy L \pst@usecolor\pslinecolor [3 2] 0 setdash stroke } ifelse + \fi\fi\fi + \ifPst@printValue + gsave \psk@PSfont\space findfont \psk@fontscale scalefont setfont \pst@usecolor\psk@LabelColor % + Y \psFunc@PrintVLimit le { () } { FS \psk@valuewidth\space string cvs } ifelse + \ifPst@comma dot2comma \fi + k 0.1 add scx \psk@fontscale 2 div add \psFunc@xlabelsep scx add + FS scy \pst@number\pslabelsep add moveto + \psFunc@langle rotate show grestore + \fi + /kOld kOld 1 add def + } for + }% + \end@OpenObj +}% +% +% +\define@key[psset]{pst-func}{LeftClipX}[-1]{\def\psFunc@LeftClipX{#1 }} +\define@key[psset]{pst-func}{RightClipX}[-1]{\def\psFunc@RightClipX{#1 }} +\psset[pst-func]{LeftClipX=-1,RightClipX=1} +\def\psBinomialC{\pst@object{psBinomialC}} +\def\psBinomialC@i#1#2{% + \leavevmode + \pst@killglue + \begingroup + \use@par + \begin{psclip}% +{\psframe[linestyle=none,fillstyle=none](\psFunc@LeftClipX,-0.1)(!#1 \psFunc@RightClipX\space add 1)}% +% \use@par + \init@pscode + \beginplot@cspline +% \addto@pscode{/D {} def mark}% + \addto@pscode{% + /scx { \pst@number\psxunit mul } def + /scy { \pst@number\psyunit mul } def + /N #1 def + /p #2 def % Wahrscheinlichkeit + /q 1 p sub def % q = 1 - p + /E N p mul def % Erwartungswert + /sigma E q mul sqrt def % Varianz + /dx 1.0 2 div def + /xOld dx neg 3 sub def + /xEnd 0 def + /Coors [xOld dx sub scx 0] def % speichern der Koordinaten f\"{u}r den Spline +%%---------------------------------------------------------------------------------------------------------------------------------------------------------------- +%%-------------------- Code, der \"{u}ber den Logarithmus arbeitet von Manuel Luque --------------------------------------------- + /SumLog {% log(1) + log(2) + ... + log(n) = log(n!) + 1 dict begin % Erwartet die Eingabe eines Wertes, n\"{a}mlich bis zu welchem Wert addiert werden soll ---> n + /nV exch def % der \"{u}bergebene Wert wird in nV abgespeichert + /iV 1 def % Startwert ist iV=1 + 0 nV { iV log add /iV iV 1 add def } repeat % 0 + log(1) + log(2) + ... + log(n) Die Null ist dazu n\"{o}tig um die erste Addition machen zu k\"{o}nnen + end + } def + /binomial_comb{ % log(N!) - log(k!) - log((n-k)!) = log[N!/(k!*(n-k)!)] + 2 dict begin + /nV exch def + /NV exch def + NV SumLog nV SumLog sub + NV nV sub SumLog sub + end + } def + /PnN { + 3 dict begin + /pV exch def + /nV exch def + /NV exch def + 10 + NV nV binomial_comb + nV pV log mul + NV nV sub 1 pV sub log mul add add + exp + end + } def +%%------------------------------------------------------------------------------------------------ +%%------------------------------------------------------------------------------------------------ +%------------------------------- 3 Punkte um die Kurve links auf Null zu bringen mit dem weiter oben gew\"{a}hlten Startwert sind es also 4 ------------ + /x -2 dx add def + /y 0 def + x dx sub scx y scy Coors aload length 2 add array astore /Coors exch def + /x -0.65 dx add def + /y N 0 p PnN 10 -1.3 exp mul def + x dx sub scx y scy Coors aload length 2 add array astore /Coors exch def + /x -0.375 dx add def + /y N 0 p PnN 3 div def + x dx sub scx y scy Coors aload length 2 add array astore /Coors exch def +%---------------------------- Ende der 3 Punkte und Beginn eigentlicher Code ---------------- + 0 1 N {% % Schleife geht von 0 bis N in 1-er Schritten + /k exch def % save loop variable + N k p PnN /Y exch def + /x k dx add def + /y Y def + x dx sub scx y scy Coors aload length 2 add array astore /Coors exch def + /xOld x def + } for +%--------------------------- Ende des eigentlichen Codes und Beginn von --- +%------------------------------- 4 Punkte um die Kurve rechts auf Null zu bringen ----------- + /x N 0.375 add dx add def + /y Y 3 div def + x dx sub scx y scy Coors aload length 2 add array astore /Coors exch def + /x N 0.65 add dx add def + /y Y 10 -1.3 exp mul def + x dx sub scx y scy Coors aload length 2 add array astore /Coors exch def + /x N 2 add dx add def + /y 0 def + x dx sub scx y scy Coors aload length 2 add array astore /Coors exch def + /x N 3 add dx add def + /y 0 def + x dx sub scx y scy Coors aload length 2 add array astore /Coors exch def +%---------------------------- Ende der 4 Punkte und Laden der Koordinaten des arrays ; L\"{o}schen (pop) von showpoints??---------------------- + [ xEnd 1 add 0 Coors aload pop % showpoints on top of the stack + }% +\endplot@cspline +\use@pscode +\end{psclip}% +\endgroup +\ignorespaces}% +% +\def\psPoisson{\pst@object{psPoisson}}% with contributions from Gerry Coombes +\def\psPoisson@i#1#2{\psPoisson@ii#1,,\@nil{#2}}% +\def\psPoisson@ii#1,#2,#3\@nil#4{% + \def\pst@tempA{#2}% + \ifx\pst@tempA\@empty\psPoisson@iii{0}{#1}{#4}\else + \psPoisson@iii{#1}{#2}{#4}\fi}% +\def\psPoisson@iii#1#2#3{% M N lambda + \begin@OpenObj% + \addto@pscode{ + /scx { \pst@number\psxunit mul } def + /scy { \pst@number\psyunit mul } def + /M #1 def + /N #2 def + /lambda #3 def + /elambda Euler #3 neg exp def % e^-lambda + /dx \psFunc@barwidth 2 div def + /kOld dx neg M add def % addition of M here + kOld scx 0 moveto % starting point + /Y elambda def % start value + 0 1 M 1 sub { % skip over first M-1 rectangles + /k exch def % whilst recursing probabilities + k 0 eq { /Y elambda def }{ /Y Y lambda mul k div def } ifelse + } for % nothing happens if M=0 + M 1 N { % N-M+1 times + /k exch def % save loop variable + k 0 eq { /Y elambda def }{ /Y Y lambda mul k div def } ifelse + kOld scx Y scy L k dx add scx Y scy L + \ifPst@markZeros k dx add scx 0 L \fi + \ifPst@printValue + gsave \psk@PSfont\space findfont \psk@fontscale scalefont setfont + Y \psk@valuewidth string cvs %/Output exch def + \ifPst@comma dot2comma \fi % do we have to change dot to comma + k scx \psk@fontscale 2 div add + Y scy \pst@number\pslabelsep add moveto + 90 rotate show grestore + \fi + /kOld kOld 1 add def + \ifPst@markZeros kOld scx 0 moveto \fi + } for + \ifPst@markZeros \else k dx add scx 0 L \fi % last line down to x-axis + }% +% \psk@fillstyle +% \pst@stroke + \end@OpenObj% +} +% +\define@key[psset]{pst-func}{alpha}[0.5]{\pst@checknum{#1}\psk@alpha } +\define@key[psset]{pst-func}{beta}[0.5]{\pst@checknum{#1}\psk@beta } +\psset[pst-func]{alpha=0.5,beta=0.5} +% +\def\psGammaDist{\pst@object{psGammaDist}} +\def\psGammaDist@i#1#2{% + \ifdim#1pt<\z@ \psframebox*{\color{red}!!!\#1 must be greater than 0!!!} + \else + \addbefore@par{plotpoints=500,alpha=0.5,beta=0.5}% + \begin@OpenObj + \psplot[algebraic=false]{#1}{#2}{ + \psk@beta x mul \psk@alpha exp x div Euler \psk@beta neg x mul \psk@alpha GAMMALN sub exp mul} + \end@OpenObj% + \fi% + \ignorespaces% +} +% +\def\psBetaDist{\pst@object{psBetaDist}} +\def\psBetaDist@i#1#2{% + \ifdim#1pt<\z@ \psframebox*{\color{red}!!!\#1 must be greater than 0!!!} + \else + \addbefore@par{plotpoints=200,alpha=1,beta=1}% + \begin@OpenObj + \psplot[algebraic=false]{#1}{#2}{ + \psk@beta \psk@alpha add GAMMA + \psk@beta GAMMA \psk@alpha GAMMA mul div + 1 x sub \psk@beta 1.0 sub exp mul + x \psk@alpha 1.0 sub exp mul } + \end@OpenObj% + \fi% + \ignorespaces% +} +% +\def\psChiIIDist{\pst@object{psChiIIDist}} +\def\psChiIIDist@i#1#2{% + \addbefore@par{plotpoints=500,nue=1}% + \begin@OpenObj +% \ifdim\psk@nue pt<\z@ \psframebox*{\color{red}!!!nue must be greater than 0!!!} +% \else + \psplot[algebraic=false]{#1}{#2}{% + x 2 div \psk@nue 2 div exp x div Euler -0.5 x mul \psk@nue 2 div GAMMALN sub exp mul }% +% \fi% + \end@OpenObj% + \ignorespaces% +} +% +\def\psTDist{\pst@object{psTDist}} +\def\psTDist@i#1#2{% + \leavevmode + \pst@killglue + \begingroup + \addbefore@par{plotpoints=500}% + \use@par + \ifdim\psk@nue pt<\z@ \psframebox*{\color{red}!!!nue must be greater than 0!!!} + \else + \psplot[algebraic=false]{#1}{#2}{ + 1 x 2 exp \psk@nue div 1 add \psk@nue 1 add 2 div exp div + \psk@nue Pi mul sqrt div + Euler \psk@nue 1 add 2 div GAMMALN \psk@nue 2 div GAMMALN sub exp mul + }% + \fi% + \endgroup% + \ignorespaces% +} +% +\def\psFDist{\pst@object{psFDist}} +\def\psFDist@i#1#2{% + \ifdim#1pt<\z@ \psframebox*{\color{red}!!!\#1 must be greater than 0!!!} + \else + \leavevmode + \pst@killglue + \begingroup + \addbefore@par{plotpoints=500,mue=1}% + \use@par + \psplot[algebraic=false]{#1}{#2}{ + x \psk@mue mul \psk@nue div dup \psk@mue 2 div exp x div + exch 1 add \psk@mue \psk@nue add 2 div exp div + Euler \psk@mue \psk@nue add 2 div GAMMALN + \psk@mue 2 div GAMMALN sub \psk@nue 2 div GAMMALN sub exp mul + }% + \endgroup% + \fi% + \ignorespaces% +} +% +\define@key[psset]{pst-func}{m}[0]{\def\psk@cauchy@m{#1 }} +\define@key[psset]{pst-func}{b}[1]{\def\psk@cauchy@b{#1 }} +\psset[pst-func]{m=0,b=1} +% +\def\psCauchy{\pst@object{psCauchy}} +\def\psCauchy@i#1#2{{% + \pst@killglue% + \addbefore@par{plotpoints=200}% + \use@par% + \psplot[algebraic=false]{#1}{#2}{ + \psk@cauchy@b dup dup mul x \psk@cauchy@m sub dup mul add div Pi div + }% +}\ignorespaces} +% +\def\psCauchyI{\pst@object{psCauchyI}} +\def\psCauchyI@i#1#2{{% + \pst@killglue% + \addbefore@par{plotpoints=200}% + \use@par% + \psplot[algebraic=false]{#1}{#2}{ + x \psk@cauchy@m sub \psk@cauchy@b div ATAN1 DegtoRad Pi div 0.5 add + }% +}\ignorespaces} +% +\def\psWeibull{\pst@object{psWeibull}} +\def\psWeibull@i#1#2{% + \addbefore@par{plotpoints=500,alpha=1,beta=1}% + \begin@OpenObj + \def\pst@tempA{#1}% + \ifdim#1pt<\z@ \psline(#1,0)(0,0)\def\pst@tempA{0}\fi + \psplot[algebraic=false]{\pst@tempA}{#2}{ + \psk@alpha \psk@beta \psk@alpha neg Power mul % alpha*beta^(-alpha) + x \psk@alpha 1 sub Power % x^(alpha-1) + mul + Euler x \psk@beta div \psk@alpha Power neg Power % e^(-(x/beta)^alpha)) + mul } + \end@OpenObj% + \ignorespaces% +} +\def\psWeibullI{\pst@object{psWeibullI}} +\def\psWeibullI@i#1#2{% + \addbefore@par{plotpoints=500,alpha=1,beta=1}% + \begin@OpenObj + \def\pst@tempA{#1}% + \ifdim#1pt<\z@ \psline(#1,0)(0,0)\def\pst@tempA{0}\fi + \psplot[algebraic=false]{\pst@tempA}{#2}{ + 1 + Euler x \psk@beta div \psk@alpha Power neg Power % e^(-(x/beta)^alpha)) + sub + }% + \end@OpenObj% + \ignorespaces% +} +% +\define@key[psset]{pst-func}{pd}[0.22]{\pst@checknum{#1}\psk@probability } +\define@key[psset]{pst-func}{R2}[0.11]{\pst@checknum{#1}\psk@portfolio } +\psset[pst-func]{pd=0.22,R2=0.11} +% +\def\psVasicek{\pst@object{psVasicek}} +\def\psVasicek@i#1#2{% + \addbefore@par{plotpoints=500}% + \begin@OpenObj + \psplot{#1}{#2}[/pd \psk@probability\space def /R2 \psk@portfolio\space def ]{x tx@FuncDict begin vasicek end} + \end@OpenObj% + \ignorespaces% +} +\define@boolkey[psset]{pst-func}[Pst@]{Gini}[true]{} +\psset[pst-func]{Gini=false} +% +\def\psLorenz{\pst@object{psLorenz}} +\def\psLorenz@i#1{{% +% \readdata{\L@Data}{#1}% + \if@star\addto@par{fillstyle=solid,fillcolor=\pslinecolor}\fi + \use@par% +\iffalse + \def\Lorenz@code{ + /D {} def + [ \L@Data\space counttomark dup + 1 sub /m ED 2 div cvi /n ED % m=0..n-1 n=number of pairs + ] /xyValues ED + /Xval [] def /Yval [] def /Xmax 0 def + /Xsum 0 def /Ysum 0 def /XYsum 0 def + xyValues aload pop % [ x y x y x y ... ] + n { 2 copy mul XYsum add /XYsum ED + dup + Yval aload length 1 add array astore /Yval ED + Ysum add /Ysum ED + dup + Xval aload length 1 add array astore /Xval ED + dup Xsum add /Xsum ED + dup Xmax gt { /Xmax ED }{ pop } ifelse + } repeat + Xval bubblesort /Xval ED + Yval bubblesort /Yval ED + Xval { Xmax div } forall n array astore /XvalRelMax ED + Xval { Xsum div } forall n array astore /XvalRel ED + Yval { Ysum div } forall n array astore /YvalRel ED + 0 1 n 1 sub { + cvi /Index ED + Xval Index get + Yval Index get + mul } for + n array astore /XmulY ED + XmulY aload length 1 sub { add } repeat + /XmulYsum ED + XmulY { XmulYsum div } forall + n array astore /XmulYdivXmulYsum ED + /X [0] def + /Y [0] def + /Xsum 0 def /Ysum 0 def + 0 1 n 1 sub { + /Index ED +% XvalRel Index get Xsum add /Xsum ED +% X aload length 1 add Xsum exch array astore /X ED + X aload length 1 add XvalRelMax Index get exch array astore /X ED %% + XmulYdivXmulYsum Index get Ysum add /Ysum ED + Y aload length 1 add Ysum exch array astore /Y ED + } for + \ifPst@Gini + 0 % start value for Gini + 0 1 X length 2 sub { + /Index ED + Y Index get Y Index 1 add get add 2 div % yHeight=(y0+y1)/2 + X Index 1 add get X Index get sub abs % xWidth=x1-x0 + mul % x*y + add + } for + 2 mul 1 sub neg % triangle area divided by the area under the polygon + \psk@PSfont\space findfont \psk@fontscale scalefont setfont + \psk@decimals -1 gt { 10 \psk@decimals exp dup 3 1 roll mul cvi exch div } if + \psk@valuewidth string cvs %/Output exch def % save output + \ifPst@comma dot2comma \fi % do we have to change dot to comma + /Output ED + \psk@xShift\space -30 moveto (Gini: ) show + Output show + \fi + 0 1 n { dup X exch get exch Y exch get } for + \if@star 1 0 0 0 \fi % add values for the closed curve + }% filling the area under the curve. +\fi +%%%%%%%%%%%%%%%%%%%%%%5 + \def\Lorenz@code{ + [ #1 ] dup length /n ED + bubblesort /Yval ED + [ 1 1 n { } for ] /Xval ED + /Xsum n dup 1 add mul 2 div cvi def + /Ysum 0 def /XYsum 0 def + 0 Yval { add } forall /Ysum ED + Xval { n div } forall n array astore /XvalRelMax ED + Xval { Xsum div } forall n array astore /XvalRel ED + Yval { Ysum div } forall n array astore /YvalRel ED + 0 1 n 1 sub { + /Index ED + Xval Index get + Yval Index get + mul } for + n array astore /XmulY ED + XmulY aload length 1 sub { add } repeat + /XmulYsum ED + XmulY { XmulYsum div } forall + n array astore /XmulYdivXmulYsum ED + /X [0] def + /Y [0] def + /Xsum 0 def /Ysum 0 def + 0 1 n 1 sub { + /Index ED +% XvalRel Index get Xsum add /Xsum ED +% X aload length 1 add Xsum exch array astore /X ED + X aload length 1 add XvalRelMax Index get exch array astore /X ED %% + XmulYdivXmulYsum Index get Ysum add /Ysum ED + Y aload length 1 add Ysum exch array astore /Y ED + } for + \ifPst@Gini + 0 % start value for Gini + 0 1 X length 2 sub { + /Index ED + Y Index get Y Index 1 add get add 2 div % yHeight=(y0+y1)/2 + X Index 1 add get X Index get sub abs % xWidth=x1-x0 + mul % x*y + add + } for + 2 mul 1 sub neg % triangle area divided by the area under the polygon + \psk@PSfont\space findfont \psk@fontscale scalefont setfont + \psk@decimals -1 gt { 10 \psk@decimals exp dup 3 1 roll mul cvi exch div } if + \psk@valuewidth string cvs %/Output exch def % save output + \ifPst@comma dot2comma \fi % do we have to change dot to comma + /Output ED + \psk@xShift\space -30 moveto (Gini: ) show + Output show + \fi + 0 1 n { dup X exch get exch Y exch get } for + \if@star 1 0 0 0 \fi % add values for the closed curve + }% filling the area under the curve. + \if@star\listplot*{\Lorenz@code}\else\listplot{\Lorenz@code}% +% \listplot[plotstyle=bezier,linecolor=red]{\Lorenz@code} + \fi% +}\ignorespaces} +% +% Superellipese / Lamefunction +\define@key[psset]{pst-func}{radiusA}[1]{\pst@getlength{#1}\pst@radiusA} +\define@key[psset]{pst-func}{radiusB}[1]{\pst@getlength{#1}\pst@radiusB} +\psset[pst-func]{radiusA=1,radiusB=1} +% +\def\psLame{\pst@object{psLame}} +\def\psLame@i#1{% + \leavevmode + \pst@killglue + \begingroup + \addbefore@par{plotpoints=200}% + \use@par + \parametricplot{0}{360}{% + t cos dup mul 1 #1\space div exp \pst@radiusA \pst@number\psxunit div mul + t 90 gt { t 270 lt { neg } if } if + t sin dup mul 1 #1\space div exp \pst@radiusB \pst@number\psyunit div mul + t 180 gt { neg } if } + \endgroup\ignorespaces} +% +\def\psWeierstrass{\pst@object{psWeierstrass}} +\def\psWeierstrass@i(#1,#2){\@ifnextchar[{\psWeierstrass@ii(#1,#2)}{\psWeierstrass@iii(#1,#2)}} +\def\psWeierstrass@ii(#1,#2)[#3]#4{% #1 xStart; #2 xEnd; #3 a; #4 b %% the original definition + \addbefore@par{plotpoints=500}% + \begin@SpecialObj + \psplot{#1}{#2}[/ps@a #3 def /ps@b #4 def]{ + /ps@n 0 def + /ps@WS 0 def + { + ps@a ps@n exp ps@b ps@n exp Pi mul x mul RadtoDeg cos mul + dup abs \psk@epsilon gt { ps@WS add /ps@WS ED }{ ps@WS add exit } ifelse + ps@n 1 add /ps@n ED + } loop + }% + \end@SpecialObj +} +\def\psWeierstrass@iii(#1,#2)#3{% #1 xStart; #2 xEnd; #3 a + \addbefore@par{plotpoints=500}% + \begin@SpecialObj + \psplot{#1}{#2}[/ps@a #3 def]{ + /ps@k 1 def + /ps@WS 0 def + { + ps@k ps@a exp Pi mul dup x mul RadtoDeg sin exch div + dup abs \psk@epsilon gt { ps@WS add /ps@WS ED }{ ps@WS add exit } ifelse + ps@k 1 add /ps@k ED + } loop + }% + \end@SpecialObj +} +% +% For polar plots +%\define@boolkey[psset]{pst-func}[PstAdd@]{polarplot}[true]{} +%\psset[pst-func]{polarplot=false} +% +%\define@boolkey[psset]{pstricks-add}[Pst@]{GetFinalState}[true]{} +%\define@key[psset]{pstricks-add}{filename}{\def\psk@filename{#1}}% +%\define@boolkey[psset]{pstricks-add}[Pst@]{saveData}[true]{} % \ifPst@saveData +%\psset[pstricks-add]{GetFinalState=false,saveData=false,filename=PSTdata} +% +\define@key[psset]{pst-func}{stepFactor}[0.67]{\pst@checknum{#1}\psk@stepFactor } +\psset[pst-func]{stepFactor=0.67} +% +\def\psplotImp{\pst@object{psplotImp}}% 20060420 +\def\psplotImp@i(#1,#2)(#3,#4){% + \@ifnextchar[{\psplotImp@ii(#1,#2)(#3,#4)}{\psplotImp@ii(#1,#2)(#3,#4)[]}} +\def\psplotImp@ii(#1,#2)(#3,#4)[#5]#6{% + \addbefore@par{filename=\jobname.data}% + \begin@OpenObj% + \addto@pscode{ + \ifPst@saveData /Pst@data (\psk@filename) (w) file def \fi + /xMin #1 def + /xMax #3 def + /yMin #2 def + /yMax #4 def + #5 % additional PS code + \ifPst@polarplot + /@PolarAlgPlot (#6) tx@addDict begin AlgParser end cvx def + /Func { + /phi y x atan def + /r x y Pyth def + \ifPst@algebraic @PolarAlgPlot \else #6 \fi } def + \else + /Func \ifPst@algebraic (#6) tx@addDict begin AlgParser end cvx \else { #6 } \fi def + \fi + /xPixel xMax xMin sub \pst@number\psxunit mul round cvi def + /yPixel yMax yMin sub \pst@number\psyunit mul round cvi def + /dx xMax xMin sub xPixel div def + /dy yMax yMin sub yPixel div def + /setpixel { + dy div exch + dx div exch + \ifPst@saveData + 2 copy + \pst@number\psyunit div exch \pst@number\psxunit div + 20 string cvs Pst@data exch writestring + Pst@data (\space) writestring + 20 string cvs Pst@data exch writestring +% Pst@data (\string\]) writestring + Pst@data (\string\n) writestring + \fi + \pst@number\pslinewidth 2 div 0 360 arc fill } bind def +% + /VZ true def % suppose that F(x,y)>=0 + /x xMin def /y yMin def Func 0.0 lt { /VZ false def } if % erster Wert + xMin dx \psk@stepFactor\space mul xMax { + /x exch def + \ifPst@saveData Pst@data ([\string\n) writestring \fi + yMin dy \psk@stepFactor\space mul yMax { + /y exch def + Func 0 lt + { VZ { x y setpixel /VZ false def} if } + { VZ {}{ x y setpixel /VZ true def } ifelse } ifelse + } for + \ifPst@saveData Pst@data (]\string\n) writestring \fi + } for +%% the same for the other way round without saving the data + /VZ true def % suppose that F(x,y)>=0 + /x xMin def /y yMin def Func 0.0 lt { /VZ false def } if % erster Wert + yMin dy \psk@stepFactor\space mul yMax { + /y exch def + \ifPst@saveData Pst@data ([\string\n) writestring \fi + xMin dx \psk@stepFactor\space mul xMax { + /x exch def + Func 0 lt + { VZ { x y setpixel /VZ false def} if } + { VZ {}{ x y setpixel /VZ true def } ifelse } ifelse + } for + \ifPst@saveData Pst@data (]\string\n) writestring \fi + } for +% +\iffalse + /x xMin def /y yMin def Func 0.0 lt { /VZ false def } if % erster Wert + yMin dy \psk@stepFactor\space mul yMax { + /y exch def + xMin dx \psk@stepFactor\space mul xMax { + /x exch def + Func 0 lt + { VZ { x y setpixel /VZ false def} if } + { VZ {}{ x y setpixel /VZ true def } ifelse } ifelse + } for + } for +\fi + \ifPst@saveData Pst@data closefile \fi + }% + \end@OpenObj% +} +% +\def\psVolume{\pst@object{psVolume}}% 2007-06-23 +\def\psVolume@i(#1,#2)#3#4{% + \leavevmode + \pst@killglue + \begingroup + \use@par + \psplot[fillstyle=none]{#1}{#2}{#4}% original function + \ifPst@algebraic + \psplot[fillstyle=none]{#1}{#2}{-(#4)} + \else + \psplot[fillstyle=none]{#1}{#2}{#4 neg}% mirrored at the x-axis + \fi + \multido{\iA=1+1}{#3}{% run it #3 times with increment \A + \pscustom{% to get a closed filled ellipse + \code{ % the PS code + /dX #2 #1 sub #3 div def % delta x, the step + /Start dX \iA\space 1 sub mul #1 add def % xStart + /End Start dX add def % xEnd=xStart+dX + /Height End Start add 2 div /x ED + \ifPst@algebraic (#4) AlgParser cvx exec \else #4 \fi def } % height=f(x) + % x is the mean between Start+End + \psellipticarc(!Start 0)(! Height 8 div Height){90}{270} + % draw the first falf of the ellipse + \rlineto(! dX 0)% draw a line in x-direction + \psellipticarc(!End 0)(! Height 8 div Height){270}{90} + % draw the other half of the ellipse + \rlineto(!dX neg 0)}}% draw a line in negative x-direction + \psset{fillstyle=none} +% \psellipse(#2,0)(!#2 dup #1 sub #3 div 2 div sub /x ED #4 dup +% 8 div exch)% draw again the ellipse to get the borderline. + \psellipse(#2,0)(!{ #2 dup #1 sub #3 div 2 div sub /x ED + \ifPst@algebraic (#4) AlgParser cvx exec \else #4 \fi dup + 8 div exch}) % draw again the ellipse to get the borderline. + \psset{plotstyle=line,linestyle=dashed, + plotpoints=40,dotstyle=*,dotsize=0.5pt} + \psplot[fillstyle=none]{#1}{#2}{#4} + \ifPst@algebraic + \psplot[fillstyle=none]{#1}{#2}{-(#4)} + \else + \psplot[fillstyle=none]{#1}{#2}{#4 neg}% mirrored at the x-axis + \fi + % draw again the curves to get the borderline + \endgroup% + \ignorespaces% +} +\def\txFunc@BezierCurve{ tx@FuncDict begin BezierCurve Points end } +\def\txFunc@BezierShowPoints{ tx@Dict begin /Points ED BezierShowPoints end } +\def\pst@BezierType{2 } % the default +% +\def\psBezier#1{% % allowed order is 1 ... 9 + \ifnum#1>0 \ifnum#1<10 \def\pst@BezierType{#1 }\fi\fi% + \pst@object{psBezier}} +\def\psBezier@i{% + \pst@getarrows{% + \addbefore@par{plotpoints=200}% + \begin@OpenObj + \pst@getcoors[\psBezier@ii% +}} +\def\psBezier@ii{% + \addto@pscode{% + \psk@plotpoints % step for Bezier T=0,0+epsilon,0+i*epsilon,...,1 + \pst@BezierType % type of the Bezier curve 2,3,4,... + \txFunc@BezierCurve + \ifshowpoints \txFunc@BezierShowPoints \else pop \fi + }% + \end@OpenObj} +% +\def\tx@Bernstein{ tx@FuncDict begin Bernstein end } +\define@boolkey[psset]{pst-func}[Pst@]{envelope}[true]{} +\psset[pst-func]{envelope=false} +% +\def\psBernstein{\pst@object{psBernstein}}% \psBernstein[options](t1,t2)(i,n) +\def\psBernstein@i(#1,#2){% + \@ifnextchar({\psBernstein@ii(#1,#2)}{\psBernstein@ii(0,1)(#1,#2)}} +% +\def\psBernstein@ii(#1,#2)(#3,#4){% (tStart,tEnd)(i,n) + \addbefore@par{plotpoints=200}% + \begin@OpenObj + \addto@pscode{% + /ScreenCoor { \tx@ScreenCoor } def + #1\space #2\space + 1.0 \psk@plotpoints\space div % step=1/plotpoints + #3\space #4\space +% on stack we have tStart tEnd epsilon i n + \ifPst@envelope true \else false \fi + \tx@Bernstein + }% + \end@OpenObj} +% +\def\psThomae{\pst@object{psThomae}} +\def\psThomae@i(#1,#2)#3{% + \addbefore@par{dotsize=1pt} + \begin@ClosedObj + \addto@pscode{ + 1 1 #3 { + dup + /ipSave ED % save loop value + /ip ED % dito + 1 1 #3 { + dup + /iqSave ED % save loop value + /iq ED % dito + { + iq 0 le { exit } if + ip iq mod + /ip iq def + /iq ED + } loop + ip 1 eq { + /xVal ipSave iqSave div def + xVal #1 ge { xVal #2 le { + \psk@dotsize + \@nameuse{psds@\psk@dotstyle} + \pst@usecolor\pslinecolor xVal 1 iqSave div \tx@ScreenCoor + 2 copy pop 0 moveto lineto } if } if +% 2 copy moveto Dot } if } if + } if + } for + } for + }% + \end@ClosedObj% +} +% +\def\psCplot{\def\pst@par{}\pst@object{psCplot}} +\def\psCplot@i#1#2#3#4{% start | end | complex variables | function + \pst@killglue + \begingroup + \use@par + \@nameuse{beginplot@\psplotstyle}% + \addto@pscode{% + \psplot@init + /x #1 def + /x1 #2 def + /dx x1 x sub \psk@plotpoints div def + #3 + /xy { +% x + tx@FuncDict begin + #4 aload pop \pst@number\psyunit mul exch \pst@number\psxunit mul exch + end + } def}% + \gdef\psplot@init{}% + \@pstfalse + \@nameuse{testqp@\psplotstyle}% + \if@pst + \psplot@ii + \else + \psplot@iii + \fi + \endgroup + \ignorespaces} +% +\define@boolkey[psset]{pst-func}[Pst@]{xory}[true]{} +\define@boolkey[psset]{pst-func}[Pst@]{approx}[true]{} +\define@boolkey[psset]{pst-func}[Pst@]{Framed}[true]{} +\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}[I]{\def\psk@func@PointName{#1}} +\define@key[psset]{pst-func}{ydecimals}[2]{\pst@getint{#1}\psk@ydecimals } +\define@key[psset]{pst-func}{labeldistance}[0]{\def\psk@ldistance{#1 }} +\psset[pst-func]{originV=false,onlyNode=false,ydecimals=2,labeldistance=0, + PrintCoord=false,onlyYVal=false,Newton=false,PointName=I,Framed=false,xory=false,approx=true} +% +%-------------------------------------------------------------------- +%------------- 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\"{u}r die Nullstelle, bzw #1 Startwert f\"{u}r Newton, #3 1. Funktion, #4 2. Funktion, #5 Knotenname + \begingroup + \pst@killglue + \addbefore@par{labelangle=0,framesep=1pt}%fontscale=40,PSfont=NimbusRomNo9L-Regu}% + % labelangle=0 -> take xShift and yShift into account, otherwise xShift=pslabelsep * cos(labelangle) + % yShift=pslabelsep * sin(labelangle) + \use@par + \pst@Verb{ + /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 yM definiert + }% +\pnode(! xM yM){#5}% +\addto@pscode{% + \iftrue %\psFunc@langle pt>\z@ + /xShift \psFunc@langle cos \psk@ldistance mul def + /yShift \psFunc@langle sin \psk@ldistance mul def + \else + /xShift \psk@xShift\space def + /yShift \psk@yShift\space def + \fi +\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 { /StandardSymL findfont \psk@fontscale\space scalefont setfont } bind def % Symbolschrift f\"{u}r Klammer und senkrechten Strich + /schrift { \psk@PSfont\space findfont \psk@fontscale scalefont setfont } bind def % Schrift f\"{u}r die Ergebnisse + /TiefSchrift { /StandardSymL findfont \psk@fontscale 1.8 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 { dec -1 le { /dec 15 def } if 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 + /frs \pst@number\psframesep 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 xShift add \pst@number\psxunit mul + yM yShift add \pst@number\psyunit mul + \fi + \pst@usecolor\pslinecolor + \ifPst@PrintCoord +/xytext { moveto schrift (\psk@func@PointName) show + 0 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 schrift yM yWert 0 spdy rmoveto symb (\string\051) show } bind def + xytext + 0 spdy neg rmoveto +% ------------------------------------------------------------------------------ TS 03.2017 + \ifPst@Framed + frs \psk@fontscale 0.15 mul frs add neg rmoveto + 0 \psk@fontscale 0.9 mul frs 2 mul add rlineto + \ifPst@originV + frs neg \psk@fontscale 0.75 mul frs add L + \else + xM xShift add \pst@number\psxunit mul frs sub + yM yShift add \pst@number\psyunit mul \psk@fontscale 0.75 mul add frs add L + \fi + 0 \psk@fontscale 0.9 mul frs 2 mul add neg rlineto closepath + gsave + \pst@usecolor\psfillcolor \tx@setTransparency fill + grestore + \ifx\pslinestyle\@none\else + \pst@number\pslinewidth SLW \pst@usecolor\pslinecolor \tx@setStrokeTransparency \@nameuse{psls@\pslinestyle} stroke + \fi + \ifPst@originV 0 0 \else + xM xShift add \pst@number\psxunit mul + yM yShift add \pst@number\psyunit mul + \fi + xytext + 0 spdy neg rmoveto + \fi +%------------------------------ Wenn nicht die Form P(a|b) sondern x = a oder y = b oder nur a oder nur b ------------------- + \else + \ifPst@originV 0 0 \else + xM xShift add \pst@number\psxunit mul + yM yShift add \pst@number\psyunit mul + \fi + /xorytext { moveto schrift + \ifPst@onlyYVal% nur der y-Wert + \ifPst@xory% in Form von y=b + (\psk@func@PointName) show + spdx 5 div neg spdy 2.2 mul neg rmoveto TiefSchrift (\psk@postString) show + spdx 1.5 div spdy 2 mul rmoveto symb(\ifPst@approx \string \273 \else \string = \fi) show + spdx 1.5 div neg 0 rmoveto schrift yM yWert + \else schrift yM yWert + \fi + \else + \ifPst@xory% in Form x = a + (\psk@func@PointName) show + spdx 7 div neg spdy 2.2 mul neg rmoveto TiefSchrift (\psk@postString) show + spdx 1.5 div spdy 2 mul rmoveto symb (\ifPst@approx \string \273 \else \string = \fi) show + spdx 1.5 div neg 0 rmoveto schrift xM Wert + \else schrift xM Wert + \fi + \fi } bind def + xorytext + \ifPst@Framed%------------------------------ Rahmenbeginn ------------------------------ + frs \psk@fontscale 0.14 mul frs add neg rmoveto + 0 \psk@fontscale 0.9 mul frs 2 mul add rlineto + \ifPst@originV + frs neg \psk@fontscale 0.75 mul frs add L + \else + xM xShift add \pst@number\psxunit mul frs sub + yM yShift add \pst@number\psyunit mul \psk@fontscale 0.75 mul add frs add L + \fi + 0 \psk@fontscale 0.9 mul frs 2 mul add neg rlineto closepath + gsave + \pst@usecolor\psfillcolor \tx@setTransparency fill + grestore + \ifx\pslinestyle\@none\else + \pst@number\pslinewidth SLW \pst@usecolor\pslinecolor \tx@setStrokeTransparency \@nameuse{psls@\pslinestyle} stroke + \fi + \ifPst@originV 0 0 \else + xM xShift add \pst@number\psxunit mul + yM yShift add \pst@number\psyunit mul + \fi + xorytext + \fi + \fi +\fi}% +\ifPst@markZeros\psdot(#5)\fi +\endgroup\use@pscode\ignorespaces +}% +% +\catcode`\@=\PstAtCode\relax +% +%% END: pst-func.tex +\endinput +% + |