Help with piecewise function? Can't use else/if?

Hi, I am having trouble on a piece-wise homework problem I am having.
This is my code. I plot it and in the middle of the graph from negative pi to positive pi where y should be the cosine of x isn't right. I just have a straight line at y=-1 across the graph. I know I need to make it a vector or a loop it so it doesn't use if/else and skip the middle cosine function.
Whenever I try to get a function command I get this: Function definitions are not permitted in this context.
code so far:
clear all
close all
clc
x=-2*pi:.01:2*pi
if (x<-pi)
y=-1;
elseif(x>=-pi&x<=pi)
y=cos(x);
else(x>pi)
y=-1;
plot(x,y)
end
This is what I'm getting: The middle part (cosine function) is wrong. I was told it's just graphing the part after else.
Help please?
Thank you.

2 comentarios

Matt Tearle
Matt Tearle el 18 de Feb. de 2014
  1. Homework problem clearly stated as being a homework problem
  2. Own effort and work shown
  3. Problem explained and results shown
Congratulations on writing a great (homework) question!
M. Y. Najjar
M. Y. Najjar el 28 de Dic. de 2016
Don't you need a double '&' sign in the If statement?

Iniciar sesión para comentar.

 Respuesta aceptada

Karan Gill
Karan Gill el 1 de Dic. de 2016
Editada: Karan Gill el 17 de Oct. de 2017

0 votos

If you have R2016b, you can just use the piecewise function: https://www.mathworks.com/help/symbolic/piecewise.html.

2 comentarios

Sarah Palfreyman
Sarah Palfreyman el 14 de Dic. de 2016
Editada: Sarah Palfreyman el 14 de Dic. de 2016
Here is the example.
john Snori
john Snori el 1 de Sept. de 2021
The second method involves the use of if-else statements along with for loop. In this method, we’ll define all the sub-functions along with the constraints using if-else statements and then we will plot the piecewise function.
Source : https://www.entechin.com/how-to-plot-a-piecewise-function-in-matlab/

Iniciar sesión para comentar.

Más respuestas (3)

AJ
AJ el 18 de Feb. de 2014

3 votos

If there any possible way anyone can give me the exact code?
I looked at your answer Image Analyst and I appreciate it but I still can't figure out and I think I will understand it after seeing how it's supposed to be done. I've been trying for 5 hours now and I have other work to do :(

2 comentarios

Take a look at this:
% Step 1: initialise x and y
x = -10:2:10
y = zeros(size(x))
% Step 2: selective processing
tf = x < -5
y(tf) = -5
tf = x > -5 & x < 5
y(tf) = -2 + 2 * x(tf)
tf = x > 5
y(tf) = 5
% step 3: visualisation
plot(x,y,'bo-')
burak ergocmen
burak ergocmen el 1 de Dic. de 2016
it really works . thanks for the codes.

Iniciar sesión para comentar.

Image Analyst
Image Analyst el 18 de Feb. de 2014
Editada: Image Analyst el 18 de Feb. de 2014
Use two &:
elseif x(k) >=-pi && x(k) <= pi
and you need to make an array out of y=-1:
y(k) = -1;
otherwise it's just a single number, not an array of -1s. Plus you need to have it in a loop over k like I mentioned
for k = 1 : length(x)
then everything inside the look has a (k) index. Of course there is a vectorized way to do it, if you want that.

6 comentarios

Matt Tearle
Matt Tearle el 18 de Feb. de 2014
I just want to add that you should definitely pay attention to the orange squiggly underlines in the Editor. If you read the messages you get when you hover over them, you'll see that MATLAB is hinting at what Image Analyst is saying: you're comparing the vector x with a scalar pi -- that's perfectly valid but is probably not what you're trying to do in an if statement.
Image Analyst also mentioned a vectorized solution. In this case, you could start with y being a vector (the same size as x) of -1s, then change some of them to cos(x). The ones to change are those where x is between -pi and pi. MATLAB has a beautiful syntax for this kind of thing.
Five hours!? I told you exactly how to do it. Just use && and wrap in a for loop. You'll get this:
x = -2*pi : 0.01 : 2 * pi;
for k = 1 : length(x)
if x(k) < -pi
y(k) = -1;
elseif x(k) >= -pi && x(k) < pi
y(k) = cos(x(k));
else
y(k) = -1;
end
end
plot(x, y, 'r*-');
grid on;
Image Analyst
Image Analyst el 18 de Feb. de 2014
So did I get an A on my homework?
Taehun Kim
Taehun Kim el 24 de Jul. de 2017
yeah i got answer thx
ska109
ska109 el 26 de Mzo. de 2019
Editada: ska109 el 26 de Mzo. de 2019
I would use this construction without the "for" loop:
x = -2*pi : pi/5 : 2 * pi;
y = NaN * ones(size(x));
y(x < -pi) = -1;
y((x >= -pi) & (x < pi)) = cos(x((x >= -pi) & (x < pi)));
y(x >= pi) = -1;
plot(x, y, 'r*-'); grid on;
FYI you can use NaN to create an array without needing to first create a ones array.
y = NaN(size(x));

Iniciar sesión para comentar.

Carlos Guerrero García
Carlos Guerrero García el 13 de Nov. de 2022

1 voto

And what about this code ???
x=-5:0.1:5; g=-1+(abs(x)<=pi).*(1+cos(x)); plot(x,g)
Do you like it ???

4 comentarios

DGM
DGM el 14 de Nov. de 2022
Editada: DGM el 14 de Nov. de 2022
Bonus points for succinctness
Though you might consider adjusting your limits to [-1 1]*2*pi (what the original problem used) instead of [-5 5]. That said, it's an old question; I suppose you're free to choose how much you want to bend the original requirements. After all, it's a very minor detail, and I doubt OP will mind the difference.
That, and putting your code into a code formatting block helps with readability. Once you do that, you can also hit the run button and your answer will include the generated plot as well. That makes it easy for future readers to see that your code does what you say it does.
Thanks for the edition and the suggestions!!!!
I guess you are choosing not to take the suggestions, but I'll do them here:
x = -2 * pi : 0.01 : 2 * pi;
g = -1 + (abs(x) <= pi) .* (1 + cos(x));
plot(x, g, 'b-', 'LineWidth', 2)
grid on;
xlabel('x');
ylabel('g');
Thanks to Image Analyst....I have no time enough to make the corrections suggested but thanks to your improvemets to my basic script!!!!

Iniciar sesión para comentar.

Categorías

Preguntada:

AJ
el 18 de Feb. de 2014

Comentada:

el 14 de Nov. de 2022

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by