我有以下代码来递归计算 arctan(1) 的近似值:
\documentclass[varwidth,border=5]{article}
\usepackage{tikz,pgfplots}
\usepackage{fp}
\usepackage{xfp}
\usetikzlibrary{fixedpointarithmetic}
\usetikzlibrary{math}
\newcommand{\seriefinal}[1]{
\tikzmath{
function Impressao(\r){print{$\fpeval{round(\r,6)}$};};
function serieF(\n) {
real \s; real \a; real \e;
\s = 0;
for \i in {1,...,\n}{
if isodd(\i+1) == 1 then {
\s = \s - 1/(2*\i-1); % Computa valor de séries
};
if isodd(\i+1) == 0 then {
\s = \s + 1/(2*\i-1); % Computa valor de séries
};
\e = abs(1/(2*\i-1));
};
return \s;
};
int #1;
Impressao(serieF(#1));
}
}
\begin{document}
The approximation for atan(1) is equal to:\seriefinal{10} with an error less than:
\end{document}
具有 10 个项的系列的值由 \seriefinal{10} 计算得出。此外,我想提供此近似值的误差,计算公式为 \e = abs(1/(2*\i-1))。第一个问题是:
- 我不知道如何为函数“serieF”返回两个值,即我想获得总和\s 和错误\e(该函数的两个输出)。
- 例如,我想绘制 i=1,2,...,100 的点序列 (\i,serieF(\i))。我该怎么做?谢谢!
答案1
我将这个问题解释为希望避免执行两次递归。也就是说,我不会触及您在函数中构建一些打印的事实(我认为您可能不想这样做)或使用xfp
,舍入也可以用 pgf 完成。
重点是您可以使用数组。因此,该函数现在返回value
和的元组error
。然后您可以通过宏访问错误。
\documentclass[varwidth,border=5]{article}
\usepackage{tikz}
\usepackage{amsmath}
\usepackage{xfp}
\usetikzlibrary{math}
\newcommand{\seriefinal}[1]{%
\tikzmath{
function Impressao(\r){print{$\fpeval{round(\r,6)}$};};
function serieF(\n) {
real \s; real \a; real \e;
\s = 0;
\e = 0;
for \i in {1,...,\n}{
if isodd(\i+1) == 1 then {
\s = \s - 1/(2*\i-1); %
};
if isodd(\i+1) == 0 then {
\s = \s + 1/(2*\i-1); %
};
\e = abs(1/(2*\i-1));
};
return {\s,\e};
};
int #1;
\s = {serieF(#1)}[0];
\e = {serieF(#1)}[1];
\errorval{#1}=\e;
return Impressao(\s);
}%
}
\begin{document}
The approximation for $\operatorname{atan}(1)$ is equal to \seriefinal{10}
with an error less than $\errorval{10}$.
\end{document}
答案2
如果您可以使用 LuaLaTeX 编译文档,则可以使用 Lua 的数学函数库,包括math.atan
和math.pi
。无需级数近似。
在下面的代码中,使用了\luaexec
而不是,而是允许将符号从 TeX 端传递到 Lua 端。 (不提供此功能。)\directlua
\luaexec
%
\%
\directlua
\documentclass{article}
\usepackage{luacode} % for "\luaexec" macro
\begin{document}
$\arctan(1)\approx \luaexec{tex.sprint(string.format("\%.10f",math.atan(1)))}$.
Also, $\pi/4\approx\luaexec{tex.sprint(string.format("\%.10f",math.pi/4))}$.
\end{document}