График функции с экспоненциальной осью Y

График функции с экспоненциальной осью Y

Мне нужно построить график функции с 2 константами (\varepsilon и \k) и 1 переменной (\m). Я использую \declarefunction.

Моя проблема в том, что y-ось очереди слишком мала, и я не знаю, как задать их в моем коде, чтобы получить ожидаемый результат. Функция такая:

\[
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) 
\]

Тогда мой код:

\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}

Ожидаемый результат следующий.

введите описание изображения здесь

Может ли кто-нибудь помочь мне установить значения оси Y, чтобы получить этот график? Я пробовал некоторые значения, но безуспешно.

решение1

Для развлечения и тренировки: небольшая нестандартная вариация приятного @Ñakoответ (+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}

введите описание изображения здесь

решение2

EDIT: Реализация вgnuplot

Построение графика той же функции с gnuplotрезультатом в желаемом результате, который отличается от pgfplotsтого, см.оригинальный ответ.

введите описание изображения здесь

МВЭ:

\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}

Оригинальный ответ

Мой вывод вашей функции немного отличается от ожидаемого (может быть, я что-то упустил!?): введите описание изображения здесь

The declare functionдолжен быть реализован в tikzpictureсреде, а не в axisопределении. Вы также забыли скобку, см. последний pow((1-\k*\e,\m). Кроме того, после смены каталога на number formatof yticklabel styleвам придется вернуться к tikz.

С пределами оси Y ymin=0.00044иymax=0.00045

введите описание изображения здесь

МВЭ:

\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}

Редактировать: о функции иpgfplots

Для сравнения я построил график функции:

((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))

с OriginLab: введите описание изображения здесь

Теперь понятно, откуда pgfplotsи как вычисляется функция, разница. Мне кажется, что дело в мощности.

Связанный контент