pgfplots
我想编写一个宏,它以数学函数作为参数并返回使用该函数及其导数的图。
我猜想仅使用 LaTeX 是不可能做到这一点的;但是,例如,pgfplots
可以使用外部程序gnuplot
来绘制函数,或者使用 LuaTeX...
那么有没有什么办法可以得到数学函数的导数来做到这一点呢?
答案1
在合理范围内(即对于不是太非线性的函数),您可以在 PGFPlots 中以数值方式区分您的函数,使用以下方法f'(x)=(f(x+dx)-f(x))/dx
:
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[no markers, legend pos=south east, legend entries={Original function, Analytical derivative, Numerical derivative}]
\addplot [gray] {x^3};
\addplot [line width=3pt, red!50] {3*x^2};
\addplot [black] {((x+0.01)^3-(x)^3)/0.01};
\end{axis}
\end{tikzpicture}
\begin{tikzpicture}
\begin{axis}[no markers, samples=500]
\addplot [gray] {sin(deg(x))};
\addplot [line width=3pt, red!50] {cos(deg(x))};
\addplot [black] {(sin(deg(x+0.01))-sin(deg(x)))/0.01};
\end{axis}
\end{tikzpicture}
\end{document}
答案2
答案3
的前 15 个推导
f(x)=1-x^2/2+x^4/24-x^6/720+x^8/40320-x^10/3628800+x^12/479001600-x^14/87178291200
即
\PassOptionsToPackage{dvipsnames,svgnames}{pstricks}
\documentclass[pstricks]{standalone}
\usepackage{pstricks-add}
\begin{document}
\psset{unit=2cm}
\def\getColor#1{\ifcase#1 Tan\or RedOrange\or magenta\or yellow\or green%
\or Orange\or blue\or DarkOrchid\or BrickRed\or Rhodamine\or OliveGreen%
\or Goldenrod\or Mahogany\or OrangeRed\or CarnationPink\or RoyalPurple\or Lavender\fi}
\begin{pspicture}[showgrid](-0.2,-1.2)(7,1.5)
\psclip{\psframe[linestyle=none](-0.2,-1.1)(7,1.1)}
\multido{\in=0+1}{16}{%
\psplot[linewidth=1pt,algebraic=true,linecolor=\getColor{\in}]{0}{7}
{Derive(\in,1-x^2/2+x^4/24-x^6/720+x^8/40320-x^10/3628800+
x^12/479001600-x^14/87178291200)}}
\endpsclip
\end{pspicture}
\end{document}
前 2 个 sin(x)*cos(x)
答案4
这是一个PythonTeX@Jake 的答案的版本,使用pgfplots
。这需要相当多的代码来尝试在 Python 和语法之间来回转换pgfplots
。使用像 matplotlib 这样的 Python 绘图解决方案可能会更简单,尽管这也可能需要从 SymPy 进行一些转换。
\documentclass{article}
\usepackage{pgfplots}
\usepackage{pythontex}
\begin{document}
\begin{sympycode}
import re
x = Symbol('x')
def deriv(tikz_args, expr):
expr = eval(expr.replace('^', '**'))
expr_deriv = str(diff(expr, x)).replace('**', '^')
expr = str(expr).replace('**', '^')
for f in ['sin', 'cos', 'tan']:
if f in expr:
fpattern = f + r'\((.+)\)'
expr = re.sub(fpattern, f + r'(deg(\1))', expr)
if f in expr_deriv:
fpattern = f + r'\((.+)\)'
expr_deriv = re.sub(fpattern, f + r'(deg(\1))', expr_deriv)
func = r'\addplot [blue] {' + expr + r'};'
func_deriv = r'\addplot [red] {' + expr_deriv + r'};'
tikz = r'''
\begin{tikzpicture}
\begin{axis}[tikz_args]
addplots
\end{axis}
\end{tikzpicture}'''
tikz = tikz.replace('tikz_args', tikz_args)
tikz = tikz.replace('addplots', '\n'.join([func, func_deriv]))
print(tikz)
\end{sympycode}
\newcommand{\plotderiv}[2][]{\sympyc{deriv("#1", "#2")}}
\plotderiv[no markers, legend pos=south east, legend entries={Function, Derivative}]{x^3}
\plotderiv[no markers, legend pos=south east, legend entries={Function, Derivative}, samples=500]{sin(x)}
\end{document}