Sumas de cálculo en látex

Oct 19 2020

¿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

4 frougon Oct 19 2020 at 21:11

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:

  • \mySetToSum redondea 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;

  • \mySetToSumAlt hace 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}

4 Mico Oct 19 2020 at 22:21

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}
3 egreg Oct 19 2020 at 23:55

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.