Resolución de ecuaciones en Sage

Como se puede comprobar en la ayuda de Sage, el comando solve permite resolver ecuaciones no lineales mediante cálculo simbólico:

sage: solve(x^2 == 5, x)
[x == -sqrt(5), x == sqrt(5)]

Para su resolución numérica, se usa el comando find_root:

sage: find_root(x^2==5, 0, 3)
2.2360679774997925

Método de dicotomía

El método de dicotomía se puede implementar en una función de Sage:

# script res_eq.sage
def dicotomia(f, a, b, tolx, toly):
    """DICOTOMIA    Calculo de raices por el metodo de dicotomia.
    R, K, V = DICOTOMIA(F, A, B, TOLX, TOLY) busca una raiz por el 
    metodo de dicotomia de la funcion escalar F en el intervalo 
    [A,B]; DICOTOMIA devuelve la raiz aproximada R, bien si el 
    valor  de la  funcion es menor que TOLY, bien si la longitud 
    del  intervalo  de busqueda es menor que TOLX. Ademas, devuelve
    el numero de iterantes K y el array de iterantes V.

    Ejemplo: r,k,v = dicotomia(@(x)cos(x)-x, 0, 1, 1e-6, 1e-6)
    """
    r = a
    k = 0
    v = []
    # comprobaciones previas
    if abs(f(a)) < toly:
        r = a.n(); return r,k,v
    elif abs(f(b)) < toly:
        r = b.n(); return r,k,v
    elif f(a) * f(b) > 0:
        raise RuntimeError('Mismo signo en ambos extremos!')
    # calculo iterativo
    while abs(b - a) > tolx:
        k = k + 1
        r = (a + b).n() / 2
        v.append(r)
        if abs(f(r)) < toly:
            return r,k,v
        elif f(a) * f(r) < 0:
            b = r
        else:
            a = r
    return r,k,v

El siguiente script puede servir para testar el método de dicotomía:

# script ejemplo_dicotomia.sage
attach('res_eq.sage')
print 'Ejemplo del funcionamiento de dicotomia()'
print 'r,k,v = dicotomia(5*x-2^x, 0, 2, 1e-6, 1e-6)'
a = 0; b = 2
f(x) = 5*x-2^x
r,k,v = dicotomia(f, a, b, 1e-6, 1e-6)

# grafica
show(plot(f,a,b)+point(zip(v,[0]*len(v))))

# iterantes
for i in range(len(v)):
    print 'Iterante ' + str(i) + ': ' + str(v[i]) + \
    '; longitud del intervalo: ' + str((b-a)*.5^i)

graf-dicotomia

Advertisements
Esta entrada foi publicada en Sage. Ligazón permanente.

Deixar unha resposta

introduce os teu datos ou preme nunha das iconas:

Logotipo de WordPress.com

Estás a comentar desde a túa conta de WordPress.com. Sair / Cambiar )

Twitter picture

Estás a comentar desde a túa conta de Twitter. Sair / Cambiar )

Facebook photo

Estás a comentar desde a túa conta de Facebook. Sair / Cambiar )

Google+ photo

Estás a comentar desde a túa conta de Google+. Sair / Cambiar )

Conectando a %s