如何缓冲 f(x) 的极值来画一条表示 f(x) 范围的线?

如何缓冲 f(x) 的极值来画一条表示 f(x) 范围的线?

请考虑以下动画。

\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<=1x>.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})

相关内容