How to do forward, backward and central difference

7 Ansichten (letzte 30 Tage)
Kennedy Oparka
Kennedy Oparka am 19 Sep. 2019
Bearbeitet: Bruno Luong am 19 Sep. 2019
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')

Akzeptierte Antwort

Bruno Luong
Bruno Luong am 19 Sep. 2019
Bearbeitet: Bruno Luong am 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')

Weitere Antworten (1)

Image Analyst
Image Analyst am 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');

Kategorien

Mehr zu Programming finden Sie in Help Center und File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by