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

15 visualizaciones (últimos 30 días)
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

Respuesta aceptada

Ömer Utku Örengül
Ömer Utku Örengül el 8 de Nov. de 2021
Editada: Ömer Utku Örengül el 8 de Nov. de 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.

Más respuestas (1)

Alan Stevens
Alan Stevens el 7 de Nov. de 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
  3 comentarios
Walter Roberson
Walter Roberson el 7 de Nov. de 2021
Editada: Walter Roberson el 8 de Nov. de 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))
fd = function_handle with value:
@(x)-exp(-x)-1.0
function [fx]=f(x)
fx=exp(-x)-x;
end
Alan Stevens
Alan Stevens el 8 de Nov. de 2021
Editada: Alan Stevens el 8 de Nov. de 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.

Iniciar sesión para comentar.

Productos


Versión

R2021b

Community Treasure Hunt

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

Start Hunting!

Translated by