Why I'm I getting results in terms of t for an and bn even though it is an integration with specific limits?
Show older comments
%Excercise 4
syms t
syms N
%prompt = "Please enter a function rules for variable segments of the function f: ";
%'Enter 2D array with [] around it and commas between the columns and semicolon at end of each row '
f = input('Please enter function rules for variable segments of the function f:')
flim= input('Please enter real numbers to define the limits of the segments of f:')
N= input('Please enter an intiger to specifie the max order of Fourier coefficients of f:')
%flimFirst= flim(1);
%filmEnd= flim(end);
%a0= 2/(flim(end)-flim(1))*int(f(1),flim(1),flim(2));
%a0= sprintf('%.4f', a0)
%a02= 2/(flim(end)-flim(1))*int(f(2),flim(2),flim(3));
%a02= sprintf('%.4f', a02)
T = flim(end)-flim(1);
w0 = 2*pi/T;
a0= (2/T)*int(f(length(f)),t,flim(length(flim)-1),flim(length(flim)));
sprintf('%.4f', a0)
a02= (2/T)*int(f(1),t,flim(1),flim(2));
sprintf('%.4f', a02)
a03= (2/T)*int(f(2),t,flim(2),flim(3));
sprintf('%.4f', a02)
for i = 1:N
for k= 2:length(flim)
an= (2/T)*int((f(k-1))*cos(N*w0*t)),t,flim(k-1),flim(k);
an(i)=an;
bn= (2/T)*int((f(k-1))*sin(N*w0*t)),t,flim(k-1),flim(k);
bn(i)=bn;
fs= (a0/2)+(an*cos(w0*N*t))+(bn*sin(w0*N*t));
end
end
an
%sprintf('%.4f', an);
bn
%sprintf('%.4f', bn);
fs
%sprintf('%.4f', fs);
3 Comments
Torsten
on 13 Dec 2022
Please provide example input for your code.
Original question by Stefanos retrieved from Google Cache:
"Why I'm I getting results in terms of t for an and bn even though it is an integration with specific limits?"
%Excercise 4
Theme
syms t
syms N
%prompt = "Please enter a function rules for variable segments of the function f: ";
%'Enter 2D array with [] around it and commas between the columns and semicolon at end of each row '
f = input('Please enter function rules for variable segments of the function f:')
flim= input('Please enter real numbers to define the limits of the segments of f:')
N= input('Please enter an intiger to specifie the max order of Fourier coefficients of f:')
%flimFirst= flim(1);
%filmEnd= flim(end);
%a0= 2/(flim(end)-flim(1))*int(f(1),flim(1),flim(2));
%a0= sprintf('%.4f', a0)
%a02= 2/(flim(end)-flim(1))*int(f(2),flim(2),flim(3));
%a02= sprintf('%.4f', a02)
T = flim(end)-flim(1);
w0 = 2*pi/T;
a0= (2/T)*int(f(length(f)),t,flim(length(flim)-1),flim(length(flim)));
sprintf('%.4f', a0)
a02= (2/T)*int(f(1),t,flim(1),flim(2));
sprintf('%.4f', a02)
a03= (2/T)*int(f(2),t,flim(2),flim(3));
sprintf('%.4f', a02)
for i = 1:N
for k= 2:length(flim)
an= (2/T)*int((f(k-1))*cos(N*w0*t)),t,flim(k-1),flim(k);
an(i)=an;
bn= (2/T)*int((f(k-1))*sin(N*w0*t)),t,flim(k-1),flim(k);
bn(i)=bn;
fs= (a0/2)+(an*cos(w0*N*t))+(bn*sin(w0*N*t));
end
end
an
%sprintf('%.4f', an);
bn
%sprintf('%.4f', bn);
fs
%sprintf('%.4f', fs);
Rena Berman
on 27 Dec 2022
(Answers Dev) Restored edit
Answers (1)
syms t
f = [pi+t,pi-t];
flim= [-pi,0,pi];
N = 5;
T = flim(end)-flim(1);
w0 = 2*pi/T;
fs = 0.0;
for i = 0:N
for k= 2:length(flim)
an= (2/T)*int(f(k-1)*cos(i*w0*t),t,flim(k-1),flim(k));
bn= (2/T)*int(f(k-1)*sin(i*w0*t),t,flim(k-1),flim(k));
fs= fs + an*cos(w0*i*t)+bn*sin(w0*i*t);
end
if i==0
fs = fs/2;
end
end
fs = matlabFunction(fs);
t = -pi:0.01:pi;
plot(t,fs(t))
15 Comments
Torsten
on 13 Dec 2022
Then start anew from your code and add the necessary changes.
Torsten
on 13 Dec 2022
if i==0
fs = fs/2;
end
a0 is calculated first (for i=0). The Fourier series starts with a0/2 ...
Stefanos
on 13 Dec 2022
Torsten
on 13 Dec 2022
It should be obvious that the array you save the results in cannot have the same name as the temporary variable which contains the value of the integral.
And array indices start with 1 ; so you will have to shift i to i+1 when saving an and bn.
Stefanos
on 13 Dec 2022
Torsten
on 13 Dec 2022
What is your actual code for the loop where you want to save the Fourier coefficients after the changes you made ?
Stefanos
on 13 Dec 2022
How can I print all the values of the coefficients an and bn of the fourier series with the value of N varying from 1-5 and represent the results in an array?
You mean varying from 0-5 ?
By summing the an and bn for each i in the inner the k-loop in ann(i+1) and bnn(i+1), dividing ann(1) by 2 in the subsequent if-statement and displaying the arrays ann and bnn after the loop using the disp command.
Torsten
on 13 Dec 2022
6 for ann (a0/2,a1,...,a5), 5 for bnn (b1,...,b5).
You might also save 0 in the first position of bnn to generate arrays of equal length.
Torsten
on 13 Dec 2022
ok. You know best what your homework should look like.
Stefanos
on 13 Dec 2022
Edited: Walter Roberson
on 14 Dec 2022
Walter Roberson
on 14 Dec 2022
When you have a for loop with : operator, then after the loop, the loop control variable is assigned one of the following:
- [] (empty double) if no increment is specified and the terminal value (right side of : operator) is less than the left side of the colon operator
- [] (empty double) if positive increment is specified and the terminal value (far right side of : operator) is less than the left side of the colon operator
- [] (empty double) if negative increment is specified and the terminal value (far right side of : operator) is greater than the left side of the colon operator
- last value assigned by the colon operator if none of the operations inside the loop assign to the loop control variable or if the loo control variable is not assigned to in the last iteration of the loop
- last value assigned to the loop control variable if the loop control variable is assigned to in the last iteration of the loop
Or to state more compactly: [] if the loop body was never entered, and otherwise the last value assigned to the loop control variable.
So, with your for i=1:N provided that N >= 1, the value would be the last value assigned to the loop control variable. In that loop, it would be floor(N) .
You then test i==0 after the loop. Is that ever a possibility? Assuming that the disp() calls do not somehow assign anything to i then after the first loop, i is going to be empty (which is not 0) if the loop was never executed at all, and i is going to be a minimum of 1 if N>=1. So i will never be 0 after that first loop.
Exception: if you overwrote disp as a function that does an assignin('caller', 'i', 0) then Yes, in theory i could be 0 after the loop. That would be rather poor programming practice though.
Torsten
on 14 Dec 2022
Summarizing Walters's response:
You should improve your MATLAB skills and invest two hours of your time to visit MATLAB's online course for free:
Walter Roberson
on 14 Dec 2022
Why should we remove our comments here, as you requested in your flag ?
Categories
Find more on Operators and Elementary Operations in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!