He escrito un código para la interseccion algoritmo en MatLab. Me he basado este en el pseudocódigo dado en mi libro de texto. El algoritmo ha funcionado bien en todos mis problemas hasta ahora, pero cuando me preguntan para encontrar una raíz de f(x) = x – tan(x) en el intervalo [1,2] tengo algunos problemas. Mi código es el siguiente:

function x = bisection(a,b,M)
f = @(x) x - tan(x);
u = f(a);
v = f(b);
e = b-a;
x = [a, b, u, v]
if (u > 0 && v > 0) || (u < 0 && v < 0)
    return;
end;
for k = 1:M
    e = e/2;
    c = a + e;
    w = f(c);
    x = [k, c, w, e]
    if (abs(e) < 10^(-5) || abs(w) < eps)
        return;
    end
    if (w < 0 && u > 0) || (w > 0 && u < 0)
        b = c;
        v = w;
    else
        a = c;
        u = w;
    end
end

Si puedo ejecutar este algoritmo en el intervalo [1,2] con, digamos, 15 iteraciones, mi respuesta final es:

x =

  1.0e+004 *

    0.0015    0.0002   -3.8367    0.0000

que es, obviamente, fuera de que me desea obtener f(c) = 0 (la tercera entrada en el vector de arriba).

Si alguien me puede dar alguna ayuda/consejos sobre cómo mejorar mi resultado, me sería de gran aprecio. Soy muy nuevo en MatLab, así que me tratan como a un novato :).

InformationsquelleAutor Kristian | 2012-08-03

1 Comentario

  1. 4

    Vamos a echar un vistazo a la secuencia de c que se genera por la interseccion método:

    c =  1.5000
    c =  1.7500
    c =  1.6250
    c =  1.5625
    c =  1.5938
    c =  1.5781
    c =  1.5703
    c =  1.5742
    c =  1.5723
    c =  1.5713
    c =  1.5708
    c =  1.5706
    c =  1.5707
    c =  1.5707
    c =  1.5708

    Usted puede ver que converge a pi/2. El tan() tiene una singularidad en este punto y lo hace x - tan(x). La interseccion método converge a esta singularidad como también se indica aquí, por ejemplo. Esta es la razón por la que el valor de la función en f(c) no es cercano a cero. En realidad debería ir a (más/menos) infinito.

    Otras sugerencias:

    Me gusta tu interseccion método. Para que sea utilizable de manera más general, se puede incorporar estos cambios:

    • Hacer que la variable f un parámetro de la función. A continuación, puede utilizar su método con diferentes
      las funciones sin tener que volver a escribirlo.
    • La primera vez que asignar x = [a, b, u, v] pero más tarde x(1) es el número de
      iteraciones. Me gustaría hacer esto de forma más coherente.
    • Puede probar fácilmente si f(a) y f(b) tienen diferentes signos mirando el signo de
      el producto p = f(a)*f(b). Para p > 0 los signos son iguales y no hay raíz,
      para p < 0 los signos son diferentes y para p == 0 ya sea f(a) o f(b) es cero y
      ya han encontrado la raíz.
    • Muchas gracias por la entrada y sugerencias para mejorar! Realmente aprecio, especialmente en el enlace que explica que la interseccion método converge a la singularidad. La razón por la que escribí el método como yo lo hice, y no con el producto f(a)*f(b) como usted sugiere es que mi libro escribe que «es mejor para determinar si la función cambia de signo en el intervalo utilizando la señal(w) ≠ signo(u) en lugar de u*w < 0, ya que este último requiere una innecesarios multiplicación y podría causar un subdesbordamiento o desbordamiento».
    • Estoy de acuerdo, evitando desbordamientos y underflows es sin duda un problema.

Dejar respuesta

Please enter your comment!
Please enter your name here