# Sesión 5 (23/09/2011)

Método de bisección (y 2)

f(x):=x+%e^x;

biseccion(f,extremo1,extremo2,
   tolerancia,precision,nmaxiter):=
    block(
        [a,b,c,k,i],
        a:extremo1,
        b:extremo2,
        i:0,
        if abs(f(a))<precision then return([i,a]),
        if abs(f(b))<precision then return([i,b]),
        if f(a)*f(b)>0 then 
        error("Intervalo no adecuado"),
        i:nmaxiter,
        for k:1 thru nmaxiter do
            (
            c:(a+b)/2,print(c),
            if abs(b-a)<tolerancia then (i:k,return()),          
            if abs(f(c))<precision then (i:k,return()),
            if f(a)*f(c)<0 then b:c else a:c
            ),
[i,c]
)$

biseccion(f,-1.0,0.0,10^(-8),10^(-8),100);

biseccion(f,0.0,-1.0,10^(-8),10^(-8),100);

biseccion(f,0.0,10.0,10^(-8),10^(-8),100);

biseccion(x^2-2,-1.0,0.0,10^(-8),10^(-8),100);

Programa que lee expresiones

biseccion1(expresion,var,extremo1,extremo2,
   tolerancia,precision,nmaxiter):=
    block(
        [a,b,c,k,i,x],
        a:extremo1,
        b:extremo2,
        i:0,
        local(f),
        define(f(x),subst(x,var,expresion)),
        if abs(f(a))<precision then return([i,a]),
        if abs(f(b))<precision then return([i,b]),
        if f(a)*f(b)>0 then 
        error("Intervalo no adecuado"),
        i:nmaxiter,
        for k:1 thru nmaxiter do
            (
            c:(a+b)/2,print(c),
            if abs(b-a)<tolerancia then (i:k,return()),          
            if abs(f(c))<precision then (i:k,return()),
            if f(a)*f(c)<0 then b:c else a:c
            ),
[i,c]
)$

biseccion1(x^2-2,x,1.0,2.0,10^(-9),10^(-9),200);

biseccion1(x^2-2,x,-2.0,-1.0,10^(-9),10^(-9),200);

biseccion1(x^2-2,x,-2.0,2.0,10^(-9),10^(-9),200);

biseccion1(x^2-3,x,1.0,2.0,10^(-9),10^(-9),200);

biseccion1(x^2-4,x,1.0,2.0,10^(-9),10^(-9),200);

biseccion1(x^2-4,x,1.0,3.0,10^(-9),10^(-9),200);

biseccion1(x^2-4,x,2.0,3.0,10^(-9),10^(-9),200);

biseccion1(x^2-2,x,1.0,2.0,10^(-4),10^(-4),200);

bisecciont(expresion,var,extremo1,extremo2):=
    block(
        [a,b,c,k,i,x,tolerancia:10^(-8),
        precision:10^(-8),nmaxiter:200,tabla:[]],
        a:extremo1,
        b:extremo2,
        i:0,
        local(f),
        define(f(x),subst(x,var,expresion)),
        if abs(f(a))<precision then return([[a,0]]),
        if abs(f(b))<precision then return([[b,0]]),
        if f(a)*f(b)>0 then 
        error("Intervalo no adecuado"),
        i:nmaxiter,
        for k:1 thru nmaxiter do
            (
            c:(a+b)/2,
            tabla:endcons([c,0],tabla),
            if abs(b-a)<tolerancia then return(tabla),          
            if abs(f(c))<precision then return(tabla),
            if f(a)*f(c)<0 then b:c else a:c
            ),
tabla
)$

puntos:bisecciont(x^2-2,x,1.0,2.0);

wxplot2d([[discrete,puntos],x^2-2], [x,1.0,2.0],
[style,points,lines])$

bisecciontg(expresion,var,extremo1,extremo2):=
    block(
        [a,b,c,k,i,x,tolerancia:10^(-8),
        precision:10^(-8),nmaxiter:200,tabla:[]],
        a:extremo1,
        b:extremo2,
        i:0,
        local(f),
        define(f(x),subst(x,var,expresion)),
        if abs(f(a))<precision then return([[a,f(a)]]),
        if abs(f(b))<precision then return([[b,f(b)]]),
        if f(a)*f(b)>0 then 
        error("Intervalo no adecuado"),
        i:nmaxiter,
        for k:1 thru nmaxiter do
            (
            c:(a+b)/2,
            tabla:endcons([c,f(c)],tabla),
            if abs(b-a)<tolerancia then return(tabla),          
            if abs(f(c))<precision then return(tabla),
            if f(a)*f(c)<0 then b:c else a:c
            ),
tabla
)$

puntosg:bisecciontg(x^2-2,x,1.0,2.0);

wxplot2d([[discrete,puntosg],x^2-2], [x,1.0,2.0],
[style,points,lines])$

load(draw);

puntos;

draw2d(
       xaxis=true,
       xaxis_type=solid,
       xaxis_color=black,
       color=red,
       explicit(x^2-2,x,1,2),
       point_type=filled_circle,
       point_size=3,
       color=blue,
       points(puntos));

draw2d(
       xaxis=true,
       xaxis_type=solid,
       xaxis_color=black,
       color=red,
       explicit(x^2-2,x,1,2),
       point_type=filled_circle,
       point_size=3,
       color=blue,
       points([puntos[1]]));

with_slider_draw(k,[1,2,3,4,5,6,7,8,9],
       xaxis=true,
       xaxis_type=solid,
       xaxis_color=black,
       color=red,
       explicit(x^2-2,x,1,2),
       point_type=filled_circle,
       point_size=3,
       color=blue,
       points([puntos[k]]));
       );

length(puntos);

with_slider_draw(p,puntos,
       xaxis=true,
       xaxis_type=solid,
       xaxis_color=black,
       color=red,
       explicit(x^2-2,x,1,2),
       point_type=filled_circle,
       point_size=3,
       color=blue,
       points([p]));
       );

# Elija y resuelva al menos uno 
de los siguientes ejercicios 
propuestos

1. Realice una función de Maxima que calcule la solución a una ecuación 
   usando el método de Newton-Raphson. Dibuje la función y las sucesivas 
   aproximaciones.
2. Realice una colección de funciones de Maxima para estadística elemental: 
   dada una lista de datos, calcule la media, moda, mediana, desviación 
   típica, dibuje la nube de puntos, etc.
3. Realice una función de Maxima que dibuje los discos de Gershgorin 
   para una matriz dada:
   Teorema de los discos de Gershgorin: Los valores propios de una matriz 
   cuadrada A de orden n se encuentran en la unión de los n discos de 
   Gershgorin, cada uno de los cuales es un disco en el plano complejo
   cuyo centro es $a_{k,k}$, y su radio es 
   $\sum_{i=1, i\neq k}^n |a_{k,i}|$