¿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 pgf
hacer 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í gnuplot
se utiliza.
Código (necesita estar --shell-escape
habilitado)
\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
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}
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}
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.
- Completamente
gnuplot
pgfplots
invocagnuplot
- Completamente
Matlab
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 epslatex
la terminal de gnuplot. La salida del terminal gnuplot se integra automáticamente congnuplotexpaquete. terminal=pdf
no muestra etiquetas matemáticas, por lo que epslatex
se 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
2. pgfplots
invocagnuplot
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)
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.m
antes 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
gnuplot 4.4
, pgfplots 1.8
y pdflatex -shell-escape
motor fueron utilizados.