Why is my plot printing dots instead of a curve???

3 views (last 30 days)
My code is supposed to print a nice curve instead it is printing dots. I have not specified any dots in my loglog line command and I have not set any default to be dots.
sprintf(' x numerical actual error')
for i =1:numsteps
x = a:h:b;
f = -h^2 * rfun(x);
f(1) = 2*h*lambda;
f(end) = 2*h*rho;
p = -1 -0.5*h.* pfun(x(2:end));
P = -1 + 0.5*h.*pfun(x(1:end-1));
q = 2 + h^2* qfun(x);
A = gallery('tridiag',p,q,P);
A(1,1) =-3;A(1,2)=4; A(1,3) =-1;
A(end,end)= 1; A(end,end-1) = -4; A(end,end-2) = 3;
y = A\f';
hold all
actual = exp(x') - (1/3)*x'.^2.*exp(x');
error =abs(y - actual);
% loglog(h,error);
set(gca, 'XScale', 'log', 'YScale', 'log');
while i ==1
n = 1/h;
disp(sprintf('h = %.4f',h'))
for j =3:2:n
fprintf('%3.6f %3.6f %3.6f %3.6f\n',x(j),y(j),actual(j),error(j))
end
loglog(h,error,'k-');
set(gca, 'XScale', 'log', 'YScale', 'log');
break
end
while i ==2
n =1/h;
disp(sprintf('h = %.4f',h))
for j = 5:4:n-2
fprintf('%3.6f %3.6f %3.6f %3.6f\n',x(j),y(j),actual(j),error(j))
end
loglog(h,error,'m-')
break
end
while i ==3
n =1/h;
disp(sprintf('h = %.4f',h))
for j = 9:8:n-2
fprintf('%3.6f %3.6f %3.6f %3.6f\n',x(j),y(j),actual(j),error(j))
end
loglog(h,error,'g-')
break
end
while i ==4
n =1/h;
disp(sprintf('h = %.4f',h))
for j = 17:16:n-2
fprintf('%3.6f %3.6f %3.6f %3.6f\n',x(j),y(j),actual(j),error(j))
end
loglog(h,error,'b-')
break
end
h=h/2;
end

Answers (3)

Walter Roberson
Walter Roberson on 20 Apr 2014
Your "h" must be a scalar or else you would have received error messages or warning messages that you did not mention.
You have calls of the form loglog(h,error,'b-') where the color changes, and there is evidence that error is a vector. With h being a scalar, all of those error values are going to be drawn at the same x position. That is going to produce anywhere from a dot to a vertical line -- with the vertical line probably retracing itself several times (the error values are not sorted.) If any of the error values are negative or 0, they will not appear on a loglog() plot.
Are you sure the above is what you desire??

Star Strider
Star Strider on 20 Apr 2014
I did not run your code, but I believe your problem is due to your plotting your ‘error’ variable in your loop.
You only calculate error once:
error =abs(y - actual);
and you don’t assign it as an array.
I suggest you change it to:
error(i) =abs(y - actual);
and then plot it once at the end of your ‘i’ loop. (That means taking the loglog statements out of your loop.)

Image Analyst
Image Analyst on 20 Apr 2014
DO NOT USE error AS THE NAME OF A VARIABLE! It is a built in function and you just wiped it out by redefining it as one of your variables. Call it "theError" or "residuals" or something else, but never "error".
Also, we can't run your code because you didn't give all the information, like values for numsteps, a, h, b, rfun, etc.
  1 Comment
Star Strider
Star Strider on 20 Apr 2014
Good point! I was also going to caution against ‘i’ and ‘j’ as loop indices, but decided to wait.

Sign in to comment.

Categories

Find more on Entering Commands 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!