es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Octave, El método de la secante

Estoy tratando de implementar el método de la secante usando Octave, y en particular hice una función llamada “secant(“función”,”x0″,”x1″,”tolerancia”)”. Usé el bucle while para calcular la raíz de una función y creo que el problema está en el bucle.

Pero el resultado que obtengo no es el que espero. La respuesta correcta es x=0,49438.

Mi código es el siguiente:

tol = 10.^(-5); # tolerancia
x0 = 0.4; # punto inicial
x1 = 0.6; # punto inicial
syms x;
fun = @(x) exp(sin(x)) – 2/(1+x.^2); # f(x) = exp(sin(x)) – 2/(1+x^2)
fprintf(“Función f(x)\n”);
fun
fprintf(“\n”);
fprintf(“puntos iniciales: %f\n”,x0,x1);
function[raiz,errel,niter] = secant(fun,x0,x1,tol)
niter = 0; # número de pasos
errel = []; # el vector de errores relativos
y0 = fun(x0); # f(x0)
y1 = fun(x1); # f(x1)
ra = 0.0; # ra es la variable de la raíz de la función
while abs(ra-x1)>= tol
niter += 1;
ra = x1 – ((x1-x0)./(y1-y0)).*y0; # fórmula del método de la secante
if abs((ra-x1))<tol
fprintf (‘el método ha terminado\n’);
fprintf (‘\n’);
endif
raiz = ra;
endfunction
[r,er,tot] = secant(fun,x0,x1,tol)

agradezco la ayuda que me puedas brindar fprintf=”” (‘el=”” método=”” ha=”” terminado\n’);=”” fprintf=”” (‘\n’);=”” endif=”” raiz=”ra;” endfunction=”” [r,er,tot]=”secant(fun,x0,x1,tol)” agradezco=”” la=”” ayuda=”” que=”” me=”” puedas=””></tol
fprintf (‘el método ha terminado\n’);
fprintf (‘\n’);
endif
raiz = ra;
endfunction
[r,er,tot] = secant(fun,x0,x1,tol)

agradezco la ayuda que me puedas brindar>

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece haber algunos problemas con la implementación del método de la secante en el código proporcionado. Uno de los principales problemas es el uso de ‘syms x’, lo cual no es necesario ya que la función está definida con ‘@’. Además, la función no está siendo llamada correctamente con el número correcto de argumentos.

    Otro problema está en la condición del bucle while, que debería ser abs(fun(ra)) >= tolerancia en lugar de abs(ra-x1) >= tolerancia.

    Aquí hay una versión modificada del código que debería funcionar:

    tolerancia = 10.^(-5);
    x0 = 0.4;
    x1 = 0.6;
    fun = @(x) exp(sin(x)) - 2/(1+x.^2);
    
    function [raiz, error, iteraciones] = secante(f, x0, x1, tol)
        iteraciones = 0;
        error = [];
        y0 = f(x0);
        y1 = f(x1);
        raiz = 0.0;
        while abs(f(x1)) >= tol
            iteraciones += 1;
            raiz = x1 - ((x1-x0)./(y1-y0)).*y0;
            if abs(f(raiz)) < tol
                break;
            end
            x0 = x1;
            y0 = y1;
            x1 = raiz;
            y1 = f(raiz);
            error(iteraciones) = abs(raiz-x1)/abs(raiz);
        end
    endfunction
    
    [raiz, error, iteraciones] = secante(fun, x0, x1, tolerancia);
    disp(raiz);
    

    Esto debería mostrar el resultado deseado: 0.49438.

    Ten en cuenta que la llamada a la función debería ser secante(fun, x0, x1, tolerancia) y no secante("función", "x0", "x1", "tolerancia").

Comments are closed.