Este método utiliza el mismo teorema del método Newton-Raphson para hallar la x, para entenderlo mejor recordemos la fórmula de Newton-Raphson para encontrar la x.
Para entender el método de raíces múltiples podemos escribir esta ecuación de la forma x=xo−(u), lo que hace el método de raíces múltiples es que coge el ultimo termino y lo modifica para que vuelva a quedar de la forma original, es decir.
Después de hacer las operaciones debidas se puede concluir que.
PSEUDOCÓDIGO RAÍCES MÚLTIPLES
Leer Xo, Tolerancia, Iter
Yo = f(Xo)
Do = f''(Xo)
D2o = f''(Xo)
2part= Do^2 - (Yo * D2o)
Contador = 0
Error = Tolerancia + 1
Mientras Yo ~= 0 & 2part ~= 0 & Error > Tolerancia & Contador < Iter Hacer
X1 = Xo - ((Yo*Do) / 2part)
Yo = f(X1)
Do = f'(X1)
D2o = f''(X1)
2part = Do^2 - (Yo * D2o)
Error = abs ((X1 - Xo)/X1)
Xo = X1
Contador = Contador + 1
Fin Mientras
Si Yo = 0 entonces
muestre 'Xo es raiz'
Sino Si Error < Tolerancia entonces
muestre ' Xo es una raiz aproximada gracias a la tolerancia'
Fin si
Fin si
Fin proceso
clc
clear
close all
format long
f = @(x) log((x.^2)+1)+(x.*cos(6.*x+3))-3.*x-10;
df = @(x) ((2.*x)./(x.^2+1))-(6.*x.*sin(6.*x+3))+cos(6.*x+3)-3;
d2f= @(x) [-(4.*x.^2)./(x.^2+1).^2]+[2./(x.^2+1)]-12.*sin(6.*x+3)-36.*x.*cos(6.*x+3);
x0=input('Ingrese x0: ');
Tolerancia=input('Ingrese Tolerancia: ');
N_Iteraciones=input('Ingrese N_Iteraciones: ');
Contador=1;
Error=Tolerancia+1;
Den=(((df(x0).^2)-(f(x0)*df(x0)))/(df(x0).^2));
while Error>Tolerancia && f(x0)~=0 && Contador<N_Iteraciones
x1=x0-((f(x0)/df(x0))/(((df(x0).^2)-(f(x0)*df(x0)))/(df(x0).^2)));
Error=abs(x1-x0);
T(Contador, 1)=Contador;
T(Contador, 2)=x0;
T(Contador, 3)=f(x0);
T(Contador, 4)=df(x0);
T(Contador, 5)=d2f(x0);
T(Contador, 6)=Error;
x0=x1;
Den=(((df(x0).^2)-(f(x0)*df(x0)))/(df(x0).^2));
Contador=Contador+1;
endwhile
if f(x0)==0
formatSpec = '\nLa raiz es %.15f \n \n';
fprintf(formatSpec,x0)
disp(' %iteraciones Valor inicial f(Valor final) df(Valor final) d2f(Valor final) Error')
disp(T)
fplot(f,[x0-1,x0+1]), grid on
break
else
if Error<Tolerancia
formatSpec = '\nLa aproximacion de la raiz es %.15f con tolerancia de %.15f \n \n';
fprintf(formatSpec,x1,Tolerancia)
disp(' %iteraciones Valor inicial f(Valor final) df(Valor final) d2f(Valor final) Error')
disp(T)
fplot(f,[x1-1,x1+1]), grid on
break
else
if Den==0
disp('Se está dividiendo por cero')
else
formatSpec = '\nNo se encontro la raiz con %d iteraciones \n \n';
fprintf(formatSpec,N_Iteraciones)
disp(' % iteraciones Valor inicial f(Valor final) df(Valor final) d2f(Valor final) Error')
disp(T)
endif
endif
endif