How to plot a piecewise periodic function? Please Help
43 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
john
am 20 Nov. 2014
Kommentiert: Walter Roberson
am 10 Jun. 2021
f(x)=2*sqrt(x) for 0<=x<=1 and f(x)=3-(x) for 1<=x<=3
How would I plot this function on the range -9<=x<=9? The questions states to make use of the "floor function".
Please Help
2 Kommentare
Akzeptierte Antwort
Star Strider
am 20 Nov. 2014
Bearbeitet: Star Strider
am 20 Nov. 2014
I don’t understand where the floor function comes into it. This is how I would code it:
f = @(x) [2*sqrt(x).*(0<=x & x<1) + (3-x).*(1<=x & x<=3)];
x = linspace(-9,9);
figure(1)
plot(x, f(x))
grid
Note that your function does not exist for x<0 and x>3, so while the plot defaults to zero outside that region, I would only plot it for [0,3].
EDIT —
‘Periodic function’ ... this works:
f = @(x) [2*sqrt(x).*(0<=x & x<1) + (3-x).*(1<=x & x<=3)];
x = linspace(0,3);
intvl = [-6 6];
pfx = repmat(f(x),1,diff(intvl)/3);
px = linspace(intvl(1),intvl(2),length(pfx));
figure(1)
plot(px, pfx)
grid
I had to revise my code every time you updated your Question. This (EDIT) code reproduces the plot you posted. I did the function in a one-line anonymous function for simplicity and efficiency. It shouldn’t be difficult for you to follow its logic and write a function .m-file to do the same calculation.
6 Kommentare
Diptanshu De
am 10 Jun. 2021
Bearbeitet: Diptanshu De
am 10 Jun. 2021
How to change my code if my function is
f(x) = -x ; -5<=x<0
x^2+1; 0<=x<5
Walter Roberson
am 10 Jun. 2021
x = linspace(-6,6);
f = zeros(size(x));
mask = -5 <= x & x < 0;
f(mask) = -x(mask);
mask = 0 <= x & x < 5;
f(mask) = x(mask).^2 + 1;
plot(x, f)
Weitere Antworten (1)
Sally Al Khamees
am 21 Feb. 2017
If you have R2016b and the Symbolic Math Toolbox installed, you can use the piecewise function to recreate this example:
syms y(x) a(x) b(x);
y(x) = piecewise(0<=x <1, 2*sqrt(x), 1 <= x <= 3, 3-x);
interval = [-6 6];
pw=y;
for i=1:diff(interval/6)
a(x)= piecewise(i*3<=x<1+(i*3),2*sqrt(x-3*i),1+(i*3)<=x<=3+(i*3),3-(x-3*i));
b(x)= piecewise(i*-3<=x<1+(i*-3),2*sqrt(x+3*i),1+(i*-3)<=x<=3+(i*-3),3-(x+3*i));
pw = [pw a b];
end
pw
fplot(pw,interval)
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/172736/image.png)
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/172738/image.jpeg)
You can read more about the piecewise function in Symbolic Math Toolbox here https://www.mathworks.com/help/symbolic/piecewise.html
1 Kommentar
Puech gabriel
am 2 Aug. 2017
Hi,
Thanks for giving this code. Here are some parameters added to your code and using just one function
syms a(x);
T = pi; % period value
i = -2; % number of periods, must be integer!
interval = [i*T -i*T];
pw = [];
while i<=diff(interval/(2*T))
a(x)= piecewise(i*T<=x<1+(i*T),2*sqrt(x-T*i),1+(i*T)<=x<=3+(i*T),3-(x-T*i),3+(i*T)<=x<=T+(i*T),0); %+diff(interval/6)-floor(diff(interval/6))
i = i +1;
pw = [pw a ]; % concatenation des periodes
end
pw
fplot(pw,interval)
Would it have a way of preallocating the pw symfun matrix before the loop?
Kind regards, Gabriel
Siehe auch
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!