Effacer les filtres
Effacer les filtres

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

6 vues (au cours des 30 derniers jours)
Britney
Britney le 10 Oct 2014
Commenté : Britney le 14 Oct 2014
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.

Réponse acceptée

Star Strider
Star Strider le 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 commentaires
Star Strider
Star Strider le 13 Oct 2014
They replaced phlogiston with something called ‘radium’. Never could get comfortable with all that stuff glowing by itself.

Connectez-vous pour commenter.

Plus de réponses (2)

SK
SK le 10 Oct 2014
Modifié(e) : SK le 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.
  1 commentaire
Britney
Britney le 11 Oct 2014
Thank you for that explanation it was very insightful. I didn't know that that was how Matlab "thinks".

Connectez-vous pour commenter.


SK
SK le 10 Oct 2014
Modifié(e) : SK le 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.
  1 commentaire
Britney
Britney le 11 Oct 2014
I like your passion for this question.
Ok! That explains things.

Connectez-vous pour commenter.

Catégories

En savoir plus sur Chemistry dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by