使用 tikzmath 进行离散傅里叶变换

使用 tikzmath 进行离散傅里叶变换

该图显示了十六个余弦波的总和,其强度随着波数的n增加而减小

\begin{tikzpicture}
    \tikzmath{
        function f(\x, \n) {
            %\y = \n+1;
            \y = 0;
            for \i in {0,...,\n} {
                \y = \y + (1+cos(deg(2 * pi * \x) * \i);
            };
            \y = \y / \n;
            return \y;
        };
    }
    \begin{axis}[use fpu=false]
        \addplot[domain=0:2, samples=200, smooth] {f(x,16)};
    \end{axis}
\end{tikzpicture}

在此处输入图片描述

时间(x在 tikzmath 算法中)显示在横坐标上,辐射强度显示在纵坐标上。由于波的数量有限,因此傅里叶变换变为 DFT。我应该使用什么算法来绘制 DFT(强度作为波数的函数)?

答案1

给出一个最小工作示例 (MWE) 而不是代码片段真的很重要。我不清楚你是否无法编译你的代码,或者你只是因为某种原因不喜欢输出(太参差不齐?)并想要一个更好的算法让它看起来像你的图片。使用缺乏良好数学精度的内置系统,将 16 个余弦函数相加,这些函数必须在多个值上进行评估,这让samples=200我觉得你的图片会参差不齐。最近的问题想要添加 101 个项作为示例。诸如此类的问题以及您的问题都需要能够处理计算的引擎(例如lua)。我使用了鼠尾草软件包允许计算机代数系统 (CAS) 进行计算。它还内置了大量数学知识,并为您提供了 Python 编程语言。

\documentclass{standalone}
\usepackage{sagetex,pgfplots}
\pgfplotsset{compat=1.18}
\begin{document}
\begin{sagesilent}
f=0
n=16
for i in range(0,n+1):
    f+= (1+cos(i*2*pi*x))
f = f/n
step = .01
x_coords = [x for x in srange(0,2+step,step)]
y_coords = [f(x=x).n(digits=4) for x in x_coords]
output = r"\begin{tikzpicture}"
output += r"\begin{axis}[xmin=0,xmax=2,ymin=0,ymax=3,"
#output += r"xlabel=$x$,ylabel=$y$,axis x line=middle,axis y line=middle,"
output += r"grid style=dashed]"
output += r"\addplot[thin, blue, smooth] coordinates {"
for i in range(0,len(x_coords)-1):
    output += r"(%f , %f) "%(x_coords[i],y_coords[i])
output += r"};"
output += r"\end{axis}"
output += r"\end{tikzpicture}"
\end{sagesilent}
\sagestr{output}
\end{document} 

在此处输入图片描述

该线x_coords = [x for x in srange(0,2+step,step)]强制我的 xvalues 从 0,.01,...,1.99,2.0 开始,并y_coords使用以下公式进行计算智者,一款免费的开源 CAS。使用 SAGE 计算我专门指定给它的大约 200 个点,并可以smooth选择去除部分锯齿状,结果就是您在图片中看到的结果。无需特殊算法来连接绘制的点。

由于 SAGE 不是 LaTeX 发行版的一部分,因此最简单的使用方法是通过免费的可钙帐户。

相关内容