MATLAB Answers

0

Forward, Backwawrd, Central, and Perfect Difference

Asked by Bailey Smith on 14 Jun 2018
Latest activity Edited by Jan
on 18 Jun 2018
Could someone please explain how to use the differences, especially with vectors? I would like to make a chart of the values of the four differences types, along with the corresponding x value. Say x=[0:0.2:0.6], y=sin(x), and yperfect=cos(x), how would I go about this?
UPDATE: This is the code I have to take the forward difference (first order).
function [out] = forwarddiff(x,y)
n=1;
L=length(x);
while n < L
out(n,1)=x(n);
out(n,2)=(y(n+1)-y(n))/(x(n+1)-x(n));
n=n+1;
end
out(L,1)=x(L);
out(L,2)=NaN;
end
X and Y values can be input by the user. My new question is: Would the second order forward difference look something like this?
function [out] = forwarddiff(x,y)
n=1;
L=length(x);
while n < L
out(n,1)=x(n);
out(n,2)=(y(n+2)-2*y(n+1)+y(n))/(x(n+1)-x(n))^2;
n=n+1;
end
out(L,1)=x(L);
out(L,2)=NaN;
end
I get an error about exceeding matrix dimensions when I run this.

  3 Comments

Why not try something, then ask for help when you get stuck? Show what you did. Make an effort.
I agree with John. Please try it, post the code and ask a specific question. It is unlikely that the forum will do your work in exactly the way you need it.
Is this your homework?
An old homework, but no Matlab required. I've been wanting to take my old homeworks and code them into Matlab so that I can better understand the program before I take any advanced computing class. If I have time, I will try to get a code posted tonight or tomorrow.

Sign in to comment.

2 Answers

Answer by Ankita Bansal on 18 Jun 2018
 Accepted Answer

Hi, in line
out(n,2)=(y(n+2)-2*y(n+1)+y(n))/(x(n+1)-x(n))^2;
you are getting error because you are trying to access y(n+2) at n=L-1.
Change your code to
function [out] = forwarddiff(x,y)
n=1;
L=length(x);
while n < L-1
out(n,1)=x(n);
out(n,2)=(y(n+2)-2*y(n+1)+y(n))/(x(n+1)-x(n))^2;
n=n+1;
end
out(L-1,1)=x(L-1);
out(L-1,2)=NaN;
end

  0 Comments

Sign in to comment.


Answer by Jan
on 18 Jun 2018
Edited by Jan
on 18 Jun 2018

A shorter form of your 1st order forward difference:
function [out] = forwarddiff(x,y)
x = x(:); % Consider row vectors
y = y(:);
dy = (y(2:end) - y(1:end-1)) / (x(2:end) - x(1:end-1));
out = [x, [dy; NaN]];
end
If you really want to do this with a loop, care for a pre-allocation. Letting the output grow iteratively wastes a lot of resources.
See also the diff command and gradient.

  0 Comments

Sign in to comment.