Matlab - Ayuda a Optimizacion de Gauss-Seidel

 
Vista:
sin imagen de perfil

Ayuda a Optimizacion de Gauss-Seidel

Publicado por Jorge (2 intervenciones) el 17/11/2015 16:15:00
Tengo el siguiente programa de Gauss-Seidel en matlab.
Quería ver si me ayudan con IDEAS para optimizarlo mucho mas de lo que esta actualmente.
Tal vez con la ayuda de algunos comandos que realicen tareas automáticamente.

He probado con la implementacion de normas para la solución del mismo, también con matrices transpuestas, pero de esas formas el programa sale mucho mas largo.
Contrario a lo que busco su optimizacion. (menos código).
Gracias de antemano.


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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
clear;clc
ind1=0;
while ind1==0
    A=input('Ingrese la Matriz: ');
    [n,m]=size(A);
    c=0;
    for i=1:n
        s=sum(A(i,:))-(A(i,m))-(A(i,i));
        if abs(A(i,i))>abs(s)
            c=c+1;
        end
    end
    if c~=n
        fprintf(' La Matriz no es Diagonal Dominante en Filas\n')
        input(' Enter para Continuar ');
        clc
    else
        ep=input('Ingrese el valor del Error Permitido: ');
        im=input('Ingrese el numero de Iteraciones Maximas: ');
        ind1=1;
        it=0;
        X=zeros(1,n);
        Xa=zeros(1,n);
        ind2=0;
        cont=0;
        while ind2==0;
            it=it+1;
            for i=1:n
                Xa(i)=X(i);
                sum=0;
                for j=1:n
                    if i~=j
                        sum=sum+A(i,j)*X(j);
                    end
                end
                X(i)=(A(i,m)-sum)/abs(A(i,i));
                ei=abs(X(i)-Xa(i));
                if ei<=ep
                    cont=cont+1;
                end
                if cont==n
                    ind2=1;
                end
            end
            cont=0;
            ind3=0;
            if it>im
                fprintf(' No convergue o pocas iteraciones\n')
                ind2=1;
                ind3=1;
            end
        end
        if ind3~=1
            for h=n:-1:1
                fprintf(' La Variable X%d es: %6.3f\n',h,X(h))
            end
        end
    end
end
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Royeth
Val: 3.309
Plata
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Ayuda a Optimizacion de Gauss-Seidel

Publicado por Royeth (1818 intervenciones) el 17/11/2015 18:35:12
debes trabajar más con matrices para optimizar tu código , te voy a poner el primer ejemplo

1
2
3
4
5
6
clear;clc
ind1=0;
while ind1==0
    A=input('Ingrese la Matriz: ');
    [n,m]=size(A);
c=sum(abs(diag(A))>abs((sum(A)'-A(:,m)-diag(A)))); %este es el cálculo del c directo


ya con esto puedes eliminar el ciclo

for i=1:n
s=sum(A(i,:))-(A(i,m))-(A(i,i));
if abs(A(i,i))>abs(s)
c=c+1;
end
end



y hay muchos ciclos que los puedes reducir a una línea si lo trabajas en matrices

espero te sea de ayuda
saludos
https://www.facebook.com/royethmatlab/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ayuda a Optimizacion de Gauss-Seidel

Publicado por Jorge (2 intervenciones) el 18/11/2015 14:42:23
Pero al eliminar el bucle for, eliminaste el contador de iteraciones que me servia para determinar si la matriz es dominante en filas.
Aunque esto lo puedo arreglar agregando otro contador y otra condición, solo que esta manera regreso al mismo numero de lineas del programa original.
Esa parte que me sugieres optimizar creo q mejor queda así.
Tal vez puedes ayudarme con la simplificación de otros ciclos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Royeth
Val: 3.309
Plata
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Ayuda a Optimizacion de Gauss-Seidel

Publicado por Royeth (1818 intervenciones) el 19/11/2015 04:25:42
no es así ese c reemplaza ese ciclo ya puedes hacer

c=sum(abs(diag(A))>abs((sum(A)'-A(:,m)-diag(A)))); %este es el cálculo del c directo
y luego

1
2
3
4
5
if c~=n
        fprintf(' La Matriz no es Diagonal Dominante en Filas\n')
        input(' Enter para Continuar ');
        clc
    else

sin ningún problema debido a que esa línea reemplaza ese ciclo fíjate bien que el contador de iteraciones lo reemplaza esa línea
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar