请考虑以下动画。
\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pst-plot}
\def\f{x^2-x-6}
\psset{unit=3,algebraic}
\def\Atom#1{%
\begin{pspicture}(-1.5,-6.5)(2,-2.5)
\psplot[linecolor=blue]{-1}{1}{\f}
\psline[linecolor=green,linewidth=5\pslinewidth](-1,-3.5)(#1,-3.5)
\psline[linecolor=green,linewidth=5\pslinewidth](0,0|*-1 {\f})(0,0|*#1 {\f})
\psline[linecolor=orange,linestyle=dashed](#1,-3.5)(*#1 {\f})(0,0|*#1 {\f})
\pscircle*[linecolor=red](*#1 {\f}){2pt}
\psaxes[linecolor=lightgray,Oy=-3.50,Dy=.25,Dx=.5]{->}(0,-3.5)(-1.49,-6.49)(1.5,-3)[$x$,0][$y$,90]
\end{pspicture}}
\begin{document}
\multido{\r=-1.0+.125}{17}{\Atom{\r}}
\end{document}
垂直绿线应该是 的范围f(x)
。-1<=x<=1
当x>.5
我想防止垂直绿线(范围)缩小时。我的粗略想法如下,但它不会编译,因为\ifnum
不能是分数。
\ifnum#1>.5
\psline[linecolor=green,linewidth=5\pslinewidth](0,0|*-1 {\f})(0,0|*.5 {\f})
\else
\psline[linecolor=green,linewidth=5\pslinewidth](0,0|*-1 {\f})(0,0|*#1 {\f})
\fi
实际上fp
包可以提供帮助,但我想避免使用它。为了适应更通用的函数,我想缓冲f(x)
每次迭代的最小值-1<=x<=1
,并使用此缓冲区与当前的值\f
进行比较。
你怎么认为?
答案1
您可以使用\ifdim
来检查重复数字:
\ifdim#1pt>.5pt
\psline[linecolor=green,linewidth=5\pslinewidth](0,0|*-1 {\f})(0,0|*.5 {\f})
\else
\psline[linecolor=green,linewidth=5\pslinewidth](0,0|*-1 {\f})(0,0|*#1 {\f})
\fi
如果希望它非常灵活,则需要累积所有先前的函数值。首先,我尝试使用\pnode
当前最小值进行保存,但这样做行不通,因为您的图像跨越了好几页。因此,您可以累积所有函数值的 Postscript 代码,然后在需要时确定最小值\psline
:
\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pst-node, pst-plot}
\def\f{x^2-x-6}
\psset{unit=3,algebraic}
\makeatletter
\def\minynode@list{}%
\def\addyvalue(#1){%
\pst@getcoor{#1}\pst@tempA%
\ifx\minynode@list\@empty
\xdef\minynode@list{mark }%
\fi
\xdef\minynode@list{\minynode@list \pst@tempA \tx@UserCoor exch pop }
}%
\def\getminyvalue{%
\minynode@list counttomark 1 sub { min } repeat exch pop 0 exch
}
\makeatother
\def\Atom#1{%
\begin{pspicture}(-1.5,-6.5)(2,-2.5)
\psplot[linecolor=blue]{-1}{1}{\f}
\psline[linecolor=green,linewidth=5\pslinewidth](-1,-3.5)(#1,-3.5)
\addyvalue(0,0|*#1 {\f})
\psline[linecolor=green,linewidth=5\pslinewidth](0,0|*-1 {\f})(!\getminyvalue)
\psline[linecolor=orange,linestyle=dashed](#1,-3.5)(*#1 {\f})(0,0|*#1 {\f})
\pscircle*[linecolor=red](*#1 {\f}){2pt}
\psaxes[linecolor=lightgray,Oy=-3.50,Dy=.25,Dx=.5]{->}(0,-3.5)(-1.49,-6.49)(1.5,-3)[$x$,0][$y$,90]
\end{pspicture}}
\begin{document}
\multido{\r=-1.0+.125}{17}{\Atom{\r}}
\end{document}
这可行,但我愿意改进:)
答案2
\psline[linecolor=green,linewidth=5\pslinewidth]%
(0,0|*-1 {\f})(*{#1 .5 gt {.5}{#1} ifelse } {\f})