Método de Bairstow con Guide en Matlab
En análisis numérico, el método de Bairstow es un algoritmo eficiente de búsqueda de las raíces de un polinomio real de grado arbitrario. El algoritmo apareció por primera vez en el apéndice del libro “Aerodinámica Aplicada”, escrito por
Leonard Bairstow y publicado en1920. El algoritmo se diferencia de otros métodos en que encuentra tanto las raíces reales como las imaginarias (en parejas complejas conjugadas), utilizando únicamente aritmética real.
function btnLimpiar_Callback(hObject, eventdata, handles)
%limpiar area de grafico
cla
%limpiar tabla
set(handles.tabla,'Data',{})
%limpiar textboxs
set(handles.txtFuncion,'string','');
set(handles.txtX0,'string','');
set(handles.txtPorcentajeError,'string','');
set(handles.txtRaiz,'string','');
function btnCalcular_Callback(hObject, eventdata, handles)
%manejo de excepciones con try y catch
try
funcion=get(handles.txtFuncion,'string');
x0=str2double(get(handles.txtX0,'string'));
porcentajeError=str2double(get(handles.txtPorcentajeError,'string'));
syms x
iteracion=0;
errorCalculado=100;
f=sym(funcion);
derivada=diff(f,x);
%Limpiar tabla antes de mostrar resultado
set(handles.tabla,'Data',{})
%Comprobando que la derivada no sea cero.Casocontrario mostrar un mensaje
%que no hay raiz p.e se ingreso uan constante en lugar de una funcion de x
if derivada==0
%Limpiar tabla, grafico en caso de que antes se haya graficado uan
%funcion
hold off
cla
set(handles.tabla,'Data',{})
set(handles.txtRaiz,'string','No hay raiz');
else
%Iteraciones sucesivas para una mejor aproximacion de la raiz por el metodo
%N-R
while errorCalculado>porcentajeError
fx=subs(f,x0);
dx=subs(derivada,x0);
x1=x0-(fx/dx);
errorCalculado=abs(((x1-x0)/x1)*100);
%mostrar datos en tabla
%valores = {iteracion x0 x1 errorCalculado};
%temp=get(handles.tabla,'data');
%valoresNuevos=[valores;temp];
%set(handles.tabla,'Data',valoresNuevos)
newRow ={iteracion x0 errorCalculado};
oldData = get(handles.tabla,'Data');
newData=[oldData; newRow];
set(handles.tabla,'Data',newData)
x0=x1;
iteracion=iteracion+1;
end
%Mostrando respuesta en textbox con formato coma flotante a 16 cifras decimales
respuesta=sprintf('%0.16f',x1);
set(handles.txtRaiz,'string',respuesta);
%Grafica de la funcion
hold off
handles.axes1=ezplot(f);
grid on;
hold on;
%handles.axes1=plot(x1,subs(f,respuesta),'r*');
zoom on
end
catch
% msgbox('Un error ha ocurrido. Verifique que ha introducido todos los datos y de la forma adecuada','Error','error')
end
0 comments:
Publicar un comentario