首页 > 解决方案 > 用for循环在matlab中绘制傅里叶级数

问题描述

我正在尝试绘制傅立叶级数之后的傅立叶级数;

f(t)=$$\sum_{k=0}^k \frac{(1)(\sin(2k+1)pi*t)}{2k+1}$$

方程

对于 t = -1:0.0001:1

我尝试使用for循环并将新系列的值增加F +最后一个系列,并且每次迭代也将k增加1,但我得到的图是正方形而不是正弦波

k=0
series  = 0
for i = 0:0.0001:1;
    F = 4/pi*((1/(2*(k) + 1)).*sin((2*(k)+1).*pi.*t));
    series = series + F;
    k = k+1;
end 
plot(t,series)

标签: matlabfft

解决方案


您在循环时犯了一个错误,您实际上不想随着时间循环,而是在k. 现在你正在循环i(代表时间,来自上下文),但你甚至没有使用i.

所以正确的方法是循环k,并设置最大数量的傅立叶系数,如下所示:

series  = 0;
t = -1:0.0001:1;
k_max = 10;

for k = 0:k_max
    F = 4/pi*((1/(2*(k) + 1)).*sin((2*(k)+1).*pi.*t));
    series = series + F;
end

plot(t,series)

您可以通过更改来比较包含更多系数时发生的情况k_max

在此处输入图像描述


然而,在 Matlab 中,避免使用for循环通常更快,这可以通过矢量化来完成。如果指定t为行向量,向量指定为k列向量,则可以计算F每个k,然后将其沿第一个维度求和以获得系列:

t = -1:0.0001:1;
k = (0:10).';

F = 4/pi.*((1./(2.*(k) + 1)).*sin((2*(k)+1).*pi.*t));
series = sum(F, 1);

推荐阅读