Está en la página 1de 2

Realizamos el siguiente programa:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

function [x ,y , u ] = prob4 ()
% La matriz u contendra las aproximaciones de la solucion
% en los puntos de la malla
u = zeros (65 ,129);
% Particiones de los segmentos
x = linspace (0 , pi ,129);
y = linspace (0 , pi /2 ,65);
h = pi /128;
% Rellenamos la frontera
u (1 ,:)= zeros (1 ,129);
u (: ,1)= cos ( y );
u (: ,129)= - cos ( y );
u (1 ,:)= cos ( x );
% Empezamos a construir el termino independiente
for j =1:63
for i =1:127
f (127*( j -1)+ i )= cos ( x ( i )+ y ( j ))+ cos ( x ( i ) - y ( j ));
end
end
% Hay que multipicar por h al cuadrado
f = f *( h ^2);
% Sumamos al termino independiente los
% valores en la frontera correspondientes
for j =1:63 %i =1
f (127*( j -1)+1)= f (127*( j -1)+1)+ u ( j +1 ,1);
end
for j =1:63 %i =127
f (127*( j -1)+127)= f (127*( j -1)+127)+ u ( j +1 ,129);
end
for i =1:127 %j =1
f ( i )= f ( i )+ u (1 , i +1);
end
for i =1:127 %j =63
f (127*(63 -1)+ i )= f (127*(63 -1)+ i )+ u (65 , i +1);
end
% Una vez ya esta definido el sistema
% aplicamos Gauss - Seidel
% Necesitamos las siguientes matrices
A = poisson2d2 (127 ,63);
L = - tril (A , -1);
U = - triu (A ,1);
D = diag ( diag ( A ));
M = sparse (D - L );
N = sparse ( U );

45
46
47
48
49
50
51
52
53
54
55
56
57
58

% Tomamos una aproximacion inicial de ceros


z = zeros (63*127 ,1);
% Aplicamos ya el metodo iterativo
for i =1:2000
w=N*z;
z = sparse ( M )\ w + sparse ( M )\ f ;
end
% Reordenamos el vector obtenido en una matriz
C = reshape (z ,127 ,63);
% Insertamos esta matriz en la u
for i =2:64
u (i ,2:128)= C (: ,i -1);
end
end

Es importante utilizar la funcion sparse y el operador \ para acelerar el metodo de GaussSeidel.


Utilizando la funcion mesh obtenemos la siguiente grafica de la aproximacion de la solucion:

También podría gustarte