How can i call an equation and it's derivative inside a matlab function?
8 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
Ömer Utku Örengül
il 7 Nov 2021
Modificato: Ömer Utku Örengül
il 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 Commenti
Risposta accettata
Più risposte (1)
Alan Stevens
il 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 Commenti
Walter Roberson
il 7 Nov 2021
Modificato: Walter Roberson
il 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
il 8 Nov 2021
Modificato: Alan Stevens
il 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.
Vedere anche
Categorie
Scopri di più su Number Theory in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!