CÓDIGO Método de la FALSA POSICIÓN en PYTHON


Hallar las raíces de ecuaciones algebraica y trascendentes usando el método de la falsa posición modificado código con  Python

MÉTODO DE LA FALSA POSICIÓN MODIFICADO

PASO 1: elija valores iniciales inferior $x_l$, y superior $x_u$, que encierren la raíz

PASO 2: Una aproximación de la raíz $x_r$, se determina mediante:
$x_r=x_u-\frac{f(x_u)(x_l-x_u)}{f(x_l)-f(x_u)}$

PASO 3: Realizar las siguientes evaluaciones para determinar en que subintervalo se encuentre la raíz:
  1.  Si $f(x_l)f(x_r)<0$, entonces la raíz se encuentra dentro del subintervalo inferior.haga $x_u=x_r$, y vuelva al paso 2
  2.  si $f(x_l)f(x_r)>0$,entonces la raíz se encuentra dentro del subintervalo superior, haga $x_l=x_r$, y vuelva al paso 2
  3. +si $f(x_l)f(x_r)=0$, la raíz es igual a $x_r$, termina el calculo
Los pasos del 1 al 3 es el método de la falsa posición no modificado.

En algunos casos conforme se avanza en las iteraciones , unos de los puntos limitantes del intervalo tiende a permanecer fijo(puede ocasionar mala convergencia).

Cuando uno de los limites del intervalo se estanca ,entonces se divide a la mitad el valor de la función en el punto de estancamiento. A este método se llama método de la falsa posición modificado

CODIGO

# -*- coding: utf-8 -*-
import sympy as sp
import numpy as np
import pandas as pd
x=sp.symbols('x')

def funcion(ecua='x+2'):
    global x
    return sp.sympify(ecua)
a=funcion()
def FalsaPosiModi(func,xl,xu,es):
    #definimos la raiz aproximada en 0
    global x
    ecuacion=funcion(func)
    ea=100 #Fff
    iu=0 #ff
    il=0 #FFF
    xr=0 #FFF
    iteracion=0 #contador de iteraciones
    #evaluamos la funciones
    fl=ecuacion.evalf(subs={x:xl})
    fu=ecuacion.evalf(subs={x:xu})
    #contenedores de datos
    m_itera=np.array([]) #matriz q almacena valores de itera
    m_xl=np.array([])   #matriz q alamacena valores de xl
    m_xu=np.array([])   #matriz q alamcena valores de xu
    m_xr=np.array([])   #matriz q almacena valroes de xr
    m_ea=np.array([])   #matriz q alamcena valore s de ea
    #iniciamos el bucle
    while ea>es:
        xa=xr
        xr=xu-fu*(xl-xu)/(fl-fu)
        fr=ecuacion.evalf(subs={x:xr})
        iteracion+=1
        if xr!= 0:
            ea=abs((xr-xa)/xr)*100
        test=fl*fr
        #agregamos valores a las matrices vacias
        m_itera=np.append(m_itera,iteracion)
        m_xl=np.append(m_xl,xl)
        m_xu=np.append(m_xu,xu)
        m_xr=np.append(m_xr,xr)
        m_ea=np.append(m_ea,ea)  
        if test<0: fu="ecuacion.evalf(subs={x:xu})" if="" il="" iu="0" xu="xr">=2:
                fl=fl/2
        elif test>0:
            xl=xr
            fl=ecuacion.evalf(subs={x:xl})
            il=0
            iu+=1
            if iu>=2:
                fu=fu/2
        else:
            ea=0
    #representamos datos en pandas
    iteracion=pd.Series(m_itera,name="Iteracion")
    xl=pd.Series(m_xl,name="xl")
    xu=pd.Series(m_xu,name="xu")
    xr=pd.Series(m_xr,name="xr")
    ea=pd.Series(m_ea,name="ea%")
    tabla=pd.concat([iteracion,xl,xu,xr,ea],axis=1) #unimos en columnas
    return tabla
        
a=FalsaPosiModi('x**10-1',0,1.3,10)           
print(a) 

RESULTADO

resultado-falsa-posición

se debe determinar si se han localizado todos las raíces posibles por lo general una gráfica de la función ayudara a realizar la tarea.

GRÁFICA

import matplotlib as mpl #importamos matplotlib y renombramos como mpl
#rcParams personalizar propiedades de la grafica 
mpl.rcParams['figure.dpi'] = 100 # puntos por pulgada
mpl.rcParams['text.usetex'] = True #permite usar Tex en nuestra grafica
mpl.rcParams['savefig.dpi'] = 150 #puntos por pulgada con lo que se guarda la grafica

import matplotlib.pyplot as plt #importamos pyplot y renombramos como plt
import numpy as np #importamos numpy y renombramos como np

x = np.linspace(0, 2, 200) # 200 numeros en el intervalo de 0 a 2

plt.plot(x,x**10-1)
plt.xlabel('x') #etiqueta del eje x
plt.ylabel('y') #etiqueta del eje y
plt.title('Grafica de $x^{10}-1$') #titulo de la grafica

plt.grid(True) #muestra la rejilla
plt.axis([0, 2, -2, 20]) # intervalos de los ejes de la grafica
plt.savefig("Ejemplo1.png") #guarda la grafica 
plt.show()#muestra la grafica
grafica-funcion

Comentarios

Publicar un comentario