Sommations de calcul en Latex
N'importe qui peut m'aider s'il vous plaît? Je dois calculer la somme 1 + 1/2 + 1/3 + ... 1 / n (n donné) en utilisant uniquement des commandes Latex. Je ne sais pas comment puis-je faire ça. Merci beaucoup.
Réponses
Pour une meilleure précision, je suggère d'effectuer ce calcul en utilisant l3fpplutôt que pgfmath. Je propose deux fonctions, \mySetToSumet \mySetToSumAlt. Les deux acceptent les mêmes arguments et calculent la somme en utilisant l3fp. La différence réside dans la façon dont ils écrivent le résultat arrondi à leur premier argument:
\mySetToSumarrondit la somme calculée en fonction du nombre de décimales donné dans son troisième argument, puis supprime les zéros de fin, le cas échéant;\mySetToSumAltfait la même chose mais continue de mettre des zéros à la fin.
\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}
Voici une solution basée sur 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}
Il n'y a pratiquement aucun moyen d'obtenir des calculs rapides avec uniquement des méthodes TeX, en raison de capacités arithmétiques très limitées.
La solution suivante stocke les valeurs des sommes harmoniques jusqu'à 5000, elles sont donc disponibles en temps linéaire. Au-delà de 5000, le temps de calcul devient trop long.
\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 vous avez besoin de plus de termes, utiliser LuaTeX semble la seule alternative rapide. Peut-être que cela peut également être fait avec PythonTeX de manière suffisamment rapide.