Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Presentado Por:
JOSE BISMER CARVAJAL 79249920
ALVARO JAVIER CELIS 1097332975
CURSO:
METODOS NUMERICOS
100401_48
Presentado a:
EDGAR ANDRES VILLABON
4𝑥1 + 𝑥2 − 𝑥3 = 3
𝑥1 + 6𝑥2 − 2𝑥3 + 𝑥4 − 𝑥5 = −6
𝑥2 + 5𝑥3 − 𝑥5 + 𝑥6 = −5
2𝑥2 + 5𝑥4 − 𝑥5 − 𝑥7 − 𝑥8 = 0
−𝑥3 − 𝑥4 + 6𝑥5 − 𝑥6 − 𝑥8 = 12
−𝑥3 − 𝑥5 + 5𝑥6 = −12
−𝑥4 + 4𝑥7 − 𝑥8 = −2
−𝑥4 − 𝑥5 − 𝑥7 + 5𝑥8 = 2
Resolver los Sistema de Ecuaciones Lineales por los siguientes metodos :
Gauss – Seidel
Jacobi
S.O.R.
Funciones generales
FUNCIÓN TRUNCADO
plt.plot(iterar,iterar*0,'r.') #eje de x
plt.plot(iterar, vector_1,'y', label = nombre_1) #graficamos el vector ingresado
plt.plot(iterar, vector_2,'b', label = nombre_2)
plt.plot(iterar, vector_3,'r', label = nombre_3)
plt.legend()
In [26]: a = []
b = []
# incicia en cero
inicio = [0, 0, 0, 0, 0, 0, 0, 0]
#matriz del sistema de ecuaciones
a = [[4, 1, -1, 0, 0, 0, 0, 0],[1, 6, -2, 1, -1, 0, 0, 0],[0, 1, 5, 0, -1, 1, 0, 0],[0, 2, 0, 5, -1, 0, -1, -1],
[0, 0, -1, -1, 6, -1, 0, -1],[0, 0, -1, 0, -1, 5, 0, 0],[0, 0, 0, -1, 0, 0, 4, -1],[0, 0, 0, -1, -1, 0, -1, 5] ]
# los terminos independientes lo guardamos en 'b'
b = [3, -6, -5, 0, 12, -12 ,-2 ,2]
METODO DE GAUSS-SEIDEL
4𝑥1 + 𝑥2 − 𝑥3 = 3
𝑥1 + 6𝑥2 − 2𝑥3 + 𝑥4 − 𝑥5 = −6
𝑥2 + 5𝑥3 − 𝑥5 + 𝑥6 = −5
2𝑥2 + 5𝑥4 − 𝑥5 − 𝑥7 − 𝑥8 = 0
−𝑥3 − 𝑥4 + 6𝑥5 − 𝑥6 − 𝑥8 = 12
−𝑥3 − 𝑥5 + 5𝑥6 = −12
−𝑥4 + 4𝑥7 − 𝑥8 = −2
localhost:8888/notebooks/Documents/D_segundo trabajo jupyter - copia/G%23%23_nombreEstudiante_Ej1A.ipynb 1/12
23/10/2020 G##_nombreEstudiante_Ej1A - Jupyter Notebook
−𝑥4 − 𝑥5 − 𝑥7 + 5𝑥8 = 2
Si la diagonal de la matriz no es 0, podemos despejar el sistema de ecuaciones para cada incognita de la siguiente forma:
𝑥1 = (3 − 𝑥42 + 𝑥3 )
𝑥2 = (−6 − 𝑥1 + 2𝑥63 + −𝑥4 + 𝑋5 )
𝑥3 = (−5 − 𝑥2 +5 𝑥5 − 𝑥6 )
𝑥4 = (−𝑥2 + 𝑥5 5+ 𝑥7 + 𝑋8 )
𝑥5 = (12 + 𝑋3 + 𝑥64 + 𝑥6 + 𝑥8 )
𝑥6 = (−12 + 5𝑥3 + 𝑥5 )
𝑥7 = (−2 + 𝑥44 + 𝑥8 )
𝑥8 = (2 + 𝑋4 +5𝑋5 + 𝑥7 )
los valores que no se conocen se reemplaza por cero y los nuevos toman valores anteriores de los puntos, como por ejemplo en la siguiente ecuación:
Iteracion cero:
𝑥1 = (3 − 04 + 0) = 0.750000
𝑥2 = (−6 − (−0.750000) + 0 − 0 + 0) = −1.125000
6 + 0 − 0)
𝑥3 = (−5 − (−1.125000) = −0.775000
5
𝑥4 = (−(−1.125000)5 + 0 + 0 + 0) = 0.450000
𝑥5 = (12 + −0.775000 +6 0.450000 + 0 + 0) = 1.945833
𝑥6 = (−12 + −0.775000 + 1.945833) = −2.165833
5 + 0)
𝑥7 = (−2 + 0.450000 = −0.387500
4
𝑥8 = (2 + 0.450000 + 1.945833
5
− 0.387500) = 0.801667
FUNCIÓN DEL METODO GAUSS-SEIDEL
# convergencia
for j in range(n):
dominio = 0.0
for i in range(j+1, n):
if j != i:
dominio += math.fabs(a[i][j])
if A[i][i] < dominio:
exit('No converge la matriz ')
for k in range(iteracion+1):
Out[27]:
x1 x2 x3 x4 x5 x6 x7 x8
Out[133]:
Error x_1 Error x_2 Error x_3 Error x_4 Error x_5 Error x_6 Error x_7 Error x_8
METODO JACOBI
4𝑥1 + 𝑥2 − 𝑥3 = 3
𝑥1 + 6𝑥2 − 2𝑥3 + 𝑥4 − 𝑥5 = −6
𝑥2 + 5𝑥3 − 𝑥5 + 𝑥6 = −5
2𝑥2 + 5𝑥4 − 𝑥5 − 𝑥7 − 𝑥8 = 0
−𝑥3 − 𝑥4 + 6𝑥5 − 𝑥6 − 𝑥8 = 12
−𝑥3 − 𝑥5 + 5𝑥6 = −12
−𝑥4 + 4𝑥7 − 𝑥8 = −2
−𝑥4 − 𝑥5 − 𝑥7 + 5𝑥8 = 2
Si la diagonal de la matriz no es cero, podemos despejar el sistema de ecuaciones de la siguiente forma:
𝑥1 = (3 − 𝑥42 + 𝑥3 )
𝑥2 = (−6 − 𝑥1 + 2𝑥63 + −𝑥4 + 𝑋5 )
𝑥3 = (−5 − 𝑥2 +5 𝑥5 − 𝑥6 )
𝑥4 = (−𝑥2 + 𝑥5 5+ 𝑥7 + 𝑋8 )
𝑥5 = (12 + 𝑋3 + 𝑥64 + 𝑥6 + 𝑥8 )
𝑥6 = (−12 + 5𝑥3 + 𝑥5 )
𝑥7 = (−2 + 𝑥44 + 𝑥8 )
𝑥8 = (2 + 𝑋4 +5𝑋5 + 𝑥7 )
los valores desconocidos inician en cero y para la siguiente iteracion se utilizan los datos de la iteracion anterior:
𝑥1 = (3 − 04 + 0) = 0.750000
𝑥2 = (−6 − 0 + 206 + −0 + 0) = −1.000000
𝑥3 = (−5 − 05+ 0 − 0) = −1.000000
𝑥4 = (−0 + 05+ 0 + 0) = 0
𝑥5 = (12 + 0 +60 + 0 + 0) = 2.000000
𝑥6 = (−12 +5 0 + 0) = −2.400000
𝑥7 = (−2 +40 + 0) = −0.500000
𝑥8 = (2 + 𝑋4 5+ 0 + 0) = 0.400000
segunda iteracion:
matriz = np.zeros((iteracion+1,7+1))
temp=np.zeros(8)
n = len(a)
# convergencia
for j in range(n):
dominio = 0.0
for i in range(j+1, n):
if j != i:
dominio += math.fabs(a[i][j])
if A[i][i] < dominio:
exit('No converge la matriz ')
for k in range(iteracion+1):
for j in range(n):
# se guarda la b[j] en una variable temporal
temporal = truncar(b[j],trunca)
for i in range(trunca):
if(j != i):
temporal-=A[j][i] * x[i]
temporal=truncar(temporal, trunca)
temp[j] =truncar( temporal / A[j][j],trunca)
x=temp
matriz[:][k]=x
return matriz
Out[39]:
x1 x2 x3 x4 x5 x6 x7 x8
Out[41]:
Error x1 Error x2 Error x3 Error x4 Error x5 Error x6 Error x7 Error x8
METODO S.O.R
𝑤 𝑖−1 𝑛
𝑋𝑖 (𝑘) = 𝐴𝑖𝑖 [𝑏𝑖 − ∑ 𝐴𝑖𝑗 𝑥𝑗 (𝑘) − ∑ 𝐴𝑖𝑗 𝑥𝑗 (𝑘−1) ] + (1 − 𝑤)𝑥𝑖 (𝑘−1)
𝑗=1 𝑗=𝑖+1
Donde:
Calcula la solucion de un sistema de ecuaciones usando un parametro de relajacion w, que varia de [0,2].
n = len(A)
anterior = [0.0]*n
# convergencia
for j in range(n):
dominio = 0.0
for i in range(j+1, n):
if j != i:
dominio += math.fabs(a[i][j])
if A[i][i] < dominio:
exit('No converge la matriz ')
# Para garantizar que los elementos de la diagonal principal sean distintos de cero
for i in range(n):
if A[i][i] == 0:
exit('A[i][i] deben ser distinto de cero')
TABLA DE SOLUCIONES VS EL NUMERO DE ITERACIONES DE CADA VARIABLE 'X' DEL METODO 𝑆.𝑂.𝑅
In [80]: import pandas
iteracion=12
solucion_sor = sor(a, b, iteracion, w=1)
nombres=['x1','x2','x3','x4','x5','x6','x7','x8']
pandas.DataFrame(solucion_sor,range(iteracion+1),nombres)
Out[80]:
x1 x2 x3 x4 x5 x6 x7 x8
Out[132]:
Error x_1 Error x_2 Error x_3 Error x_4 Error x_5 Error x_6 Error x_7 Error x_8
In [87]: iteracion=12
import numpy as ss
import math
vector_x1_seidel=ss.zeros((iteracion+1))
vector_x2_seidel=ss.zeros((iteracion+1))
vector_x3_seidel=ss.zeros((iteracion+1))
vector_x4_seidel=ss.zeros((iteracion+1))
vector_x5_seidel=ss.zeros((iteracion+1))
vector_x6_seidel=ss.zeros((iteracion+1))
vector_x7_seidel=ss.zeros((iteracion+1))
vector_x8_seidel=ss.zeros((iteracion+1))
vector_x1_jacobi=ss.zeros((iteracion+1))
vector_x2_jacobi=ss.zeros((iteracion+1))
vector_x3_jacobi=ss.zeros((iteracion+1))
vector_x4_jacobi=ss.zeros((iteracion+1))
vector_x5_jacobi=ss.zeros((iteracion+1))
vector_x6_jacobi=ss.zeros((iteracion+1))
vector_x7_jacobi=ss.zeros((iteracion+1))
vector_x8_jacobi=ss.zeros((iteracion+1))
vector_x1_sor=ss.zeros((iteracion+1))
vector_x2_sor=ss.zeros((iteracion+1))
vector_x3_sor=ss.zeros((iteracion+1))
vector_x4_sor=ss.zeros((iteracion+1))
vector_x5_sor=ss.zeros((iteracion+1))
vector_x6_sor=ss.zeros((iteracion+1))
vector_x7_sor=ss.zeros((iteracion+1))
vector_x8_sor=ss.zeros((iteracion+1))
for j in range(iteracion+1):
vector_x1_seidel[j]=error_seidel[j][0]
vector_x2_seidel[j]=error_seidel[j][1]
vector_x3_seidel[j]=error_seidel[j][2]
vector_x4_seidel[j]=error_seidel[j][3]
vector_x5_seidel[j]=error_seidel[j][4]
vector_x6_seidel[j]=error_seidel[j][5]
vector_x7_seidel[j]=error_seidel[j][6]
vector_x8_seidel[j]=error_seidel[j][7]
for j in range(iteracion+1):
vector_x1_jacobi[j]=error_jacobi[j][0]
vector_x2_jacobi[j]=error_jacobi[j][1]
vector_x3_jacobi[j]=error_jacobi[j][2]
vector_x4_jacobi[j]=error_jacobi[j][3]
vector_x5_jacobi[j]=error_jacobi[j][4]
vector_x6_jacobi[j]=error_jacobi[j][5]
vector_x7_jacobi[j]=error_jacobi[j][6]
vector_x8_jacobi[j]=error_jacobi[j][7]
In [114]:
graficar_individual(vector_x1_seidel,'b','error_SEIDEL','ERROR ABSOLUTO PARA X1') #se grafica el error para cada 'n' distinto
graficar_individual(vector_x1_jacobi,'y','error_JACOBI','ERROR ABSOLUTO PARA X1') #se grafica el error para cada 'n' distinto
graficar_individual(vector_x1_sor,'g','error_S.O.R','ERROR ABSOLUTO PARA X1') #se grafica el error para cada 'n' distinto
In [115]:
graficar_individual(vector_x2_seidel,'b','error_SEIDEL','ERROR ABSOLUTO PARA X2') #se grafica el error para cada 'n' distinto
graficar_individual(vector_x2_jacobi,'y','error_JACOBI','ERROR ABSOLUTO PARA X2') #se grafica el error para cada 'n' distinto
graficar_individual(vector_x2_sor,'g','error_S.O.R','ERROR ABSOLUTO PARA X2') #se grafica el error para cada 'n' distinto
In [118]:
graficar_individual(vector_x3_seidel,'b','error_SEIDEL','ERROR ABSOLUTO PARA X3') #se grafica el error para cada 'n' distinto
graficar_individual(vector_x3_jacobi,'y','error_JACOBI','ERROR ABSOLUTO PARA X3') #se grafica el error para cada 'n' distinto
graficar_individual(vector_x3_sor,'g','error_S.O.R','ERROR ABSOLUTO PARA X3') #se grafica el error para cada 'n' distinto
In [122]:
graficar_individual(vector_x4_seidel,'b','error_SEIDEL','ERROR ABSOLUTO PARA X4') #se grafica el error para cada 'n' distinto
graficar_individual(vector_x4_jacobi,'y','error_JACOBI','ERROR ABSOLUTO PARA X4') #se grafica el error para cada 'n' distinto
graficar_individual(vector_x4_sor,'g','error_S.O.R','ERROR ABSOLUTO PARA X4') #se grafica el error para cada 'n' distinto
In [123]:
graficar_individual(vector_x5_seidel,'b','error_SEIDEL','ERROR ABSOLUTO PARA X5') #se grafica el error para cada 'n' distinto
graficar_individual(vector_x5_jacobi,'y','error_JACOBI','ERROR ABSOLUTO PARA X5') #se grafica el error para cada 'n' distinto
graficar_individual(vector_x5_sor,'g','error_S.O.R','ERROR ABSOLUTO PARA X5') #se grafica el error para cada 'n' distinto
In [125]:
graficar_individual(vector_x6_seidel,'b','error_SEIDEL','ERROR ABSOLUTO PARA X6') #se grafica el error para cada 'n' distinto
graficar_individual(vector_x6_jacobi,'y','error_JACOBI','ERROR ABSOLUTO PARA X6') #se grafica el error para cada 'n' distinto
graficar_individual(vector_x6_sor,'g','error_S.O.R','ERROR ABSOLUTO PARA X6') #se grafica el error para cada 'n' distinto
In [127]:
graficar_individual(vector_x7_seidel,'b','error_SEIDEL','ERROR ABSOLUTO PARA X7') #se grafica el error para cada 'n' distinto
graficar_individual(vector_x7_jacobi,'y','error_JACOBI','ERROR ABSOLUTO PARA X7') #se grafica el error para cada 'n' distinto
graficar_individual(vector_x7_sor,'g','error_S.O.R','ERROR ABSOLUTO PARA X7') #se grafica el error para cada 'n' distinto
In [129]:
graficar_individual(vector_x8_seidel,'b','error_SEIDEL','ERROR ABSOLUTO PARA X7') #se grafica el error para cada 'n' distinto
graficar_individual(vector_x8_jacobi,'y','error_JACOBI','ERROR ABSOLUTO PARA X7') #se grafica el error para cada 'n' distinto
graficar_individual(vector_x8_sor,'g','error_S.O.R','ERROR ABSOLUTO PARA X7') #se grafica el error para cada 'n' distinto
Concluciones y observaciones:
Del comportamiento de las graficas en las 12 iteraciones se concluye que el metodo Seidel se acerca un poco mejor que el Jacobi, el meotodo S.O.R. se acercó mejor que
los metodos anteriores, en cuanto al metodo Gauss-Geidel y Jacobi a pesar de tener pequeños cambios presenta diferencias en la presicion de sus valores, convergen a
cero a medida que aumentamos el numero de iteraciones, las diferencias de los metodos son notables en la comparacion de las ultimas incognitas del sitemas de
ecuaciones, la exactitud del metodo S.O.R. depende del valor del parametro de relajacion 'w'.
Referencia bibliografica:
Canale, R. P. y P. Canale, R. (2007). Métodos numéricos para ingenieros (5a. ed.). México D.F, México: McGraw-Hill Interamericana. (pp. 451 – 477).
In [ ]:
La regresión lineal se enfrasca la relación estadística entre dos variables continuas llamadas variables de predicción y respuesta.
𝑋
𝑌
La variable predictora se puede encontrar como o como variable independiente.
La variable de respuesta se puede encontrar como o variable dependiente.
Ecuacion
𝑦(𝑥) = 𝑎1 𝑥 + 𝑎0 + 𝑒
Donde:
𝑎𝑎0 eses ella punto de intercepcion con el eje Y.
1
𝑒 es el error (aleatorio).
pendiente.
Mediante los datos se va calcular los coficientes tanto como el error estandar.
x 1 2 3 4 5 6 7 8 9
y 1 1.5 2 3 4 5 8 10 13
FUNCIÓN TRUNCAR
PARA REALIZAR LA REGRESIÓN LINEAL ES NECESARIO HALLAR LAS SIGUIENTES SUMATORIAS DE LOS DATOS:
El siguiente codigo realiza las anteriores sumatorias pero de una manera en que se pueda apreciar el procedimiento mediante la tabulación de cada dato.
x=[1, 2, 3, 4, 5, 6, 7, 8, 9]
y=[1, 1.5, 2, 3, 4, 5, 8, 10, 13]
n = len(x)
# valores iniciales
matriz_1 = np.zeros((n+1,4))
sum_x=0
sum_y=0
sum_xy=0
sum_xx=0
for j in range(0,n):
matriz_1[j][0]=x[j]
matriz_1[j][1]=y[j]
matriz_1[j][2]=x[j]*y[j]
matriz_1[j][3]=x[j]**2
sum_x+=x[j]
sum_y+=y[j]
sum_xy+=x[j]*y[j]
sum_xx+=x[j]**2
matriz_1[n][0]=sum_x
matriz_1[n][1]=sum_y
matriz_1[n][2]=sum_xy
matriz_1[n][3]=sum_xx
# para tabular
name=[0,1,2,3,4,5,6,7,8,'suma'] #name igual tamaño que los vectores 'x' y 'y'
nombres=['x[ i ]','y[ i ]','x[ i ]*y[ i ]','x[ i ]**2']
pandas.DataFrame(matriz_1,name,nombres)
Out[60]:
x[ i ] y[ i ] x[ i ]*y[ i ] x[ i ]**2
De la tabla se obtienen los valores de la sumatoria para despues halla los coeficientes:
x[ i ] y[ i ] x[ i ]*y[ i ] x[ i ]^2
x[ i ] y[ i ] x[ i ]*y[ i ] x[ i ]^2
∑ 𝑥𝑖 = 45
∑ 𝑦𝑖 = 47.5
∑(𝑥𝑖𝑦𝑖 ) = 325
∑ 𝑥𝑖2 = 285
Ahora se reemplazan los valores anteriores de la sumatoria dentro de las siguientes ecuaciones para los coeficientes.
𝑛∑(𝑥 𝑦 ) − ∑ 𝑥 ∑ 𝑦
𝑎1 = 𝑛∑ 𝑥𝑖 2 − (∑ 𝑥𝑖 )2 𝑖
𝑖 𝑖 𝑖
∑𝑦 𝑎
𝑎0 = 𝑛 − 𝑛 𝑖
𝑖 1 ∑ 𝑥
𝑎1 = 9(325)−(45)(47.5)
9(285)−(45)2 = (2925)−(2137.5) = 1.145833
(2565)−(2025)
𝑎0 = 47.59 − 1.145833( 459 ) = −2.013887
# Estado inicial
matriz_2 = np.zeros((n+1,4))
sumx=0
sumy=0
sumxy=0
sumxx=0
for i in range(0,n):
matriz_2[i][0]=x[i]
matriz_2[i][1]=y[i]
matriz_2[i][2]=x[i]*y[i]
matriz_2[i][3]=x[i]**2
sumx+=x[i]
sumy+=y[i]
sumxy+=x[i]*y[i]
sumxx+=x[i]**2
matriz_2[n][0]=sumx
matriz_2[n][1]=sumy
matriz_2[n][2]=sumxy
matriz_2[n][3]=sumxx
promedio_y=truncar(sumy/n,6) #promedio de Y
promedio_x=truncar(sumx/n,6) #promedio de x
a1=truncar((n*sumxy-sumx*sumy)/(n*sumxx-sumx**2),6) #coeficiente a1
a0=truncar(promedio_y-a1*promedio_x,6) #coeficiente a2
coeficiente=[]
ecua=a1*xx+a0
ecua_print=np.str(ecua)
print(ecua_print)
coeficiente=[a1,a0]
pandas.DataFrame([coeficiente],[ecua_print],['a1','a0'])
1.458333*xx - 2.013888
Out[59]:
a1 a0
Y(x)=1.458333*x - 2.013888
El error del ajuste lineal se calcula por medio de las siguientes dos ecuaciones.
𝑆𝑟 = ∑(𝑦𝑖 − 𝑎0 − 𝑎1 𝑥𝑖 )2
localhost:8888/notebooks/Documents/D_segundo trabajo jupyter - copia/G%23%23_nombreEstudiante_Ej2A.ipynb#Ecuacion-lineal-resultante: 3/4
23/10/2020
⎯⎯⎯⎯⎯⎯⎯⎯⎯
𝑆 ⎯
G##_nombreEstudiante_Ej2A - Jupyter Notebook
𝑠 𝑦𝑥 = √ 𝑛 −𝑟 2
Mediante una tabla se aprecia el error aletorior de cada punto.
Out[50]:
1 2 3 4 5 6 7 8 9
𝑎 0−𝑎 1*𝑥[ 𝑖 ] -0.555555 0.902778 2.361111 3.819444 5.277777 6.736110 8.194443 9.652776 11.111109
sr[ i ] 2.419751 0.356674 0.130401 0.671488 1.632714 3.014078 0.037808 0.120565 3.567909
0 1 2 3 4 5 6 7 8 9
sr[ i ] 2.419751 0.356674 0.130401 0.671488 1.632714 3.014078 0.037808 0.120565 3.567909
sr= 11.951388
s y/x= 1.306652
Out[58]:
sr s y/x
⎯(11.951388)
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
𝑠 𝑦𝑥 = √ (9 − 2) = 1.306652
CONCLUSIONES:
La dispersión de los datos fue evidente al agraficar los puntos y la ecuacion por esta razon el error presentó valores relativamente alto, la funcion resultante se ajusto de exelente manera a los puntos dispersos.
La regresión lineal es un exelente metodo para ajustar linealmente los datos de un conjunto de puntos dispersos. pero se debe saber con anticipacion que es lineal, no puede utilizar si al inspeccionar los datos de forma
visual encontramos una ubicacion de los puntos aparentemente aleatoria.
BIBLIOGRAFIA REFERENTE :
Canale, R. P. y P. Canale, R. (2007). Regresíon lineal, Métodos numéricos para ingenieros (5a. ed.). México D.F, México: McGraw-Hill Interamericana. (pp. 465 –
476).
In [ ]:
Ejercicio 3: Interpolación
𝑥 1 2 3 4 5 6 8 9 10 11
𝑦 1.36788 0.63534 0.38312 0.26832 0.20674 1.36788 0.38312 0.26832 0.20674 0.09093
Econtrar el juste a un polinomio de interpolación con los datos dados, empleando cada uno de los siguientes métodos:
Newton
Lagrange
Trazadores cúbicos
𝑥 1 2 3 4 5 6 8 9 10 11
𝑦 1.36788 0.63534 0.38312 0.26832 0.20674 1.36788 0.38312 0.26832 0.20674 0.09093
PASO 1:
Mediante esta tabla se aprecia de clara manera como funcionan las diferencias divididas que son necesarias para el metodo de interpolación de Newton. Esta diagonal que desciende son los valores que se necesitan para
resolver el siguiente paso:
Cada nueva columna utiliza los dos valores anteriores mas cercanos para hallar la pendiente entre puntos, mientras mas puntos mayor será la cantidad de terminos de la ecuacion general del metodo.
PASO 2:
Se guarda la diagona del matriz en un nuevo vector que será utilizado en la ecuacion general:
𝐹[𝑥0 ] = 𝑏0 = 𝐷0,0
𝐹[𝑥0 , 𝑥1 ] = 𝑏1 = 𝐷1,1
𝐹[𝑥0 , 𝑥1 , 𝑥2 ] = 𝑏2 = 𝐷2,2
𝐹[𝑥0 , 𝑥1 , 𝑥2 , 𝑥3 ] = 𝑏3 = 𝐷3,3
.
.
.
𝐹[𝑥0 , 𝑥1 , 𝑥2 , 𝑥3 ...., 𝑥𝑛 ] = 𝑏𝑛−1 = 𝐷𝑛−1,𝑛−1
TERCER PASO:
Tomando los puntos (𝑥0 , 𝑦0 )(𝑥1 , 𝑦1 )(𝑥2 , 𝑦2 )(𝑥3 , 𝑦3 ), se obtienen 4 terminos en fucion de la variable [x] comprendida entre los puntos 𝑥0 y 𝑥3 :
𝑓(7) = 𝑏00 + 𝑏1 (7 − 𝑥1 ) + 𝑏2 (7 − 𝑥2 )(7 − 𝑥1 ) + 𝑏3 (7 − 𝑥3 )(7 − 𝑥2 )(7 − 𝑥1 )
n = len(x)
vector = np.zeros((n))
matriz = [0.0] * n
for i in range(n):
matriz[i] = [0.0] * n
for i in range(n):
vector[i]=x[i]
matriz[i][0]=y[i]
for i in range(1,n):
for j in range(i,n):
matriz[j][i] = truncar(( (matriz[j][i-1]-matriz[j-1][i-1]) / (vector[j]-vector[j-i])),8)
rango=range(len(x))
Out[279]:
f(xi) Primera dif Segunda dif Tercera dif Cuarta dif Quinta dif Sexta dif Septima dif Octava dif Novena dif
0 1.36788 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
1 0.63534 -0.73254 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
2 0.38312 -0.25222 0.240160 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
3 0.26832 -0.11480 0.068710 -0.057150 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
4 0.20674 -0.06158 0.026610 -0.014033 0.010779 0.000000 0.000000 0.000000 0.000000 0.000000
5 1.36788 1.16114 0.611360 0.194917 0.052237 0.008292 0.000000 0.000000 0.000000 0.000000
6 0.38312 -0.49238 -0.551173 -0.290633 -0.097110 -0.024891 -0.004740 0.000000 0.000000 0.000000
7 0.26832 -0.11480 0.125860 0.169258 0.091978 0.031515 0.008058 0.001600 0.000000 0.000000
8 0.20674 -0.06158 0.026610 -0.024813 -0.038814 -0.021799 -0.007616 -0.001959 -0.000395 0.000000
9 0.09093 -0.11581 -0.027115 -0.017908 0.001381 0.006699 0.004071 0.001461 0.000380 0.000078
La siguiente funcion resuleve la ecuacion general mediante la diagonal de la matriz y reemplaza el punto dentro de la funcion polinomial.
In [282]:
def interpol_lineal(matriz,x,evaluar):
n = len(x)
aproximar = 0
multipli = 1.0
for i in range(n):
multipli = matriz[i][i]
for j in range(1,i+1):
multipli *=evaluar - x[j-1]
aproximar += multipli
aproximar=truncar(aproximar,6)
print('f(',evaluar,')=',aproximar)
return aproximar
Llamamos la funcion y se le asignan los valores previamente hallados evaluados en el punto x=7.
f( 7 )= 1.700541
Out[284]: 1.700541
f( 7 )= 1.700541
Consiste en encontrar un polinomio de grado n cuya función pase por cada uno de los puntos dados.
𝑥 1 2 3 4 5 6 8 9 10 11
𝑦 1.36788 0.63534 0.38312 0.26832 0.20674 1.36788 0.38312 0.26832 0.20674 0.09093
𝑛
∑ 𝑓(𝑥𝑛 )𝐿(𝑥,𝑛,𝑖)
𝐢=0
Dónde:
𝐹 (𝑥) = ∑ [(𝑦𝑛 ) ∙ ∏ ((𝑋𝑥𝑛 −− 𝑥𝑥𝑘𝑘)) ] =(2) 𝑥 − 3𝑥2 + 2 + (4) (−𝑥 1+ 2𝑥) + (6) 𝑥 2− 𝑥 = 2(𝑥 + 1)
𝑛 𝑛 2 2 2
𝐢=0 𝐤=0
FUNCION POLINOMIO DE LAGRANGE
La siguiente función calcula la expresión polinomica demas de evaluar un punto dentro del la expresion polinomica.
In [324]: print('f(',7,')=',float(pol_lagrange(x,y,7)))
f( 7 )= 1.700525
f( 7 )= 1.700525
TRAZADORES CUBICOS
Los trazadores cúbicos tienen como objetivo es econtrar un polinomio de tercer grado para cada intervalo entre nodos:
𝑓𝑖(𝑥) = 𝑎𝑖 𝑥3 + 𝑏𝑖 𝑥2 + 𝑐𝑖 𝑥 + 𝑑𝑖
Así, para n + 1 datos (i = 0, 1, 2,..., n), existen n intervalos y, en consecuencia, 4n incógnitas a evaluar. Como con los trazadores cuadráticos, se requieren 4n condiciones para evaluar las incógnitas. Éstas son:
1. Los valores de la función deben ser iguales en los nodos interiores (2n – 2 condiciones).
2. La primera y última función deben pasar a través de los puntos extremos (2 condiciones).
3. Las primeras derivadas en los nodos interiores deben ser iguales (n – 1 condiciones).
4. Las segundas derivadas en los nodos interiores deben ser iguales (n – 1 condiciones).
5. Las segundas derivadas en los nodos extremos son cero (2 condiciones).
(P. Canale,2007,p.532)
𝑥 1 2 3 4 5 6 8 9 10 11
localhost:8888/notebooks/Documents/D_segundo trabajo jupyter - copia/G%23%23_nombreEstudiante_Ej3A.ipynb 3/6
24/10/2020 G##_nombreEstudiante_Ej3A - Jupyter Notebook
𝑥 1 2 3 4 5 6 8 9 10 11
𝑦 1.36788 0.63534 0.38312 0.26832 0.20674 1.36788 0.38312 0.26832 0.20674 0.09093
PASO 1:
Tenemos el siguiente sistema de ecuacion que depende de las posiciones de los vectores de y 𝑌 𝑋
... Para entender mejor el proceso debemos cambiar las incognitas que en este caso seria la segunda derivada de la
ecuacion del tramo 𝑓 "𝑖 (𝑥𝑖−1 ) 𝑓 "𝑖 (𝑥𝑖 ) 𝑓 "𝑖 (𝑥𝑖+1 )
, , cambiarlas a valores de , , 𝑘𝑖−1 𝑘𝑖 𝑘𝑖+1
e igualar el resultado al termino independiente . 𝑏𝑗
(𝑥𝑖 − 𝑥𝑖−1 )𝑓 " (𝑥𝑖−1 ) + (𝑥𝑖+1 − 𝑥𝑖−1 )𝑓 " (𝑥𝑖 ) + (𝑥𝑖+1 − 𝑥𝑖 )𝑓 " (𝑥𝑖+1 ) = 𝑥𝑖+16− 𝑥𝑖 [𝑦𝑖+1 − 𝑦𝑖 ] + 𝑥𝑖 −6𝑥𝑖−1 [𝑦𝑖−1 − 𝑦𝑖 ]
(𝑥𝑖 − 𝑥𝑖−1 )𝑘𝑖−1 + (𝑥𝑖+1 − 𝑥𝑖−1 )𝑘𝑖 + (𝑥𝑖+1 − 𝑥𝑖 )𝑘𝑖+1 = 𝑏𝑗
PASO 2:
Guardar el sistema de ecuaciones en una matriz 𝐴𝑗𝑖 y los terminos independientes en el vector 𝑏𝑗 .
𝐴𝑗𝑖 = (𝑥𝑖 − 𝑥𝑖−1 )𝑘𝑖−1 + (𝑥𝑖+1 − 𝑥𝑖−1 )𝑘𝑖 + (𝑥𝑖+1 − 𝑥𝑖 )𝑘𝑖+1
𝑏𝑗 = 𝑥𝑖+16− 𝑥𝑖 [𝑦𝑖+1 − 𝑦𝑖 ] + 𝑥𝑖 −6𝑥𝑖−1 [𝑦𝑖−1 − 𝑦𝑖 ]
PASO 3:
Se resuelve el sitemas de ecuaciones por medio de Gauss-Jordan o cualquier otro metodo, dando como resultadoles los valores de 𝑘𝑖 .
A: es una matriz cuadrada de dimeción (n-2)
𝐴∗𝑘=𝑏
PASO 4:
Una vez resuelto el sistema de ecuaciones, seran utilizados en las siguientes formulas que daran como resultado la función polinomica de tercer grado entre los puntos.
las segundas revidas de los extremos son cero y no entran en el sitema de ecuaciones.
𝑓 " (𝑥0 ) = 𝑘0 = 0
𝑓 " (𝑥𝑛−1 ) = 𝑘𝑛−1 = 0
CODIGO DEL METODO DE TRASADORES CUBICOS
Se halla la matriz 𝑓𝑖𝑗 y el vector 𝑏𝑗 que almacenan todo el sistema de ecuaciones, una vez resuelto se hallan las distintas funciones polinomicas para cada tramo guardandola en 𝑓𝑢𝑛𝑖 .
#metodo
for i in range(2,n-1):
f[i-1][i-1-1]=x[i]-x[i-1]
f[i-1][i-1]=2*(x[i+1]-x[i-1])
if i!=n-2:
f[i-1][i]=x[i+1]-x[i]
b[i-1]=6*(y[i+1]-y[i])/(x[i+1]-x[i])+6*(y[i-1]-y[i])/(x[i]-x[i-1])
for i in range(1,n-1):
#condicion final
if i!=1:
condition=sol[i-1-1]
if i==1:
condition=0
Out[186]:
f"(x1) f"(x2) f"(x3) f"(x4) f"(x5) f"(x6) f"(x7) f"(x8)
In [194]: print(b)
Out[187]:
C_1 C_2 C_3 C_4
In [197]: print(sol)
In [196]: fun
Mediante la ecuacion anterior se pude hallar cualquier punto dentro de los limites del vector "x" y tambien se muestra la funcion que corresponde al tramo del punto.
In [327]: print('f(',7,')=',evaluar_sistm_ecuaciones(x,fun,7))
j= 6
0.313119*xx**3 - 6.889416*xx**2 + 49.617831*xx - 115.953836
f( 7 )= 1.748799
f( 7 )= 1.748799
TABLA COMPARATIVA
OBSERVACIONES Y CONCLUCIONES:
El metodo de polinomios de Lagrange es el más sencillo de programar y ofrece valores muy similares al metodo de interpolacion de newton, la mejora es que este metodo no requiere del cálculo ni del almacenamiento
que newton maneja.
La interpolación de Newton en diferencias divididas funciona de forma excelente en lo casos donde se sabe el grado de dicho polinomio.
El metodo de trazadores cubicos utiliza polinomios de tercer grado en cada tramo, ese ajuste suaviza el valor de sus puntos entre la unión. Este metodo es menos propenso a oscilaciones devido a que esta limitados por
polinomios de tercer grado, considero este metodo el más acertado de los tres pero utiliza mas recursos que los anteriores metodos.
REFERENTE BIBLIOGRAFICO:
•Canale, R. P. y P. Canale, R. (2007). Métodos numéricos para ingenieros (5a. ed.). México D.F, México: McGraw-Hill Interamericana. (pp. 502 – 537).
In [ ]:
Canale, R. P. y P. Canale, R. (2007). Métodos numéricos para ingenieros (5a. ed.). México D.F,
Mexico: McGraw-Hill Interamericana. Recuperado de
https://elibronet.bibliotecavirtual.unad.edu.co/es/lc/unad/titulos/73710