f=input('INGRESE FUNCION: ','s'); xai=input('INGRESE LIMITE INFERIOR DEL INTERVALO: '); xbi=input('INGRESE LIMITE SUPERIOR DEL INTERVALO: '); tol=input('INGRESE PORCENTAJE DE ERROR: '); f=inline(f); i=1; ea(1)=100; if f(xai)*f(xbi) < 0 xa(1)=xai; xb(1)=xbi; xr(1)=(xa(1)+xb(1))/2; fprintf('It. Xa Xr Xb Error aprox \n'); fprintf('%2d \t %11.7f \t %11.7f \t %11.7f \n',i,xa(i),xr(i),xb(i)); while abs(ea(i)) >= tol, if f(xa(i))*f(xr(i))< 0 xa(i+1)=xa(i); xb(i+1)=xr(i); end if f(xa(i))*f(xr(i))> 0 xa(i+1)=xr(i); xb(i+1)=xb(i); end xr(i+1)=(xa(i+1)+xb(i+1))/2; ea(i+1)=abs((xr(i+1)-xr(i))/(xr(i+1))*100); fprintf('%2d \t %11.7f \t %11.7f \t %11.7f \t %7.3f \n',... i+1,xa(i+1),xr(i+1),xb(i+1),ea(i+1)); i=i+1; end else fprintf('No existe una raiz en ese intervalo'); end bisec_g.m
function bisec_g(f_name, a,c, xmin, xmax, n_points)
f_name %a, c : extremos del intervalo inicial %tolerance:tolerancia %It_limit:límite de el número de iteraciones %Y_a, Y_c : valores de los extremos actuales %fun_f(x): valor funcional en x clg, hold off clear Y_a, clear Y_c wid_x= xmax-xmin; dx = (xmax-xmin)/n_points; xp=xmin:dx:xmax; yp = feval(f_name, xp); plot (xp,yp); xlabel('x'); ylabel('f(x)'); title('Método de la bisectriz'), hold on ymin=min(yp); ymax=max(yp); wid_y=ymax-ymin; yp=0.*xp; plot(xp,yp); fprintf('Método de la bisectriz: \n\n'); tolerance=0.000001; it_limit=30; fprintf(' It. a b c fa=f(a) '); fprintf(' fc=f(c) abs(fc-fa) \n'); it=0; Y_a=feval(f_name,a);Y_c=feval(f_name, c); plot([a,a], [Y_a,0]); text(a,-0.1*wid_y,'x=a') plot([c,c], [Y_c,0]); text(c,-0.1*wid_y,'x=c') if (Y_a*Y_c > 0) fprintf('f(a)f(c > 0 \n'); else while 1 it=it+1; b= (a+c)/2; Y_b=feval(f_name, b); plot([b,b], [Y_b,0],':'); plot(b,0,'o') if it<4, text(b,wid_y/20, [num2str(it)]),end fprintf('%3.0f %10.6f, %10.6f', it, a, b); fprintf(' %10.6f, %10.6f, %10.6f', c, Y_a, Y_c); fprintf(' %12.3e\n', abs((Y_c-Y_a))); if (abs(c-a)<=tolerance) fprintf(' Se satisface la tolerancia. \n');break end if( it>it_limit ) fprintf(' Se exedio el limite de iteraciones. \n');break end if (Y_a*Y_b <= 0) c=b; Y_c=Y_b; else a=b; Y_a=Y_b; end end fprintf('Resultado final: Raíz=%12.6f \n',b); end x=b; plot([x x],[0.05*wid_y 0.2*wid_y]) text(x, 0.25*wid_y, 'Solución final') plot([x( x-wid_x*0.004)], [0.05*wid_y 0.09*wid_y]) plot([x( x+wid_x*0.004)], [0.05*wid_y 0.09*wid_y]) function x = biseccion(fun,a,b,tol) % Aproxima por el método de la bisección una raíz de la ecuación fun(x)=0 disp('Método de la bisección'); u=feval(fun,a); v=feval(fun,b); n=1; if sign(u)==sign(v) disp('Error la función debe cambiar de signo en (a,b)'); end while ((b-a)*0.5=tol) c=(b+a)/2; w=feval(fun,c); disp(['n=', num2str(n)]); disp(['c=', num2str(c)]); disp(['f(c)=', num2str(w)]); if sign(u)==sign(w) a = c; u=w; else b=c; v=w; end n=n+1; end; x=c;