Я пытаюсь построить график функции Эвана Вебстера с помощью tikz:
Изображение выше создано в Python с использованием функции numpy:
import numpy as np
import matplotlib.pyplot as plt
a = 0
b = 2
x = np.linspace(a,b,points)
y = np.exp(x)* np.sin(100*np.cosh(x))
plt.plot(x,y)
Но мой сюжет не идет так, как ожидалось. Мой код такой:
\documentclass[tikz]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[domain=0:2]
\draw[->] (-0.2,0) -- (3,0) node[right] {$x$};
\draw[->] (0,-1.2) -- (0,4) node[above] {$f(x)$};
\draw[color=red] plot (\x,\x) node[right] {$f(x) =x$};
\draw[color=orange] plot (\x,{exp(\x)*sin(100*cosh(\x))}) node[right] {$f(x) = \frac{1}{20} \mathrm e^x$};
\end{tikzpicture}
\end{document}
решение1
Я исправил ваш код.
Вам необходимо указать, что вы используете радианы в аргументе синуса (он находится с r
).
Я изменил шкалу x и шкалу y (потому что экспонента быстро растет).
Я добавил smooth
ключ, поэтому кривая сглажена, а не нарисована прямыми линиями между точками.
Я увеличил количество точек выборки до 500 (по умолчанию 25).
Но мне нужно ограничить область построения графика 0:1.7
вместо0:2
поскольку если это не так, TiкZ жалуется наразмер слишком большойошибки.
\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}[domain=0:1.70,samples=500,smooth,xscale=3,yscale=0.5]
\draw[->] (-0.2,0) -- (2.5,0) node[right] {$x$};
\draw[->] (0,-5) -- (0,5) node[above] {$f(x)$};
\draw[color=orange] plot (\x,{exp(\x)*sin(100*cosh(\x) r)}) node[right]
{$f(x) = \mathrm e^x\sin\left(100\cosh\left(x\right)\right)$};
\end{tikzpicture}
\end{document}
Дляразмер слишком большойошибки, вместо использования TiкZ, мы можем использоватьpgfplots.
Вот первая попытка:
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\begin{document}
\begin{tikzpicture}
\begin{axis}[samples=500,domain=0:2]
\addplot[orange]plot (\x, {exp(\x)*sin(100*cosh(\x) r)});
\end{axis}
\end{tikzpicture}
\end{document}
Как видите, в итоге все не идеально.
Мы можем разделить выборку на две области, причем последняя область для x между 1,2 и 2 использует более плотную выборку.
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot[orange,samples=500,domain=0:1.5]plot (\x, {exp(\x)*sin(100*cosh(\x) r)});
\addplot[orange,samples=1000,domain=1.5:2]plot (\x, {exp(\x)*sin(100*cosh(\x) r)});
\end{axis}
\end{tikzpicture}
\end{document}
Получаем более точное представление:
Мы можем персонализировать презентацию:
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\begin{document}
\begin{tikzpicture}
\begin{axis}[axis x line=middle,axis y line=left,xlabel=$x$,legend pos=north west]
\addplot[orange,samples=500,domain=0:1.5]plot (\x, {exp(\x)*sin(100*cosh(\x) r)});
\addplot[orange,samples=1000,domain=1.5:2]plot (\x, {exp(\x)*sin(100*cosh(\x) r)});
\legend{\textcolor{orange}{$\mathrm e^x\sin\left(100\cosh\left(x\right)\right)$}}
\end{axis}
\end{tikzpicture}
\end{document}
решение2
Asymptote имеет больше контроля над математическими графиками. В этом случае количество точек выборки n=1000
и тип соединения Hermite
работают вместе довольно хорошо.
// http://asymptote.ualberta.ca/
import graph;
unitsize(5cm,4mm);
real a=0,b=2;
real y(real x) {return exp(x)*sin(100*cosh(x));}
path gr=graph(y,a,b,n=1000,Hermite);
draw(gr,magenta);
axes();
shipout(bbox(5mm,invisible));