Você está na página 1de 2

# -*- coding: utf-8 -*-

'''_____________________________________
UNIVERSIDAD NACIONAL DE HUANCAVELICA
ESCUELA PROFESIONAL DE ING. CIVIL
CATEDRA: MTODOS NUMRICOS
TEMA: SOLUCIN DE EDO - MTODO RK4
BACH. RICHARD OR CAYETANO

'''

#importamos las librerias q utilizaremos


import numpy as np
import matplotlib.pyplot as plt
from matplotlib import style
import math

# definiendo la ED dy/dx en funcin(x,y) para valores iniciales


def dydx(x, y):
return 4*math.e**(0.8*x)-0.5*y

# Solicion analitica de la ED enfuncin(x,y)


def solucion(x,y):
sol = (4/1.3)*(math.e**(0.8*x)-math.e**(-0.5*x))+2*math.e**(-0.5*x)
return sol
#valores iniciales Y'(Xo)=Yo , mientras xf representa hasta que valor se quiere evaluar numericament
n = 16 # Valor que se asume: a mayor valor de n mas iteraciones y mas preciso
x0 = 0 # valor inicial de Y'(Xo)=Yo
y0 = 2 # valor inicial de Y'(Xo)=Yo
xf = 4 # para un valor de Xf se obtiene un yf o solucion numerica: Y'(Xf)=Yf
h=(xf-x0)/n

#crear array para la los valores de "y" mediante solucion analitica


ysa=np.zeros(n)

#creamos lista que almacenaran las soluciones numericas de "yi" , obtenias a partir de "xi"
x = [x0]
y = [y0]

#iteramos por RK4 a patir de los valores iniciales x0,y0 la cantidad de n veces, para obtener las li

for i in range(n):
k1=h*dydx(x0,y0)
k2=h*dydx((x0+h/2),(y0+k1/2))
k3=h*dydx((x0+h/2),(y0+k2/2))
k4=h*dydx((x0+h),(y0+k3))
y0=y0+(k1+2*k2+2*k3+k4)/6
y0=y0
x0=x0+h
y.append(y0)
x.append(x0)

#iteramos en la funcion de la solucion analitica para obtener los valores de "y"=ysa, evaluados for
for i in range(n):
ysa[i]=solucion(x[i+1], y[i])

1
#debido a que "ysa" es un array lo transformamos a un lista en "sa"; ahora "sa" es una sa =[]
sa=[]
for i in ysa:
a=i
sa.append(a)

# "ysa" no evalua para el valor incial de Xo, entonces extraemos el 1er elemento de [y]
v=y.pop(0) # extraemos el 1er elemento de [y] y lo guardamos en "v"
y.insert(0,v) # insertamos el valor extraido v en [y] y no quede modificado, en su misma posicion

#insertamos el valor de "v" en la lista "sa" en la pocision inicial


sa.insert(0,v) #insertamos el valor extraido v en [y] y no quede modificado, en su misma posicion

#imprimimos listas creadas.


print('SOL_ANALITICA (Y)=', sa) #solucion analitica de y para cada valor de x
print('SOL_NUMERICA (Y)=',y) #solucion numerica de y para cada valor de x
print('EVALUADOS EN (X)=', x) #valores con los que se evaluara la solucion numerica y analitica
print('Y(xfn)=',y[-1]) #nos muestra la solucion numerico para un valor de xf: Y'(Xf)=Yf
print('Y(xfa)=',sa[-1]) #nos muestra la solucion analitica para un valor de xf: Y'(Xf)=Yf
print('n=', n+1) # numero de iteraciones
print('h=', h) # numero de iteraciones
#ploteamos solucin analtica y la solucin numrica
plt.plot(x,sa) #curva de solucion analitica
plt.scatter(x,y,color='red') #curva de solucion numerica