
例えば、有限級数の値を計算することは可能でしょうか?
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}
3 番目の引数は#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}