Función Erf en LaTeX

Función Erf en LaTeX

¿Hay alguna manera de calcular fácilmente?la función erf(o la función de distribución acumulativa de la ley normal) en LaTeX?

Actualmente, suelo pgfhacer cálculos, pero no encontré una manera de calcular erf usando pgf.

Estaría encantado de utilizar cualquier paquete que esté disponible para calcular erf o cualquier solución personalizada para calcular esa función.

Respuesta1

Para valores precisos, recomiendo externalizar el cálculo, aquí gnuplotse utiliza.

Código (necesita estar --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}

Producción

ingrese la descripción de la imagen aquí

Respuesta2

Residencia enesta respuesta.

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

ingrese la descripción de la imagen aquí

Respuesta3

Utilizando elmisma idea de aproximación que cjorssen(Probé la serie de Taylor como sugirió Qrrbrbirlbel, pero es bastante imposible obtener una aproximación decente de esta manera) Reescribí la función sin usar PGF de bajo nivel. Debido a que ya tenemos tantos gráficos 2D aquí, usaré mi gráfico 3D que ya tenía.

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

La aproximación tiene un error máximo de 1,5·10 -7 (fuente).

Gracias ajakeparadetectar y arreglarla sintaxis incorrecta que tuve por primera vez en este código.

Respuesta4

El cálculo de la función de error erf(x)y la anatomía de la figura (ejes, leyendas y etiquetas) se han representado en tres enfoques.

  1. Completamentegnuplot
  2. pgfplotsinvocagnuplot
  3. CompletamenteMatlab

Ya hay buenas respuestas, por ejemplo, de Qrrbrbirlbel y cjorssen, ambos explotan pgfmath a nivel macro.

1. Completamentegnuplot

Cálculo de la función de error erf(x)en gnuplot con ejes, leyendas y etiquetas representadas en epslatexla terminal de gnuplot. La salida del terminal gnuplot se integra automáticamente congnuplotexpaquete. terminal=pdfno muestra etiquetas matemáticas, por lo que epslatexse utilizó la terminal.

\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 salida de gnuplot ingrese la descripción de la imagen aquí

2. pgfplotsinvocagnuplot

Cálculo de la función de error erf(x)en gnuplot invocada por pgfplots y los ejes, leyendas y etiquetas se representan mediante 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 salida de pgfplots (backend de gnuplot)

ingrese la descripción de la imagen aquí

3) CompletamenteMatlab

Cálculo de la función de error $erf(x)$ en Matlab con ejes, leyendas y etiquetas renderizadas usandomatlabfrag(basado en etiquetas psfrag) ymlf2pdffunciones.

Nota:Las fuentes están congeladas en la figura PDF a diferencia de los métodos anteriores, pero se pueden cambiar mlf2pdf.mantes de generarlas.

** erf(x)Matlab Script usando mlf2pdf (matlabfrag como backend) para generar 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 salida ingrese la descripción de la imagen aquí

gnuplot 4.4, pgfplots 1.8y pdflatex -shell-escapemotor fueron utilizados.

información relacionada