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 pgf
para 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-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}
Saída
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}
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}
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.
- Completamente
gnuplot
pgfplots
invocagnuplot
- Completamente
Matlab
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 epslatex
terminal gnuplot. A saída do terminal gnuplot é incorporada automaticamente comgnuplottexpacote. terminal=pdf
não renderiza rótulos matemáticos, portanto, epslatex
o 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
2. pgfplots
invocagnuplot
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)
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.m
antes 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
gnuplot 4.4
, pgfplots 1.8
e pdflatex -shell-escape
motor foram usados.