How can i call an equation and it's derivative inside a matlab function?
    10 Ansichten (letzte 30 Tage)
  
       Ältere Kommentare anzeigen
    
    Ömer Utku Örengül
 am 7 Nov. 2021
  
    
    
    
    
    Bearbeitet: Ömer Utku Örengül
 am 8 Nov. 2021
            As a newbie, i like to ask a simple question. I am trying to impliment a newton-rapson method for a simple equation as an example. I create a different matlab function from main function for the equation and call it inside the main function. However when I try to call the functions derivative it gives an error. I am aimin to not to take the derivative inside the main function for optimization concerns. I did try different methods but they give errors all the same.
function nr(x0,TC)
% TC is given in terms of percentage!
if nargin<2, x0=0; TC=10^-4;end 
error=TC+1; i=0;
x(1)=x0;
while(error>TC)
    x(i+2)=x(i+1)-f(x(i+1))/fd(x(i+1));    
    error=100*abs((x(i+2)-x(i+1))/x(i+2));
    i=i+1;
end
fprintf('After %d iterations an approximate root is %f',i,x(i));
end
function [fx]=f(x)
fx=exp(-x)-x;
end
function fd=fd(x)
% syms x                                                    %These parts where i need help.
% fx=exp(-x)-x;
% fd=matlabFunction(diff(fx))
fd=-exp(-x)-1;
end
0 Kommentare
Akzeptierte Antwort
Weitere Antworten (1)
  Alan Stevens
      
      
 am 7 Nov. 2021
        Like this, perhaps:
% TC is given in terms of percentage!
x0=0; TC=10^-4;
error=TC+1; i=0;
x(1)=x0;
while(error>TC)
    [fx, fd] = f(x(i+1));
    x(i+2)=x(i+1)-fx/fd;    
    error=100*abs((x(i+2)-x(i+1))/x(i+2));
    i=i+1;
end
fprintf('After %d iterations an approximate root is %f',i,x(i));
function [fx, fd]=f(x)
fx=exp(-x)-x;
fd = -exp(-x)-1;
end
3 Kommentare
  Walter Roberson
      
      
 am 7 Nov. 2021
				
      Bearbeitet: Walter Roberson
      
      
 am 8 Nov. 2021
  
			There are two notable diff() functions. One of them only applies if the first parameter is symbolic or symbolic function.
syms x
fd = matlabFunction(diff(f(x),x))
function [fx]=f(x)
fx=exp(-x)-x;
end
  Alan Stevens
      
      
 am 8 Nov. 2021
				
      Bearbeitet: Alan Stevens
      
      
 am 8 Nov. 2021
  
			You could always try something like this:
% TC is given in terms of percentage!
fx = @(x) exp(-x)-x;
dx = 10^-10;   % Choose a suitably small value
fd = @(x) (fx(x+dx) - fx(x))/dx;
x0=0; TC=10^-4;
error=TC+1; i=0;
x(1)=x0;
while(error>TC)
    x(i+2)=x(i+1)-fx(x(i+1))/fd(x(i+1));    
    error=100*abs((x(i+2)-x(i+1))/x(i+2));
    i=i+1;
end
fprintf('After %d iterations an approximate root is %f',i,x(i));
but, if you have the Symbolic Maths package, Walter's suggestion is best.
Siehe auch
Kategorien
				Mehr zu Number Theory finden Sie in Help Center und File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


