Função Erf em LaTeX

Função Erf em LaTeX

Existe uma maneira de calcular facilmentea função erf(ou a função de distribuição cumulativa da lei normal) em LaTeX?

Atualmente, eu uso pgfpara fazer cálculos, mas não encontrei uma maneira de calcular erf usando pgf.

Eu ficaria feliz em usar qualquer pacote disponível para calcular erf ou qualquer solução personalizada para calcular essa função.

Responder1

Para valores precisos, recomendo externalizar o cálculo, aqui gnuploté utilizado.

Código (precisa ser --shell-escapehabilitado)

\documentclass{article}
\usepackage{amsmath,pgfmath,pgffor}
\makeatletter
\def\qrr@split@result#1 #2\@qrr@split@result{\edef\erfInput{#1}\edef\erfResult{#2}}
\newcommand*{\gnuplotErf}[2][\jobname.eval]{%
    \immediate\write18{gnuplot -e "set print '#1'; print #2, erf(#2);"}%
    \everyeof{\noexpand}
    \edef\qrr@temp{\@@input #1 }%
    \expandafter\qrr@split@result\qrr@temp\@qrr@split@result
}
\makeatother
\DeclareMathOperator{\erf}{erf}
\begin{document}
\foreach \x in {-50,...,50}{%
\pgfmathparse{\x/50}%
\gnuplotErf{\x/50.}%
$ x = \pgfmathresult = \erfInput, \erf(x) = \erfResult$\par
}
\end{document}

Saída

insira a descrição da imagem aqui

Responder2

Baseado emesta resposta.

\documentclass{standalone}
\usepackage{tikz}
\makeatletter
\pgfmathdeclarefunction{erf}{1}{%
  \begingroup
    \pgfmathparse{#1 > 0 ? 1 : -1}%
    \edef\sign{\pgfmathresult}%
    \pgfmathparse{abs(#1)}%
    \edef\x{\pgfmathresult}%
    \pgfmathparse{1/(1+0.3275911*\x)}%
    \edef\t{\pgfmathresult}%
    \pgfmathparse{%
      1 - (((((1.061405429*\t -1.453152027)*\t) + 1.421413741)*\t 
      -0.284496736)*\t + 0.254829592)*\t*exp(-(\x*\x))}%
    \edef\y{\pgfmathresult}%
    \pgfmathparse{(\sign)*\y}%
    \pgfmath@smuggleone\pgfmathresult%
  \endgroup
}
\makeatother
\begin{document}
\begin{tikzpicture}[yscale = 3]
  \draw[very thick,->] (-5,0) -- node[at end,below] {$x$}(5,0);
  \draw[very thick,->] (0,-1) -- node[below left] {$0$} node[at end,
  left] {$erf(x)$} (0,1);
  \draw[red,thick] plot[domain=-5:5,samples=200] (\x,{erf(\x)});
\end{tikzpicture}
\end{document}

insira a descrição da imagem aqui

Responder3

Usando omesma ideia de aproximação que cjorssen(Tentei a série de Taylor conforme sugerido por Qrrbrbirlbel, mas é impossível obter uma aproximação decente dessa maneira). Reescrevi a função sem usar PGF de baixo nível. Como já temos muitos gráficos 2D aqui, usarei apenas o gráfico 3D que já tinha.

\documentclass{standalone}
\usepackage{pgfplots}
\usepackage{tikz}
\pgfplotsset{
colormap={bluewhite}{ color(0cm)=(rgb:red,18;green,64;blue,171); color(1cm)=(white)}
}
\begin{document}
\begin{tikzpicture}[
    declare function={erf(\x)=%
      (1+(e^(-(\x*\x))*(-265.057+abs(\x)*(-135.065+abs(\x)%
      *(-59.646+(-6.84727-0.777889*abs(\x))*abs(\x)))))%
      /(3.05259+abs(\x))^5)*(\x>0?1:-1);},
    declare function={erf2(\x,\y)=erf(\x)+erf(\y);}
]
\begin{axis}[
    small,
    colormap name=bluewhite,
    width=\textwidth,
    enlargelimits=false,
    grid=major,
    domain=-3:3,
    y domain=-3:3,
    samples=33,
    unit vector ratio*=1 1 1,
    view={20}{20},
    colorbar,
    colorbar style={
        at={(1,-.15)},
        anchor=south west,
        height=0.25*\pgfkeysvalueof{/pgfplots/parent axis height},
    }
]
\addplot3 [surf,shader=faceted] {erf2(x,y)};
\end{axis}
\end{tikzpicture}
\end{document}

Gráfico 3D de erf(x)+erf(y)

A aproximação tem um erro máximo de 1,5·10 -7 (fonte).

Graças aJakeparalocalização e fixaçãoa sintaxe errada que tive pela primeira vez neste código.

Responder4

O cálculo da função de erro erf(x)e a anatomia da figura (eixos, legendas e rótulos) foram renderizados em três abordagens.

  1. Completamentegnuplot
  2. pgfplotsinvocagnuplot
  3. CompletamenteMatlab

Já existem boas respostas, por exemplo, de Qrrbrbirlbel e cjorssen, ambas explorando o pgfmath em nível macro.

1. Totalmentegnuplot

Cálculo da função de erro erf(x)no gnuplot com eixos, legendas e rótulos renderizados no epslatexterminal gnuplot. A saída do terminal gnuplot é incorporada automaticamente comgnuplottexpacote. terminal=pdfnão renderiza rótulos matemáticos, portanto, epslatexo terminal foi usado.

\documentclass[preview=true,12pt]{standalone}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{gnuplottex}
\begin{document} 
\begin{gnuplot}[terminal=epslatex,terminaloptions=color]
  set grid
  set size square
  set key left 
  set title 'Error function in gnuplot  $ erf(x) = \frac{2}{\sqrt{\pi}} \int_{0}^{x}e^{-t^{2}}\, dt$'
  set samples 50
  set xlabel "$x$"
  set ylabel "$erf(x)$"
  plot [-3:3] [-1:1] erf(x) title 'gnuplot' linetype 1 linewidth 3
\end{gnuplot}
\end{document}

1) figura de saída do gnuplot insira a descrição da imagem aqui

2. pgfplotsinvocagnuplot

Cálculo da função de erro erf(x)no gnuplot invocado por pgfplots e eixos, legendas e rótulos são renderizados por pgfplots

\documentclass[preview=true,12pt]{standalone}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{pgfplots}
\pgfplotsset{compat=1.8}
\begin{document} 
\begin{tikzpicture}
\begin{axis}[xlabel=$x$,ylabel=$erf(x)$,title= {Error function in pgfplots $erf(x)=\frac{2}{\sqrt{\pi}}\int_{0}^{x}e^{-t^{2}}\, dt$},legend style={draw=none},legend pos=north west,grid=major,enlargelimits=false]
\addplot [domain=-3:3,samples=50,red,no markers] gnuplot[id=erf]{erf(x)};
% Note: \addplot function { gnuplot code } is alias for \addplot gnuplot { gnuplot code };
\legend{pgfplots-gnuplot}
\end{axis}
\end{tikzpicture}
\end{document}

2. Figura de saída do pgfplots (backend gnuplot)

insira a descrição da imagem aqui

3) TotalmenteMatlab

Cálculo da função de erro $erf(x)$ no Matlab com eixos, legendas e rótulos renderizados usandomatlabfrag(baseado em tag psfrag) emlf2pdffunções.

Observação:As fontes são congeladas na figura PDF, diferentemente das abordagens acima, mas podem ser alteradas mlf2pdf.mantes de gerá-las.

** erf(x)Script Matlab usando mlf2pdf (matlabfrag como backend) para gerar pdf **

clear all
clc
% Plotting section
    set(0,'DefaultFigureColor','w','DefaultTextFontName','Times','DefaultTextFontSize',12,'DefaultTextFontWeight','bold','DefaultAxesFontName','Times','DefaultAxesFontSize',12,'DefaultAxesFontWeight','bold','DefaultLineLineWidth',2,'DefaultLineMarkerSize',8);

% x and y data
x=linspace(-3,3,50);
y=erf(x);

figure(1);plot(x,y,'r');
grid on
axis([-3 3 -1 1]);
xlabel('$x$','Interpreter','none');
ylabel('$erf(x)$','Interpreter','none');
legend('Matlab');legend('boxoff');
title('Error function in Matlab $erf(x)=\frac{2}{\sqrt{\pi}}\int_{0}^{x}e^{-t^{2}}\, dt$','Interpreter','none');
mlf2pdf(gcf,'error-func-fig');

3. Figura de saída insira a descrição da imagem aqui

gnuplot 4.4, pgfplots 1.8e pdflatex -shell-escapemotor foram usados.

informação relacionada