
Preciso representar graficamente uma função com 2 constantes (\varepsilon e \k) e 1 variável (\m). Eu uso \declarefunction
.
Meu problema é que o eixo y é muito pequeno e não sei como configurá-los em meu código para obter a saída esperada. A função é esta:
\[
f(m,\varepsilon,k)=\frac{\left( 1-\varepsilon \right) }{2}\left( 1-\left(
1-\varepsilon \right) ^{m}-m\left( 1-\varepsilon \right) ^{m-1}\varepsilon
\right) +\frac{\varepsilon }{2}\left( 2-(1-k\varepsilon )^{m}\right) -\frac{m%
}{2}\varepsilon (1-k\varepsilon )^{m-1}k\varepsilon \left( 1+\frac{\left(
1-\varepsilon \right) \left( 1-\varepsilon \right) ^{m-1}\varepsilon }{%
\left( 1-\varepsilon \right) \varepsilon +\varepsilon (1-k\varepsilon )^{m}}%
\right)
\]
Então, meu código é:
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.17}
\pgfplotsset{every non boxed x axis/.append style={x axis line style=-},
every non boxed y axis/.append style={y axis line style=-}}
\begin{document}
\begin{figure}
\centering
\begin{tikzpicture}
\begin{axis}[xlabel={b},
ylabel={r},
axis lines=left,
y tick label style={/pgf/number format/.cd,sci,sci e},
declare function={f(\m,\e,\k)=
((1-\e)/(2))*
(1-pow((1-\e),\m)-\m*\e*(pow((1-\e),(\m-1))))+
(\e/2)*(2-pow((1-\k*\e),\m))-
(\m/2)*\e*\k*\e*pow((1-\k*\e),(\m-1))*
(1+(((1+\e)*pow((1-\e),(\m-1))*\e)/((1-\e)*\e+\e*(pow(1-\k*\e),\m))))
;},
domain=1:8,no marks,samples=20
,smooth, ymin=0.00044, ymax=0.000445, xmin=2, xmax=5,
extra x ticks={2.25, 2.75, 3.25, 3.75, 4.25, 4.75},
extra x tick labels={ },
% extra y ticks={1.425, 1.435, 1.445, 1.455},
% extra y tick labels={ },
tick label style={font=\scriptsize}]
\addplot[color=black, domain=2:5, variable = \m]{f(m, 0.001, 100)};
\end{axis}
\end{tikzpicture}
\end{figure}
\end{document}
A saída esperada é a seguinte.
Alguém poderia me ajudar a definir os valores do eixo y para obter esse gráfico? Já tentei alguns valores mas não obtive sucesso.
Responder1
Para diversão e exercício: pequena variação fora do tópico de legal @Ñakoresposta (+1):
\documentclass[margin=3mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.17}
\begin{document}
\pgfkeys{/pgf/number format/.cd,
sci,
sci generic={mantissa sep={\,},exponent={\textsc{e}^{#1}}},
precision=1
}
\begin{tikzpicture}[
declare function={f(\m,\e,\k)=
((1-\e)/2)*(1-pow((1-\e),\m)-\m*\e*(pow((1-\e),(\m-1))))+
(\e/2)*(2-pow((1-\k*\e),\m))-
(\m/2)*\e*\k*\e*pow((1-\k*\e),(\m-1))*(1+(((1+\e)*pow((1-\e),(\m-1))*\e)/((1-\e)*\e) +
\e*(pow((1-\k*\e),\m)))));}
\begin{axis}[
axis lines=left,
xlabel={$b$},
ylabel={$r$},
x label style={at={(1,0)}, anchor=north east},
y label style={at={(0,1)}, rotate=-90, anchor=north east},
scaled ticks=false,
minor tick num=1,
ticklabel style={font=\scriptsize},
xticklabel style={/pgf/number format/.cd, fixed, fixed zerofill},
yticklabel style={/pgf/number format/sci},
xmax=5.4,
domain=2:5,
samples=401, no marks
]
\addplot +[thick, variable=\m]{f(m, 0.001, 100)};
\end{axis}
\end{tikzpicture}
\end{document}
Responder2
EDITAR: Implementação emgnuplot
Traçar a mesma função com gnuplot
resultados na saída desejada, que difere daquela pgfplots
, consulteresposta original.
MWE:
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.17}
\pgfplotsset{every non boxed x axis/.append style={x axis line style=-},
every non boxed y axis/.append style={y axis line style=-}}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
xlabel={b},
ylabel={r},
axis lines=left,
scaled ticks=false,
yticklabel style={/pgf/number format/precision=3,
/pgf/number format/.cd,
sci,sci e,
/tikz/.cd,},
xmin=2, xmax=5,
ymin=0.000441, ymax=0.000456,
extra x ticks={2.25, 2.75, 3.25, 3.75, 4.25, 4.75},
extra x tick labels={ },
ytick={0.000441,0.000443,...,0.000456},
]
\addplot[color=red, samples=20, smooth,domain = 2:5, no markers] gnuplot [raw gnuplot]{ %
f(x)=((1-eps)/2)*(1-(1-eps)**x-x*(1-eps)**(x-1)*eps)+eps/2*(2-(1-k*eps)**x)-x/2*eps*k*eps*(1-k*eps)**(x-1)*(1+((1+eps)*(1-eps)**(x-1)*eps)/((1-eps)*eps+eps*(1-k*eps)**x));
eps=0.001;k=100;
plot[x=2:5] f(x);
};
\end{axis}
\end{tikzpicture}
\end{document}
Resposta original
Minha saída para sua função difere um pouco da esperada (talvez eu tenha perdido alguma coisa!?):
O declare function
tem que ser implementado no tikzpicture
ambiente e não na axis
definição. Você também esqueceu um colchete, veja último pow((1-\k*\e,\m)
. Além disso, depois de mudar o diretório para o number format
de yticklabel style
você deve voltar para o tikz.
Com os limites do eixo y ymin=0.00044
eymax=0.00045
MWE:
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.17}
\pgfplotsset{every non boxed x axis/.append style={x axis line style=-},
every non boxed y axis/.append style={y axis line style=-}}
\begin{document}
\begin{figure}
\centering
\begin{tikzpicture}[
declare function={f(\m,\e,\k)=
((1-\e)/(2))*
(1-pow((1-\e),\m)-\m*\e*(pow((1-\e),(\m-1))))+
(\e/2)*(2-pow((1-\k*\e),\m))-
(\m/2)*\e*\k*\e*pow((1-\k*\e),(\m-1))*
(1+(((1+\e)*pow((1-\e),(\m-1))*\e)/((1-\e)*\e+\e*(pow((1-\k*\e),\m)))) % <-- bracket
;},
]
\begin{axis}[
xlabel={b},
ylabel={r},
axis lines=left,
scaled ticks=false,
yticklabel style={/pgf/number format/precision=1,
/pgf/number format/.cd,
sci,sci e,
/tikz/.cd,}, %<-- change back to tikz directory
% domain=1:8,
% no marks,
samples=20,
smooth,
% ymin=0.00044, ymax=0.00045,
xmin=2, xmax=5,
extra x ticks={2.25, 2.75, 3.25, 3.75, 4.25, 4.75},
extra x tick labels={ },
% extra y ticks={1.425, 1.435, 1.445, 1.455},
% extra y tick labels={ },
ticklabel style={font=\scriptsize}]
\addplot[color=red, domain=2:5, variable = \m]{f(m, 0.001, 100)};
\end{axis}
\end{tikzpicture}
\end{figure}
\end{document}
Editar: sobre a função epgfplots
Para efeito de comparação, plotei a função:
((1-eps)/2)*(1-(1-eps)^x-x*(1-eps)^(x-1)*eps)+eps/2*(2-(1-k*eps)^x)-x/2*eps*k*eps*(1-k*eps)^(x-1)*(1+((1+eps)*(1-eps)^(x-1)*eps)/((1-eps)*eps+eps*(1-k*eps)^x))
Agora está claro que a diferença vem pgfplots
e como ela calcula a função. Parece-me que tem a ver com o poder.