How to do forward, backward and central difference

7 views (last 30 days)
I am working on an assignment to to create plot showing forward, backward and centeral differenciation using f=sin(pi*x) [-1:1] for different values of n.
This is what i've written for n=10 with plot
yf=zeros(1,10);
yb=zeros(1,10);
y=zeros(1,10);
for j=1:11
% n=10
xb=-1+(j-1)*.2;
xbb=-1+(j-2)*.2;
xf=-1+j*.2;
y(j)=sin(pi*xb); %u(xi)
yb(j)=sin(pi*xbb); %u(xi-dx)
yf(j)=sin(pi*xf); %u(xi+dx)
end
bd=y-yb; %backward dif
fd=yf-y; %forward dif
cd=(yf-yb)/2; %central diff
n=-1:.2:1;
f1=figure
fplot(@(t) pi*cos(pi*t),[-1,1]);
title('n=10')
hold on
plot(n,bd)
plot(n,fd)
plot(n,cd)
legend('derivative','backward','forward','center')
As I increase n to 100 as seen below, the curve becomes flatter (I would expect it to follow the curve more closely). Am I missing something conseptually or does the code not reflect the equations for forward, backward, and central difference.
for j=1:101
%n=100
xb=-1+(j-1)*.02;
xbb=-1+(j-2)*.02;
xf=-1+j*.02;
z(j)=sin(pi*xb); %u(xi)
zb(j)=sin(pi*xbb); %u(xi-dx)
zf(j)=sin(pi*xf); %u(xi+dx)
end
bd_1=z-zb;
fd_1=zf-z;
cd_1=(zf-zb)/2;
N=-1:.02:1; %hundo
f2=figure
fplot(@(t) pi*cos(pi*t),[-1,1]);
title('n=100')
hold on
plot(N,bd_1)
plot(N,fd_1)
plot(N,cd_1)
legend('derivative','backward','forward','center')

Accepted Answer

Bruno Luong
Bruno Luong on 19 Sep 2019
Edited: Bruno Luong on 19 Sep 2019
You forget to divide the differences by the time step (dt)
dt = 0.02
for j=1:101
xb=-1+(j-1)*dt;
xbb=-1+(j-2)*dt;
xf=-1+j*dt;
z(j)=sin(pi*xb); %u(xi)
zb(j)=sin(pi*xbb); %u(xi-dx)
zf(j)=sin(pi*xf); %u(xi+dx)
end
bd_1=(z-zb)/dt; % bug was HERE
fd_1=(zf-z)/dt; % bug was HERE
cd_1=((zf-zb)/2)/dt; % bug was HERE
N=-1:dt:1; %hundo
f2=figure
fplot(@(t) pi*cos(pi*t),[-1,1]);
title('n=100')
hold on
plot(N,bd_1)
plot(N,fd_1)
plot(N,cd_1)
legend('derivative','backward','forward','center')

More Answers (1)

Image Analyst
Image Analyst on 19 Sep 2019
Once you have y, or z, why not just compute differences numerically using conv()?
n = 11; % Whatever
kernel = zeros(1, 2*n+1);
kernel(n+1) = 1; % Center element of window
kernel(end) = -1; % Kernel will subtract first element in window from center element. Remember, convolution flips kernel!
yBackwards = conv(y, kernel, 'same');

Categories

Find more on Programming in Help Center and File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!