# How can i call an equation and it's derivative inside a matlab function?

12 views (last 30 days)
Ömer Utku Örengül on 7 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

Ömer Utku Örengül on 8 Nov 2021
Edited: Ömer Utku Örengül on 8 Nov 2021
So I have it worked like this.
function fd=fd(a)
syms a
fx=exp(-a)-a;
fd=diff(fx);
end
and put "syms a" at the main function and finally changed "fd(x(i+1))" with;
...
x(i+2)=x(i+1)-f(x(i+1))/subs(fd,a,x(i+1)); % subs(fd,a,x(i+1))
...
It worked as intended.

### More Answers (1)

Alan Stevens on 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));
After 4 iterations an approximate root is 0.567143
function [fx, fd]=f(x)
fx=exp(-x)-x;
fd = -exp(-x)-1;
end
Alan Stevens on 8 Nov 2021
Edited: Alan Stevens on 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));
After 4 iterations an approximate root is 0.567143
but, if you have the Symbolic Maths package, Walter's suggestion is best.

R2021b

### Community Treasure Hunt

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

Start Hunting!