Построение ряда Фурье в Matlab с для цикла - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь построить ряд Фурье, следующий за рядом Фурье:

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)

1 Ответ

2 голосов
/ 15 апреля 2019

Вы делаете ошибку в том, что вы зацикливаете, вы на самом деле не хотите зацикливаться с течением времени, но за 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:

enter image description here


В 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);
...