Beruflich Dokumente
Kultur Dokumente
] [
] [
]
Si efectuamos la multiplicacin de [L] y [U], igualando los elementos de ese
producto con los de la matriz [A] correspondientes, se obtiene:
4
De aqu que los elementos de [L] y [U] son, en este caso:
Sabemos que el sistema de ecuaciones principal se escribe:
[]{} {}
[][]{} {}
[]{} []
[][] {}
La frmula general para obtener los elementos de L y U correspondientes a la
matriz de coeficientes, para n ecuaciones simultneas se puede escribir como
Para:
, la regla para se reduce a
, la regla para se reduce a
.
5
EJEMPLO:
Considere la matriz A
[
]
Aplicando las ecuaciones para y las , se obtiene:
) (
)
[
[
] [
]
Para [
]
6
Aumentando a U y sustituyendo retroactivamente se obtiene
[
|
)
Algoritmo.
Obtener la matriz triangular inferior L y la matriz triangular superior u.
Resolver L = b
El resultado del paso anterior se guarda en una matriz nueva de nombre y
Realizar UX = y
El resultado del paso anterior se almacena en una matriz nueva llamada x
CDIGO DEL MTODO
1. #include<stdio.h>
2. #include<stdlib.h>
3. #define MAX 10
4. int main()
5. {
6. int i,j,k,n;
7. float a[MAX][MAX],b[MAX],x[MAX],l[MAX][MAX],y[MAX],u[MAX][MAX],sum;
8. printf ("\nIngresa el numero de incognitas: ");
9. scanf("%d",&n);
10. printf ("\nIngrese los coeficientes:\n\n");
11. for(i=0;i<n;i++)
12. {
13. for(j=0;j<=n;j++)
14. {
15. if(j<n)
16. {
17. printf("a[%d][%d] = ",i,j);
18. scanf("%f",&a[i][j]);
7
19. }
20. else
21. {
22. printf("b[%d] = ",i);
23. scanf("%f",&b[i]);
24. printf("\n");
25. }
26. }
27. }
28. for(i=0;i<n;i++)
29. for(j=0;j<n;j++)
30. if(i>j)
31. {
32. u[i][j]=0;
33. }
34. else if(i==j)
35. {
36. l[i][j]=1;
37. }
38. else
39. {
40. l[i][j]=0;
41. }
42. for(i=0;i<n;i++)
43. {
44. for(j=0;j<n;j++)
45. {
46. sum=0;
47. if(i<=j)
48. {
49. for(k=0;k<n;k++)
50. if(k!=i)
51. sum=sum+l[i][k]*u[k][j];
52. u[i][j]=a[i][j]-sum;
53. }
54. else
55. {
56. for(k=0;k<n;k++)
57. if(k!=j)
58. sum=sum+l[i][k]*u[k][j];
59. l[i][j]=(a[i][j]-sum)/u[j][j];
60. }
61. }
62. }
63. printf("\n\n L =");
64. for(i=0;i<n;i++)
65. {
66. for(j=0;j<n;j++)
67. printf ("%10.2f",l[i][j]);
68. printf("\n ");
69. }
70. printf("\n\n U =");
71. for(i=0;i<n;i++)
72. {
73. for(j=0;j<n;j++)
74. printf ("%10.2f",u[i][j]);
75. printf("\n ");
76. }
77. y[0]=b[0]/l[0][0];
78. for(i=1;i<n;i++)
79. {
80. sum=0;
81. for(j=0;j<i;j++)
82. {
83. sum=sum+y[j]*l[i][j];
84. }
85. y[i]=b[i]-sum;
86. }
87. printf("\n\n Y =");
88. for(i=0;i<n;i++)
89. {
90. printf ("%10.2f",y[i]);
91. printf("\n ");
92. }
93. x[n-1]=y[n-1]/u[n-1][n-1];
94. for(i=n-2;i>=0;i--)
95. {
96. sum=0;
97. for(j=n-1;j>i;j--)
98. sum=sum+x[j]*u[i][j];
99. x[i]=(y[i]-sum)/u[i][i];
100. }
101. printf("\nLa solucion es :\n");
102. for(i=0;i<n;i++)
103. printf("\n x[%d] = %.2f ",i+1,x[i]);
104. printf("\n\n");
105. system("pause");}
106.
8
MTODO DE CHOLESKY
En lgebra lineal, la descomposicin de Cholesky o tringulo de Cholesky es
una descomposicin de Hermite, definida positiva de la matriz en el producto
de una matriz triangular inferior y su transpuesta conjugada. Fue descubierto
por Andr-Louis Cholesky para matrices reales. Cuando sea aplicable, la
descomposicin de Cholesky es aproximadamente dos veces tan eficiente
como la descomposicin LU para resolver sistemas de ecuaciones lineales. En
un sentido amplio, metafrico, esto puede considerarse como el anlogo de
la matriz de la raz cuadrada de un nmero.
Formulas de la deduccin de este algoritmo para un sistema de
n ecuaciones
j i
1 , 2 1
1
1
1
,
1
1
, ,
2
,
,
,
2
2
1
,
1 , 1
1 ,
1 , 1
< =
+ + =
=
|
.
|
\
|
=
=
=
=
= =
=
=
|
.
|
\
|
0 l
n ..., i , i j
n 2,3..., i
l a
l
l
n 2,3..., i
i
k
l
n 2,3..., i
l
a
l
a l
i i
i
k
k j k i i i,
i i
i i
k i i i,
i i
1,1
i
1,1
l
l
a
9
PROBLEMA:
Resolver el siguiente sistema de ecuaciones lineales usando el mtodo de
Cholesky
A =
(
(
(
979 225 55
225 55 15
55 15 6
y C=
(
(
(
100
150
100
Solucin:
En el mtodo de Cholesky el primer paso es encontrar la matriz L usando las
frmulas
ii
i
j
kj ij ki
ki
l
l l a
l
=
1
1
y
=
=
1
1
2
k
j
kj kk kk
l a l
La primera ecuacin se usa para elementos fuera de la diagonal y la segunda
para elementos en la diagonal principal.
Entonces.
6
11 11
= = a l
4495 . 2
15
11
21
21
= =
l
a
l
4495 . 2
55
11
31
21
= =
l
a
l = 22.454
1
0
Ya sabemos que l
12
= 0
2 2
21 22 22
1237 . 6 55 = = l a l = 4.1833
1833 . 4
) 454 . 22 )( 1237 . 6 ( 55
22
31 21 32
32
=
=
l
l l a
l = 20.916
De igual forma l
13
= l
23
= 0 y
) 916 . 20 454 . 22 ( 979 ) (
2 2 2
32
2
31 33 33
+ = + = l l a l = 6.1106
La matriz L es igual a
(
(
(
=
1106 . 6 916 . 20 454 . 22
0 1833 . 4 1237 . 6
0 0 4495 . 2
L
En el mtodo de Cholesky U = L
T
(
(
(
=
1106 . 6 0 0
916 . 20 1833 . 4 0
454 . 22 1237 . 6 4495 . 2
U
1
1
El siguiente paso es encontrar el vector D de la misma manera que en el
mtodo de descomposicin de LU
ii
i
j
j ij i
i
l
d l c
d
=
1
1
4495 . 2
100
11
1
1
= =
l
c
d =40.8246
1833 . 4
) 8246 . 40 )( 1237 . 6 ( 150
22
1 21 2
2
=
=
l
d l c
d =-23.9045
1106 . 6
) 9045 . 23 )( 916 . 20 ( ) 8246 . 40 )( 454 . 22 (( 100 ) (
33
2 32 1 31 3
3
+
=
+
=
l
d l d l c
d =-51.826
Finalmente se calcula el vector de incgnitas comenzando por la ltima x.
ii
n
i j
j ij i
i
u
x u d
x
+ =
=
1
33
3
3
u
d
x = =-8.481
22
3 23 2
2
u
x u d
x
= = [-23.9045-(20.916)(-8.481)]/4.1833 = 36.690
11
3 13 2 12 1
1
) (
u
x u x u d
x
+
= =[40.8246 ((6.1237)(36.69)+(22.454)(-8.481))]/2.4495 = 2.685
El resultado se puede comprobar multiplicando A por X y el resultado debe
ser igual a C.
1
2
CDIGO:
1. #include <math.h>
2. #include <tina/sys.h>
3. #include <tina/sysfuncs.h>
4. #include <tina/math.h>
5. #include <tina/mathfuncs.h>
6. #define TINY 1.0e-20
7. static int cholesky1(double **A, int n)
8. {
9. int i, j, k;
10. for (i = 0; i < n; ++i)
11. {
12. for (j = 0; j <= i; ++j)
13. {
14. double sum = A[i][j];
15. A[j][i] = 0;
16. for (k = 0; k < j; ++k)
17. sum -= A[i][k] * A[j][k]; /* computed previously */
18. if (i == j)
19. {
20. if (sum < 0)
21. return (0);
22. sum = sqrt(sum);
23. if (fabs(sum) < TINY)
24. return (0);
25. A[i][j] = sum;
26. } else
27. A[i][j] = sum / A[j][j];
28. }
29. }
30. return (1);
31. }
32. #undef TINY
33. static void cholbksb(double **A, int n, double *x, double *b)
34. {
35. int i, j;
36. double sum;
37. for (i = 0; i < n; i++)
38. {
39. sum = b[i];
40. for (j = 0; j < i; ++j)
41. sum -= x[j] * A[i][j];
42. x[i] = sum / A[i][i];
43. }
44. for (i = n - 1; i >= 0; i--)
45. {
46. sum = x[i];
47. for (j = i + 1; j < n; j++)
48. sum -= x[j] * A[j][i];
49. x[i] = sum / A[i][i];
50. }
51. }
52. Matrix *matrix_cholesky_decomp(Matrix * A)
53. {
1
3
54. if (A == NULL || A->n != A->m)
55. return (NULL);
56. A = matrix_cast_fill(A, double_v);
57. if (!cholesky1 (A->el.double_v, A->n))
58. {
59. matrix_free((Matrix *) A);
60. return (NULL);
61. }
62. return (A);
63. }
64. Vector *matrix_cholesky_back_sub(Matrix * A, Vector * b)
65. {
66. int n;
67. Vector *x = NULL;
68. Vector *c = NULL;
69. if (A == NULL || A->n != A->m)
70. return (NULL);
71. n = A->n;
72. if (b == NULL || b->n != n)
73. return (NULL);
74. A = matrix_cast_fill(A, double_v);
75. c = vector_cast(b, double_v);
76. x = vector_alloc(n, double_v);
77. cholbksb (A->el.double_v, n, (double *) x->data, (double *) c->data);
78. vector_free(c);
79. matrix_free((Matrix *) A);
80. return (x);
81. }
82. Vector *matrix_cholesky_sol(Matrix * A, Vector * b){
83. int n;
84. int sucess;
85. Vector *x = NULL;
86. Vector *c = NULL;
87. if (A == NULL || A->n != A->m)
88. return (NULL);
89. n = A->n;
90. if (b == NULL || b->n != n)
91. return (NULL);
92. A = matrix_cast_fill(A, double_v);
93. sucess = cholesky1(A->el.double_v, n);
94. if (sucess)
95. {
96. c = vector_cast(b, double_v);
97. x = vector_alloc(n, double_v);
98. cholbksb(A->el.double_v, n, (double *) x->data, (double *) c->data);
99. vector_free(c);
100. }
101. matrix_free((Matrix *) A);
102. return (x);
103. }
104. Vector *matrix_cholesky_weighted_least_square(Matrix * A, Matrix * W, Vector * b)
105. {
106. Matrix *At;
107. Matrix *M;
1
4
108. Matrix *temp;
109. Vector *x;
110. if (A == NULL || A->m != b->n || W == NULL || W->n != W->m || W->m != A->m)
111. return (NULL);
112. A = matrix_cast_fill(A, double_v); /* to maintain precision */
113. At = matrix_transp(A);
114. x = matrix_vprod(W, b);
115. b = matrix_vprod(At, x);
116. vector_free(x);
117. temp = matrix_prod(W, A);
118. M = matrix_prod(At, temp);
119. matrix_free((Matrix *) temp);
120. x = matrix_cholesky_sol(M, b);
121. vector_free(b);
122. matrix_free((Matrix *) A);
123. matrix_free((Matrix *) At);
124. matrix_free((Matrix *) M);
125. return (x);
126. }
127. Vector *matrix_cholesky_least_square(Matrix * A, Vector * b)
128. {
129. Matrix *At;
130. Matrix *M;
131. Vector *x;
132. if (A == NULL || b == NULL || A->m != b->n)
133. return (NULL);
134. A = matrix_cast_fill(A, double_v); /* to keep precision */
135. At = matrix_transp(A);
136. b = matrix_vprod(At, b);
137. M = matrix_prod(At, A);
138. x = matrix_cholesky_sol(M, b);
139. vector_free(b);
140. matrix_free((Matrix *) A);
141. matrix_free((Matrix *) At);
142. matrix_free((Matrix *) M);
143. return (x);
a. }
15
Polinomios de Chebyshev
El polinomio de chebyshev es parecido con los Polinomios de Legendre,
porque una de las principales aplicaciones de ambos la constituye el
desarrollo de los filtros elctricos, o filtros de ondas, de gran importancia en
las ramas de la ingeniera elctrica y electrnica.
La funcin siguiente es el Polinomio de Chebyshev de orden n
Para n = 1:
Para calcular los polinomios sucesivos empleamos la frmula de recurrencia
(formula No.1)
Y al Simplificar la ecuacin
u = arcos x
Remplazando obtenemos:
(Formula No.2)
Pero la funcin inversa de u es:
(Formula No.3)
16
Por lo tanto el Polinomio de orden n + 1, ser:
{ }
Y el de orden n -1:
{ }
Al aplicar las frmulas de coseno de la suma y coseno diferencia obtenemos:
Al sumar las dos igualdades nos da
Remplazando la formula No. 2 y 3
Formula No.4)
A partir de este resultado, es posible determinar, por reiteracin, el
polinomio que representa a cada una de las funciones de Chebyshev.
EJEMPLO:
Calcular las funciones
17
Aplicando la formula No.4
APLICACI ONES MATLAB
Clculo de polinomios de Chebyshev por aplicacin de la frmula de recurrencia:
1. syms x
2. C0 = 1
3. C0 = 1
4. C1 = x
5. C1 = x
6. C2 = 2*x*C1 - C0
7. C2 = 2*x^2-1
8. C3 = 2*x*C2 - C1
9. C3 = 2*x*(2*x^2-1)-x
10. C4 = 2*x*C3 - C2
11. C4 = 2*x*(2*x*(2*x^2-1)-x)-2*x^2+1
12. % Como ejemplo representamos C3:
13. ezplot(C3)
14. axis ([-1.2 1.2 -1.2 1.2])
18
MTODO DE HERMITE
En el anlisis numrico, la interpolacin de Hermite, nombrada as en honor
a Charles Hermite, es un mtodo de interpolacin de puntos de datos como
una funcin polinmica. El polinomio de Hermite generado est
estrechamente relacionado con el polinomio de Newton, en tanto que ambos
se derivan del clculo de diferencias divididas.
Definicin: Sean
nmeros distintos y
un entero
negativo asociado a
[ ],
donde {
en
para cada { }.
Teorema
Sean
[ ] nmeros distintos,
[ ] Entonces existe un
nico polinomio que concuerde con
en
. En este polinomio
est dado por:
Donde:
( (
)
(
))
Teniendo:
19
La interpolacin de Hermite permite construir un polinomio que ajusta no
solo a los valores de una funcin sino tambin a las derivadas de los puntos.
Tabla de aproximacin e interpolacin polinmicas.
Problema
Se sabe que:
.
b) Sin evaluar
Entonces al reemplazar los resultados obtenidos en la tabla, quedara as;
c) Los valores de estn dados por;
21
En la tabla de valores pedidos estn en lugares;
Algoritmo
ENTRADA Los nmeros x0 ,x1,.,xn; valores f(x0) ,,f(xn) y f(x0).f(xn)
SALIDA los nmeros Q 0,0 ,Q 1,1,,Q 2n+1,2n+1 donde
H(x)= Q 0,0 + Q 1,1 (x- x0 )+Q 2,2 (x- x0)^2+ Q 3,3 (x- x0)^2 (x- x1 )+Q 4,4 (x-
x0)^2 (x- x1 )^2++Q 2,n+1,2n+1 (x- x0)^2 (x- x1 )^2..(x- xn-1 )^2(x-xn)
Paso 1: Para i=0,1,,n haga paso 2 y3
paso 2 Sea z2i =xi
z2i+1 =xi
Q2i,0= f(xi)
Q2i+1,0= f(xi)
Q2i+1,1= f(xi)
paso 3 Si i 0 entonces tome
Q2i,1= Q2i,0-Q2i-1,0 / z2 - z2i-1
Paso 4 Para i=2,3,,2n+1
para j=2,2,.i tomar
Qi,j= Qi,j-1-Qi-1,j-1 / zi - zi-j
Paso 5 Salida (Q0,0 , Q1,1,..,Q2n+1,2n+1)
pare
22
PROGRAMA EN MATLAB
1. X=input('Ingrese los valores de x='); % en forma de vector
2. Y=input('Ingrese los valores de f(x)='); % en forma de vector
3. DF=input('Ingrese los valores de la derivada de f(x)='); % en forma de vector
4. x=input(Ingrese el valor a interpolar = );
5. n=length(X);
6. Q=zeros(2,n);
7. for i=1:n
8. z(2*i-1)=X(i);
9. z(2*i)=X(i);
10. Q(2*i-1,1)=Y(i);
11. Q(2*i,1)=Y(i);
12. Q(2*i,2)=DF(i);
13. if i~=1
14. Q(2*i-1,2)=(Q(2*i-1,1)-Q(2*i-2,1))/(z(2*i-1)-z(2*i-2));
15. end
16. end
17. for i=3:2*n
18. for j=3:i
19. Q(i,j)=(Q(i,j-1)-Q(i-1,j-1))/(z(i)-z(i-j+1));
20. end
21. end
22. syms x
23.
24. Fx=Q(1,1);
25.
26. %Diferencias divididas
27. for p=1:numel(X)-1
28. L=1;
29. %Multiplicacin de los polinomios
30. for k=1:p
31. L=L*(x-X(k));
32. end
33. Fx=Fx+L*Q(p+1,p+1);
34. end
35.
36. %Aproximacion del Polinomio resultante
37. val=eval(Fx);
38. disp(val);
23
MTODO DE NEWTON
MTODO:
PROBLEMA:
CDI GO:
24
BIBLIOGRAFA
Abascal, I. R. ( 2006). Ecuaciones Diferenciales de Orden Superior Parte V Polinomios de Chebyshev . thompson
Learning.
Barcelo, T. (s.f.). uam.es. Recuperado el 6 de abril de 2014, de
http://www.uam.es/personal_pdi/ciencias/barcelo/cnumerico/recursos/interpolacion.html
Canale, S. C. (2006). Mtodos Nmericos para ingenieros. Mac Graw Hill.
Commons, C. (s.f.). wikipedia.com.mx. Recuperado el 8 de abril de 2014, de
http://es.wikipedia.org/wiki/Interpolaci%C3%B3n_polin%C3%B3mica
s.i. (s.f.). universidad del valle. Recuperado el abril de 2014, de interpolacion: http://www.uv.es/diazj/cn_tema5.pdf