MÉTODO DE LA FALSA POSICIÓN MODIFICADO
PASO 1: elija valores iniciales inferior $x_l$, y superior $x_u$, que encierren la raízPASO 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)}$
- 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
- 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
- +si $f(x_l)f(x_r)=0$, la raíz es igual a $x_r$, termina el calculo
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) 0:>
RESULTADO
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
el codigo tiene un error donde esta la condicion if test<0:
ResponderBorrar