Advertisement
alfars215

1-6

Dec 20th, 2014
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 6.37 KB | None | 0 0
  1. % Central Difference
  2. % The Higher derivative Up to 6 " *Central Difference* " metrhod is implemented as
  3. % shown here using MATLAB(R).
  4.  
  5. %% Clear Memory and Screen
  6. clear
  7. clc
  8.  
  9. %% Firstly, the user has to choose between two input modes
  10. % 1- Function: Formula of a function.
  11. % 2- Data    : some (x,y) points.
  12. % the user has to write one of two words (Function or Data) to indicate the mode.
  13. while 1
  14.     disp('Please Choose your Input mode (Function or Data)');
  15.     Mode = input('','s');
  16.     disp('-------------------------------------');
  17.    
  18.     if ~(strcmpi( Mode , 'Function' )||strcmpi( Mode , 'Data' ))
  19.         disp('Error!')
  20.     else
  21.         break;
  22.     end;
  23. end;
  24. %% Enter the order of Derivative
  25. while 1
  26.     disp('Please Enter The order of Derivative (1 to 6)');
  27.     Order = input('  Order = ');
  28.     disp('-------------------------------------');
  29.     if (Order ~= 1)&&(Order ~= 2)&&(Order ~= 3)&&(Order ~= 4)&&(Order ~= 5)&&(Order ~= 6)
  30.         disp('Error!');
  31.     else
  32.         break;
  33.     end;
  34. end;
  35.  
  36. %% Function Mode
  37. % The user has chosen the Function mode (Go to line 10 ).
  38. if strcmpi( Mode , 'Function' )
  39.     % Enter the function
  40.     fs = input('Please Enter The Function \n f(x)= ','s');
  41.     f  = inline(fs);
  42.     disp('-------------------------------------');
  43.    
  44.     % Here, the user has to define where he wants to get the values of the 1st derivative.
  45.     % The user can input that using two formats: points that he wants to get the 1st derivative
  46.     % or the boundaries(a,b) of an period[a,b] besides a number of periods(n).
  47.     while 1
  48.         disp('Please Choose points Input mode (Points or Boundary)');
  49.         disp('Points like [X0 X1 X2 ... ]');
  50.         disp('Boundary means enter [a,b] and n');
  51.         Point_Mode = input('','s');
  52.         disp('-------------------------------------');
  53.         if ~(strcmpi( Point_Mode , 'Boundary' )||strcmpi( Point_Mode , 'Points' ))
  54.             disp('Error!');
  55.         else
  56.             break;
  57.         end;
  58.     end;
  59.  
  60.     % Here, the code deals with the one of the two formats (Go back to Line 44).
  61.     if strcmpi( Point_Mode , 'Boundary' )
  62.         a = input('Please Enter [a,b]\n  a = ');
  63.         b = input('  b = ');
  64.         n = input('Please Enter number of periods\n  n = ');
  65.         h = (abs(b-a))/n;
  66.         X = a:h:b;
  67.         h(1:n+1) = h(1);
  68.     else
  69.         X = input('Please Enter X \n For Example X = [0,1,5,6]\n  X = ');
  70.         %Enter The Value of Step Size h
  71.         disp('Enter a value of (h) OR the corresponding (h) for every (x)');
  72.         disp('Note: if numbers of (h) is less than number of (x), the remaining');
  73.         disp('corresponding values of (h) will be last (h) entered');
  74.         disp('-------------------------------------');
  75.         h = input('Please Enter the value of Step Size\n  h = ');
  76.         n = numel(X);
  77.         nh = numel(h);
  78.         % If data not complate for unequal we let the other h equal last value of h
  79.         if nh<n
  80.             h(nh:n) = h(nh);
  81.         end;
  82.     end;
  83.     disp('-------------------------------------');
  84.  
  85.     % Find Needed Derivative.
  86.     n = numel(X);
  87.     HD = X;
  88.     for i = 1:n
  89.         if Order == 1
  90.             HD(i) = (feval(f,X(i)+h(i))-feval(f,X(i)-h(i)))/(2*h(i));
  91.         elseif Order == 2
  92.             HD(i) = (feval(f,X(i)+h(i))+feval(f,X(i)-h(i))-2*feval(f,X(i)))/(h(i)*h(i));
  93.         elseif Order == 3
  94.             HD(i) = (feval(f,X(i)+2*h(i))-2*feval(f,X(i)+h(i))+2*feval(f,X(i)-h(i))-feval(f,X(i)-2*h(i)))/(2*h(i)^3);
  95.         elseif Order == 4
  96.             HD(i) = (feval(f,X(i)+2*h(i))-4*feval(f,X(i)+h(i))+6*feval(f,X(i))-4*feval(f,X(i)-h(i))+feval(f,X(i)-2*h(i)))/(h(i)^4);
  97.         elseif Order == 5
  98.             HD(i) = (feval(f,X(i)+3*h(i))-4*feval(f,X(i)+2*h(i))+5*feval(f,X(i)+h(i))-5*feval(f,X(i)-h(i))+4*feval(f,X(i)-2*h(i))-feval(f,X(i)-3*h(i)))/(2*h(i)^5);
  99.         elseif Order == 6
  100.             HD(i) = (feval(f,X(i)+3*h(i))-6*feval(f,X(i)+2*h(i))+15*feval(f,X(i)+h(i))-20*feval(f,X(i))+15*feval(f,X(i)-h(i))-6*feval(f,X(i)-2*h(i))+feval(f,X(i)-3*h(i)))/(h(i)^6);
  101.         end;
  102.     end;
  103.  
  104.     %Display X, h, Needed Derivative.
  105.     fprintf('f(x) = %s\n',fs);
  106.     disp   ('+---------------+------------+-------------------+');
  107.     fprintf('|      x        |      h     |    %1.0f derivative   |\n',Order);
  108.     disp   ('+---------------+------------+-------------------+');
  109.     for i = 1:n
  110.         fprintf('| %12.4f  |  %8.4f  |   %12.4f    |\n',X(i),h(i),HD(i));
  111.     end;
  112.     disp   ('+---------------+------------+-------------------+');
  113. end;
  114.  
  115. %% Data Mode
  116. % The user has chose the Data mode (Go back to line 11 ).
  117. if strcmpi( Mode , 'Data' )
  118.     % The user has to enter the Boundary of interval.
  119.     a = input('Please Enter the interval [a,b]\n  a = ');
  120.     b = input('  b = ');
  121.     n = input('Please Enter number of periods\n  n = ');
  122.     if b<a
  123.         tmp = a;
  124.         a = b;
  125.         b = tmp;
  126.     end;
  127.     h = (b-a)/n;
  128.     X = a:h:b;  
  129.      
  130.     % The user has to enter Y(x).
  131.     Y = X;
  132.     for i = 1:n+1
  133.        fprintf('Please Enter Y(%1.4f) = ',X(i));
  134.        Y(i) = input('');
  135.     end;
  136.      
  137.     % Find Needed Derivative.
  138.     n = numel(X);
  139.     HD = X;
  140.     HP = floor((Order+1)/2); % half of points that we need to find the drivative
  141.     for i = HP+1 : n-HP
  142.         if Order == 1
  143.             HD(i) = (Y(i+1)-Y(i-1))/(2*h);
  144.         elseif Order == 2
  145.             HD(i) = (Y(i+1)+Y(i-1)-2*Y(i))/(h*h);
  146.         elseif Order == 3
  147.             HD(i) = (Y(i+2)-2*Y(i+1)+2*Y(i-1)-Y(i-2))/(2*h^3);
  148.         elseif Order == 4
  149.             HD(i) = (Y(i+2)-4*Y(i+1)+6*Y(i)-4*Y(i-1)+Y(i-2))/(h^4);
  150.         elseif Order == 5
  151.             HD(i) = (Y(i+3)-4*Y(i+2)+5*Y(i+1)-5*Y(i-1)+4*Y(i-2)-Y(i-3))/(2*h^5);
  152.         elseif Order == 6
  153.             HD(i) = (Y(i+3)-6*Y(i+2)+15*Y(i+1)-20*Y(i)+15*Y(i-1)-6*Y(i-2)+Y(i-3))/(h^6);
  154.         end;
  155.     end;
  156.      
  157.     %Display X, Y, H, HD
  158.     disp   ('+---------------+---------------+---------------------+');
  159.     fprintf('|      x        |      y        |     %1.0f derivative    |\n',Order);
  160.     disp   ('+---------------+---------------+---------------------+');
  161.     for i = 1 : n
  162.         if (i<HP+1)||(i>n-HP)
  163.             fprintf('| %12.4f  | %12.4f  | Can`t be calculated |\n',X(i),Y(i));
  164.         else
  165.             fprintf('| %12.4f  | %12.4f  |     %12.4f    |\n',X(i),Y(i),HD(i));
  166.         end;
  167.     end;
  168.     disp   ('+---------------+---------------+---------------------+');  
  169.      
  170. end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement