Сумма конечных рядов с использованием LaTeX 3

Сумма конечных рядов с использованием LaTeX 3

Можно ли вычислить значение конечного ряда, скажем,

сумма

используете LaTeX 3?

решение1

Да, можно, и довольно легко.

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\computesum}{mmm}
 {% pass control to an internal function
  \svend_compute_sum:nnn { #1 } { #2 } { #3 }
 }

% a variable for storing the partial sums
\fp_new:N \l_svend_partial_sum_fp

\cs_new_protected:Npn \svend_compute_sum:nnn #1 #2 #3
 {
  % clear the variable
  \fp_zero:N \l_svend_partial_sum_fp
  % for k from #1 to #2 ...
  \int_step_inline:nnnn { #1 } { 1 } { #2 }
   {
    % ... add the current value to the partial sum so far
    \fp_add:Nn \l_svend_partial_sum_fp { #3 }
   }
  % deliver the value
  \fp_use:N \l_svend_partial_sum_fp
 }
\ExplSyntaxOff

\begin{document}
$\computesum{0}{0}{#1^2}$\par
$\computesum{0}{1}{#1^2}$\par
$\computesum{0}{2}{#1^2}$\par
$\computesum{0}{3}{#1^2}$\par
$\computesum{0}{4}{#1^2}$\par
$\computesum{0}{5}{#1^2}$\par
$\computesum{0}{6}{#1^2}$\par
$\computesum{0}{7}{#1^2}$\par
$\computesum{0}{8}{#1^2}$\par
\end{document}

Обратите внимание, что третий аргумент #1обозначает индекс суммирования.

В этом примере #1^2передается как #3; \svend_compute_sum:nnnпоскольку аргумент используется внутри \int_step_inline:nnnn, где #1обозначает текущий индекс, происходит волшебство.;-)

Аргумент должен быть допустимым кодом для выражений с плавающей точкой. Так что нет надежды оценить факториалы, если вы не определите их сами.

введите описание изображения здесь

Если ваши слагаемые всегда целые числа, вы можете заменить все fpна int.

Если вы также загрузите siunitxи измените внутреннюю функцию на

\cs_new_protected:Npn \svend_compute_sum:nnn #1 #2 #3
 {
  \fp_zero:N \l_svend_partial_sum_fp
  \int_step_inline:nnnn { #1 } { 1 } { #2 }
   {
    \fp_add:Nn \l_svend_partial_sum_fp { #3 }
   }
  \num { \fp_use:N \l_svend_partial_sum_fp }
 }

затем

$\computesum{0}{300}{#1^2}$

напечатает как

введите описание изображения здесь

решение2

Вы можете загрузитьxintexprдля этого и дайте себе LaTeX3немного отдохнуть.

суммы

\documentclass[12pt]{article}
\usepackage[hscale=0.75]{geometry}
\usepackage{xintexpr}
\usepackage{siunitx}
\usepackage{shortvrb}

\begin{document}

$$\sum_{i=1}^{300} i^2=\num{\xinttheexpr add(i^2, i=1..300)\relax }$$

% For some reason, this doesn't go through:
% \num{\xintthefloatexpr [14] add(1/i^2,i=1..50)\relax}
% one needs to first expand the \num argument:
% \expandafter\num\expandafter
%     {\romannumeral-`0\xintthefloatexpr [14] add(1/i^2,i=1..50)\relax}
%

The float version does each addition with 16 digits floats, hence the last
digit may be a bit off.

$$\sum_{i=1}^{50} \frac1{i^2}=
  \xintFrac{\xinttheexpr reduce(add(1/i^2,i=1..50))\relax}
  \approx  \xintthefloatexpr add(1/i^2,i=1..50)\relax$$

If one has anyhow computed an exact value, it is better to deduce the
float from it rather than evaluating the sum as a sum of floats.

\noindent\verb|\oodef\MySum {\xinttheexpr reduce(-add((-1)^i/i^2,i=1..50))\relax }|

\oodef\MySum {\xinttheexpr reduce(-add((-1)^i/i^2,i=1..50))\relax }

$$\sum_{i=1}^{50} \frac{(-1)^{i-1}}{i^2}=
\xintFrac{\MySum}$$
\verb|$$\xintDigits:=48; \approx\xintthefloatexpr \MySum\relax$$|
$$\xintDigits:=48; \approx\xintthefloatexpr \MySum\relax$$

\end{document}

Связанный контент