Sumas de cálculo en látex
¿Alguien me puede ayudar por favor? Necesito calcular la suma 1 + 1/2 + 1/3 + ... 1 / n (n dado) usando solo comandos de Latex. No tengo idea de cómo puedo hacer esto. Muchas gracias.
Respuestas
Para mayor precisión, sugiero realizar este cálculo utilizando en l3fplugar de pgfmath. Propongo dos funciones, \mySetToSumy \mySetToSumAlt. Ambos aceptan los mismos argumentos y calculan la suma usando l3fp. La diferencia está en cómo escriben el resultado redondeado en su primer argumento:
\mySetToSumredondea la suma calculada de acuerdo con el número de lugares decimales dados en su tercer argumento, luego descarta los ceros finales, si los hay;\mySetToSumAlthace lo mismo pero sigue ceros.
\documentclass{article}
\usepackage{amsmath} % only for the sample text with \dotsb
\usepackage{xparse} % not necessary with recent LaTeX (Oct. 2020)
\usepackage{xfp} % only for \fpeval (demo code)
\usepackage{pgfmath} % for printing the result with a fixed number
% of decimal places (used in \mySetToSumAlt)
\ExplSyntaxOn
\cs_new_protected:Npn \angelo_set_to_sum:Nn #1#2
{
\fp_zero_new:N #1
\int_step_inline:nn {#2} { \fp_add:Nn #1 { 1/##1 } }
}
\fp_new:N \l__angelo_result_fp
% Document-level interface
% #1: control sequence that will receive the result
% #2: value of n
% #3: round the result to this number of decimal places
\NewDocumentCommand \mySetToSum { m m m }
{
% Compute the sum with l3fp; put the result in \l__angelo_result_fp.
\angelo_set_to_sum:Nn \l__angelo_result_fp {#2}
% Set #1 to the result after rounding.
\tl_set:Nx #1 { \fp_eval:n { round(\l__angelo_result_fp, #3) } }
}
% Same macro, but uses \pgfmathprintnumberto in order to always write the
% specified number of decimal places, even if this means printing trailing
% zeros.
\NewDocumentCommand \mySetToSumAlt { m m m }
{
\angelo_set_to_sum:Nn \l__angelo_result_fp {#2}
% Set #1 to the result after rounding.
\pgfmathprintnumberto[fixed~zerofill, precision={#3}]
{ \fp_eval:n { \l__angelo_result_fp } } {#1}
}
\ExplSyntaxOff
\begin{document}
% Use n = 60 and round to 6 decimal places.
\mySetToSum{\result}{60}{6}%
% Ditto, but keep trailing zeros, if any.
\mySetToSumAlt{\resultWithTrailingZeros}{60}{6}%
\[ 1 + \frac{1}{2} + \frac{1}{3} + \dotsb + \frac{1}{60}
\approx \resultWithTrailingZeros \approx \result \]
Approximation of the Euler–Mascheroni constant:
\[ 1 + \frac{1}{2} + \frac{1}{3} + \dotsb + \frac{1}{60} - \ln(60) \approx
\fpeval{round(\result - ln(60), 6)} \]
%
% Now use n = 100
\mySetToSum{\result}{100}{6}%
\[ 1 + \frac{1}{2} + \frac{1}{3} + \dotsb + \frac{1}{100} - \ln(100) \approx
\fpeval{round(\result - ln(100), 6)} \]
%
% Now use n = 200
\mySetToSum{\result}{200}{6}%
\[ 1 + \frac{1}{2} + \frac{1}{3} + \dotsb + \frac{1}{200} - \ln(200) \approx
\fpeval{round(\result - ln(200), 6)} \]
%
% Now use n = 1000
\mySetToSum{\result}{1000}{6}%
\[ 1 + \frac{1}{2} + \frac{1}{3} + \dotsb + \frac{1}{1000} - \ln(1000) \approx
\fpeval{round(\result - ln(1000), 6)} \]
According to Wikipedia, the value of this constant is close to $0.57722$.
\end{document}
Aquí hay una solución basada en LuaLaTeX.
% !TEX TS-program = lualatex
\documentclass{article}
\directlua{%
function harmonic ( n )
local h=0
for i=1,n do h=h+1/i end
return h
end
}
%% LaTeX macro to access the Lua function:
\newcommand\harmonic[1]{\directlua{tex.sprint(harmonic(#1))}}
\newcommand\difference[1]{\directlua{tex.sprint(harmonic(#1)-math.log(#1))}}
\begin{document}
The value of the tenth harmonic number is \harmonic{10}.
\medskip
\begin{tabular}{@{} rll @{}}
\hline
$n$ & harmonic($n$) & harmonic($n$)${}-\ln(n)$\\
\hline
1 & \harmonic{1} & \difference{1} \\
10 & \harmonic{10} & \difference{10} \\
100 & \harmonic{100} & \difference{100} \\
1000 & \harmonic{1e3} & \difference{1e3} \\
10000 & \harmonic{1e4} & \difference{1e4} \\
100000 & \harmonic{1e5} & \difference{1e5} \\
1000000 & \harmonic{1e6} & \difference{1e6} \\
10000000 & \harmonic{1e7} & \difference{1e7} \\
100000000 & \harmonic{1e8} & \difference{1e8} \\
\hline
\end{tabular}
\medskip
Euler-Mascheroni constant${}\approx 0.5772156649$.
\end{document}
Básicamente, no hay forma de obtener cálculos rápidos con solo métodos TeX, debido a las capacidades aritméticas muy limitadas.
La siguiente solución almacena los valores de las sumas armónicas hasta 5000, por lo que están disponibles en tiempo lineal. Más allá de 5000, el tiempo de cálculo se vuelve demasiado largo.
\documentclass{article}
\usepackage{booktabs}
%\usepackage{xparse} % not necessary with LaTeX 2020-10-01 or later
\usepackage{xfp} % for \fpeval
\ExplSyntaxOn
% store the values of H_n in an array (up to 5000)
\fparray_new:Nn \g_aliano_harmonic_fparray { 5000 }
% initialize
\fparray_gset:Nnn \g_aliano_harmonic_fparray { 1 } { 1 }
% at each step add the reciprocal of the next number
\int_step_inline:nn { 5000-1 }
{
\fparray_gset:Nnn \g_aliano_harmonic_fparray { #1+1 }
{
\fparray_item:Nn \g_aliano_harmonic_fparray { #1 } + 1/(#1+1)
}
}
% this retrieves the value, rounding it to 5 decimal digits
\NewExpandableDocumentCommand{\harmonic}{m}
{
\fp_eval:n { round(\fparray_item:Nn \g_aliano_harmonic_fparray { #1 },5) }
}
\ExplSyntaxOff
\begin{document}
\begin{tabular}{@{}rll@{}}
\toprule
\multicolumn{1}{@{}c}{$n$} &
\multicolumn{1}{c}{$H_n$} &
\multicolumn{1}{c@{}}{$H_n-\log n$} \\
\midrule
1 & \harmonic{1} & \fpeval{round(\harmonic{1}-ln(1),5)} \\
10 & \harmonic{10} & \fpeval{round(\harmonic{10}-ln(10),5)} \\
100 & \harmonic{100} & \fpeval{round(\harmonic{100}-ln(100),5)}\\
1000 & \harmonic{1000} & \fpeval{round(\harmonic{1000}-ln(1000),5)}\\
5000 & \harmonic{5000} & \fpeval{round(\harmonic{5000}-ln(5000),5)}\\
\bottomrule
\end{tabular}
\end{document}
Si necesita más términos, usar LuaTeX parece la única alternativa rápida. Quizás esto también se pueda hacer con PythonTeX de una manera suficientemente rápida.