我认为已经有人问过类似的问题,但我不明白答案。给定一个函数的图形,我想绘制反函数的图形,也就是说,我希望能够反映例如抛物线相对于直线 y=x 的曲线。有没有在 tikzpicture 中不太复杂的方法来实现这一点?谢谢!
Marmot,鉴于你下面写的内容,我认为这应该非常简单。(非常感谢,你的回答非常清楚!)我所做的就是(1)复制你的代码两次并使用迷你页面(2)将正弦的域更改为(-pi/2,pi/2),将反正弦的域更改为(-1,1)(3)在迷你页面中分别注释掉反正弦和正弦,以免两个图形混在一起。
为什么这不起作用?
\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{backgrounds}
\begin{document}
\begin{minipage}{.5\textwidth}
\begin{tikzpicture}[
declare function={ f(\x) = sin(\x*180/pi); %<- enter your function right here
a=1;
b=1;
reflectedx(\x) = -\x+2*a*(\x*a+f(\x)*b)/(pow(a,2)+pow(b,2));
reflectedy(\x) = -f(\x)+2*b*(\x*a+f(\x)*b)/(pow(a,2)+pow(b,2));
},
]
\begin{scope}[local bounding box=plots]
\draw [blue,thick] plot [domain=-pi/2:pi/2,samples=100,smooth] ({\x}, {f(\x)});
%\draw [red,thick] plot [domain=-4:4,samples=100,smooth] ({reflectedx(\x)},{reflectedy(\x)});
\end{scope}
\begin{scope}[on background layer]
\draw[thick,-latex] ([xshift=-2mm]plots.west |-0,0) -- ([xshift=4mm]plots.east
|-0,0) node[below left]{$x$};
\draw[thick,-latex] ([yshift=-2mm]plots.south -|0,0) -- ([yshift=4mm]plots.north
-|0,0) node[below left]{$y$};
\end{scope}
\end{tikzpicture}
\end{minipage}
\begin{minipage}{.5\textwidth}
\begin{tikzpicture}[
declare function={ f(\x) = sin(\x*180/pi); %<- enter your function right here
a=1;
b=1;
reflectedx(\x) = -\x+2*a*(\x*a+f(\x)*b)/(pow(a,2)+pow(b,2));
reflectedy(\x) = -f(\x)+2*b*(\x*a+f(\x)*b)/(pow(a,2)+pow(b,2));
},
]
\begin{scope}[local bounding box=plots]
%\draw [blue,thick] plot [domain=-4:4,samples=100,smooth] ({\x}, {f(\x)});
\draw [red,thick] plot [domain=-1:1,samples=100,smooth] ({reflectedx(\x)},{reflectedy(\x)});
\end{scope}
\begin{scope}[on background layer]
\draw[thick,-latex] ([xshift=-2mm]plots.west |-0,0) -- ([xshift=4mm]plots.east
|-0,0) node[below left]{$x$};
\draw[thick,-latex] ([yshift=-2mm]plots.south -|0,0) -- ([yshift=4mm]plots.north
-|0,0) node[below left]{$y$};
\end{scope}
\end{tikzpicture}
\end{minipage}
\end{document}
答案1
如果你不能理解这个答案,我提前道歉(但我也不知道我应该添加哪些解释我之前的回答。我唯一能看到的是,之前的答案是使用 pgfplots。假设这是问题所在,下面是一个 Ti钾仅限 Z 答案。(不过,我相信如果您使用 pgfplots 来做这件事,效果会更好。)您需要做的就是在标记的位置输入要“反转”的函数。(当然,如果函数不像下面的例子那样单调,那么这并不是真正的逆函数,只是反射。)
\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{backgrounds}
\begin{document}
\begin{tikzpicture}[
declare function={ f(\x) = sin(\x*180/pi); %<- enter your function right here
a=1;
b=1;
reflectedx(\x) = -\x+2*a*(\x*a+f(\x)*b)/(pow(a,2)+pow(b,2));
reflectedy(\x) = -f(\x)+2*b*(\x*a+f(\x)*b)/(pow(a,2)+pow(b,2));
},
]
\begin{scope}[local bounding box=plots]
\draw [blue,thick] plot [domain=-4:4,samples=100,smooth] ({\x}, {f(\x)});
\draw [red,thick] plot [domain=-4:4,samples=100,smooth] ({reflectedx(\x)},{reflectedy(\x)});
\end{scope}
\begin{scope}[on background layer]
\draw[thick,-latex] ([xshift=-2mm]plots.west |-0,0) -- ([xshift=4mm]plots.east
|-0,0) node[below left]{$x$};
\draw[thick,-latex] ([yshift=-2mm]plots.south -|0,0) -- ([yshift=4mm]plots.north
-|0,0) node[below left]{$y$};
\end{scope}
\end{tikzpicture}
\end{document}
附录:至于为什么你的代码“不起作用”。我使用的是独立类,它与\textwidth
其他类不同。如果你切换到article
(比如说),你会没事的:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{backgrounds}
\begin{document}
\begin{minipage}{.5\textwidth}
\begin{tikzpicture}[
declare function={ f(\x) = sin(\x*180/pi); %<- enter your function right here
a=1;
b=1;
reflectedx(\x) = -\x+2*a*(\x*a+f(\x)*b)/(pow(a,2)+pow(b,2));
reflectedy(\x) = -f(\x)+2*b*(\x*a+f(\x)*b)/(pow(a,2)+pow(b,2));
},
]
\begin{scope}[local bounding box=plots]
\draw [blue,thick] plot [domain=-pi/2:pi/2,samples=100,smooth] ({\x}, {f(\x)});
%\draw [red,thick] plot [domain=-4:4,samples=100,smooth] ({reflectedx(\x)},{reflectedy(\x)});
\end{scope}
\begin{scope}[on background layer]
\draw[thick,-latex] ([xshift=-2mm]plots.west |-0,0) -- ([xshift=4mm]plots.east
|-0,0) node[below left]{$x$};
\draw[thick,-latex] ([yshift=-2mm]plots.south -|0,0) -- ([yshift=4mm]plots.north
-|0,0) node[below left]{$y$};
\end{scope}
\end{tikzpicture}
\end{minipage}
%
\begin{minipage}{.5\textwidth}
\begin{tikzpicture}[
declare function={ f(\x) = sin(\x*180/pi); %<- enter your function right here
a=1;
b=1;
reflectedx(\x) = -\x+2*a*(\x*a+f(\x)*b)/(pow(a,2)+pow(b,2));
reflectedy(\x) = -f(\x)+2*b*(\x*a+f(\x)*b)/(pow(a,2)+pow(b,2));
},
]
\begin{scope}[local bounding box=plots]
%\draw [blue,thick] plot [domain=-4:4,samples=100,smooth] ({\x}, {f(\x)});
\draw [red,thick] plot [domain=-1:1,samples=100,smooth] ({reflectedx(\x)},{reflectedy(\x)});
\end{scope}
\begin{scope}[on background layer]
\draw[thick,-latex] ([xshift=-2mm]plots.west |-0,0) -- ([xshift=4mm]plots.east
|-0,0) node[below left]{$x$};
\draw[thick,-latex] ([yshift=-2mm]plots.south -|0,0) -- ([yshift=4mm]plots.north
-|0,0) node[below left]{$y$};
\end{scope}
\end{tikzpicture}
\end{minipage}
\end{document}
答案2
既然你要求映射给定的 y=x 的图,也就是得到逆函数的图,我推荐三种方法来实现。例如,原始图是 y=ln(x) 的图。
使用
[rotate=45,yscale=-1,rotate=-45]
选项按照从右到左的顺序执行:首先沿 x 轴旋转 -45 度,然后绕 x 轴反射([yscale=-1]),最后再旋转回来 45 度。选项
[rotate=-45,xscale=-1,rotate=45]
给出相同的结果。用途
[x={(0cm,1cm)},y={(1cm,0cm)}]
这就是反函数的几何意义。使用
({ln(\x)},\x)
而不是(\x,{ln(\x)})
这是 TikZ 绘制图形的方式。
注意:关于 y=-x 的反射,使用[rotate=45,xscale=-1,rotate=-45]
另外,你可以用同样的方式反射 y=ax+b(首先移动到原点)! PS:我个人喜欢第一种方法。我们不仅可以应用于轴对称,还可以应用于中心对称、同位体、平移,使用rotate
、rotate around
、scale
、scale around
和shift
。TikZ 很棒!
以上三种方式给出的图像相同。希望您理解这个答案^^以下是完整的代码。
\documentclass[tikz,border=5mm]{standalone}
\pagecolor{yellow!30}
\begin{document}
% The original graph y=ln(x)
\def\originpath{
plot[domain=.1:4.5,smooth] (\x,{ln(\x)})
}
% reflecting y=ln(x) about y=x
% to get (the graph of) the inverse function y=e^x
% 1st way: use [rotate=-45,xscale=-1,rotate=45]
\begin{tikzpicture}
\draw (-2,-2)--(4,4) node[above]{$y=x$};
\draw[-stealth] (-3,0)--(5,0) node[below=1mm]{$x$};
\draw[-stealth] (0,-3)--(0,5) node[left=1mm]{$y$};
\draw[blue,thick] \originpath node[above]{$y=\ln x$};
\draw[magenta,thick,rotate=45,yscale=-1,rotate=-45]
\originpath node[above]{$y=e^x$};
\end{tikzpicture}
% 2nd way: use [x={(0cm,1cm)},y={(1cm,0cm)}]
\begin{tikzpicture}
\draw (-2,-2)--(4,4) node[above]{$y=x$};
\draw[-stealth] (-3,0)--(5,0) node[below=1mm]{$x$};
\draw[-stealth] (0,-3)--(0,5) node[left=1mm]{$y$};
\draw[blue,thick] \originpath node[above]{$y=\ln x$};
\draw[magenta,thick,x={(0cm,1cm)},y={(1cm,0cm)}]
\originpath node[above]{$y=e^x$};
\end{tikzpicture}
% 3rd way: change (\x,{ln(\x)}) to ({ln(\x)},\x)
\begin{tikzpicture}
\draw (-2,-2)--(4,4) node[above]{$y=x$};
\draw[-stealth] (-3,0)--(5,0) node[below=1mm]{$x$};
\draw[-stealth] (0,-3)--(0,5) node[left=1mm]{$y$};
\draw[blue,thick]
plot[domain=.1:4.5,smooth] (\x,{ln(\x)})
node[above]{$y=\ln x$};
\draw[magenta,thick]
plot[domain=.1:4.5,smooth] ({ln(\x)},\x)
node[above]{$y=e^x$};
\end{tikzpicture}
\end{document}