# Drawing a graph from a rational function. What is the problem in my code?

4 views (last 30 days)

Show older comments

I want to draw the graph of function f(x)=x^2-1/x^2-4

This is my code:

clear

clf

f=@(x)((x.^2)-1)./((x.^2)-4);

xa=-10; xb=10; s=0.05; ya=-5; yb=5;

xv=linspace(xa,-s); xh=linspace(s,xb);

plot(xv,f(xv),'blue',xh,f(xh),'blue','linewidth',2)

axis equal, axis([xa xb ya yb]), grid on

xlabel('x'), ylabel('y'), title('function')

hold on

However when draw it, it comes out wrong. It has two blue lines where the x asymptotes should be.

##### 0 Comments

### Accepted Answer

Star Strider
on 10 Oct 2014

It’s necessary to not plot the singularities, then (if you want to), plot the asymptotes there instead. I had to add six lines to replace the singularities with ‘NaN’ values, move the hold line to just below the first plot call, and another two to plot the asymptotes:

f=@(x)((x.^2)-1)./((x.^2)-4);

xa=-10; xb=10; s=0.05; ya=-5; yb=5;

xv=linspace(xa,-s); xh=linspace(s,xb);

yv = f(xv); % Evaluate Function

yh = f(xh);

[mv,vi] = max(yv); % Find Maxima

[mh,hi] = max(yh);

yv(vi) = NaN; % Don’t Connect Singularities

yh(hi) = NaN;

plot(xv,yv,'blue',xh,yh,'blue','linewidth',2)

hold on

plot(xv(vi)*[1 1]', [ya yb]', '--r') % Plot X-Asymptote

plot(xh(hi)*[1 1]', [ya yb]', '--r') % Plot X-Asymptote

axis equal, axis([xa xb ya yb]), grid on

xlabel('x'), ylabel('y'), title('function')

This looks like it does what you want. If you don’t want the asymptotes, don’t include those two lines.

##### 9 Comments

Star Strider
on 13 Oct 2014

### More Answers (2)

SK
on 10 Oct 2014

Edited: SK
on 10 Oct 2014

Since it is a discrete sequence of points, Matlab just connects the last point before -2 with the first point after -2. It has no idea that you want the graph plotted on the entire real line. Same for the asymptote at +2.

The linspace() function takes 100 equally spaced points in the specified interval. So in your case, the function is evaluated at [-10.0000, -9.9005, -9.8010, -9.7015 ...]. The closest it gets to -2 is at -2.0400 and -1.9405.

If you want it to try to hit -2 exactly try the linspace() function with the third argument, N, which tells it how many points you want. See what happens.

SK
on 10 Oct 2014

Edited: SK
on 10 Oct 2014

Star Strider has a point too. However with the values you have, linspace does not actually pass very close to -2 or 2. (Try linspace(-10, -0.05)). At least on my system there are no out of bounds values involved. However if I use:

f(-10 : 0.1 : -0.05) and f(0.05 : 0.1 : 10)

then I just get two straight lines where the asymptotes are. The reason is that f(-c) and f(c) where c is very-very-very close to 2, is a huge number (but not infinity) so all the other values look very-very-very small -effectively 0 on the graph which explains why the graph looks like that.

Try printing the values f(-10 : 0.1 : -0.05) and you will see that none of them are really 0 or infinity.

### See Also

### Community Treasure Hunt

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

Start Hunting!