Description of the
Program
The program takes user input for the function of the
variable ‘x’ e.g. x2, sin(x), cos(x)/x2 etc., the point
on which the derivative is evaluated and initial and final grid sizes.
The program then calculates its first derivative
analytically.
It then calculates finite difference approximations of the
first derivative of order h, with point A unknown and the point A known, using
various step sizes, with maximum and minimum step size enter by the user.
It then calculates
and plots the error between the exact value and the approximations of the first
derivative.
clc; %clears the command window
%data input and analytical differentiation
syms x
fx=input('Enter the function of ''x'' to be
differentiated '); %input a function like sin(x) or x.^4 + x.^3
clc; %clears the command window
fxp=(diff (fx,x)); %calculate the derivative
analytically
x=input('Enter the point at which the
derivative is to be evaluated '); %input the value at which the derivative to
be evaluated
clc; %clears the command window
y=inline(fxp,'x'); %convert a statement in to
a function so it can be evaluated at some point
z=y(x); %derivative evaluated at the point
dxmin=input('Enter the smallest value of
increment ');
clc;
dxmax=input('Enter the largest value of
increment ');
clc;
%finite difference approximation
for dx=dxmin:0.001:dxmax; %loop for different
values of grid spacing, dx=h1
a=1.5;
h1=a*dx; %h2 in the problem sheet
h2=(2*a*dx); %h3 in the problem sheet
fc=cos(5+h2)/(5+h2).^2; %value of the function at point c
fb=cos(5+h1)/(5+h1).^2; %of the function at point b
fa=cos(5-dx)/(5-dx).^2; %of the function at point a
fi=cos(x)/(x).^2; %of the function at point A
fxpu=(fc+fb-(2*fa))/((2*dx)+h1+h2); %formulation with A unknown
fxpa=(fc+fb+(2*fa)-(4*fi))/((-2*dx)+h1+h2); %formulation with A known
hold on
plot ((z-fxpa)/z,dx,'.k') %error plot for approximation with A known
plot ((z-fxpu)/z,dx,'.r') %error plot for approximation with A unknown
end
%text editing
title('Plot Between Error VS Grid Spacing')
%title of the graph
xlabel('Error from the Exact Value'); %x-axis
label
ylabel('Step Size/Grid Spacing') %y-axis
label
text(0.6, 0.9,'Red: Error plot for
approximation with A unknown') %identification
text(0.6, 0.85,'Black: Error plot for
approximation with A known') %identification
Sample Problem
Command Window after running the code
Enter the function of 'x' to be differentiated cos(x)/x.^2
Enter the point at which the derivative is to be evaluated 5
Enter the smallest value of increment 0.001
Enter the largest value of increment 1
Result
It was observed that the error in the finite difference
approximation when the value of the function at point A is unknown is less as
compared to the case where value of the function at point A is known.
In physical/real-world problems, the exact derivatives of
the functions are not known, therefore the error values between the exact and
the finite difference approximation cannot be calculated. As it is also
observed that the error between finite difference approximation and the exact
value of the derivative decreases as the step size decreases, it is advisable
to use a step size of ~1/1000 to make a compromise between CPU/RAM usage, time
taken to solve the problem and error.