clear, clc % Algoritmo para calcular las raíces de una ecuación no-lineal % aplicando el método de regula falsi (variante del método de Newton-Raphson): % se trata de una combinación del método de la bisección y de la secante, % pues en lugar de calcular el punto medio de cada intervalo, % comenzando desde el dado inicialmente, se calcula un valor equivalente % a realizar una interpolación lineal de la función f(x), i.e., % c = (a*f(b)-b*f(a))/(f(b)-f(a)), % siendo f(x) la función % del problema original, i.e., % encontrar las raíces de la ecuación f(x) = 0 f = @(x) 2*x.^2 - 5*x + 3; a = input('Introduce el valor de a: '); b = input('Introduce el valor de b: '); tol = input('Introduce el valor de la tolerancia de x: '); niter = input('Introduce el numero máximo de iteraciones: '); % El comando "return" facilita salir de una función en un % loop anidado o sentencia condicional if f(a)*f(b) > 0 fprintf('No existen raices dentro de este intervalo \n'); return end % test para detectar si a o b son ellos mismos una raíz de la ecuación if f(a) == 0 fprintf('a es una de las raices\n') return elseif f(b) == 0 fprintf('b es una de las raices\n') return end npasos = 0; error = tol+1; % definición de las componentes del vector x x = 0:0.01:2; % evaluación de las componentes del vector x por la función f(x) y = f(x); z = zeros(size(x)); %t = zeros(size(x)); plot(x,y) % para activar la rejilla grid on % para poder representar varias gráficas juntas sin borrar las precedentes % en caso de no hacerlo, sólo aparecerá la última grafica realizada hold on plot(x,z,'r') plot(z,x,'r') % 'r' signifca "red" y dibuja la gráfica de color rojo title('f(x)=2*x^2-5*x3'); xlabel('x'); ylabel('y'); % la convergencia de este método es unilateral, i.e., convergerá % en una sucesión de intervalos que tendrá siempre a "a" como extremo inferior % o a "b" como extremo superior while ( error > tol && npasos < niter ) c = (a*f(b)-b*f(a))/(f(b)-f(a)); % método de la biseccion&secante error = abs(f(c)); %el residuo de la función evaluada en xh if f(a)*f(c) < 0 b = c; else a = c; end npasos = npasos + 1; end % cuando se escribe %n en disp o fprintf indica un cambio de línea' fprintf('La raiz: %f\nEl numero de iteraciones: %d\n', c,npasos) fprintf('El error cometido: %f\n', error)