Buscar

Algoritmos sistemas lineares Scilab

Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original

Exemplos_Algoritmos_Scilab-Sistemas Lineares.docx
Algoritmos para aplicação no Scilab 5.5.2 (2016)
(Sistemas lineares utilizando métodos diretos e iterativos)
1- Aplicação de algoritmos simples.
Algoritmo 1: Soma de dois números
//Programador: 
//Data: 
//O programa calculará a soma de dois números.
clear;
clc;
mprintf("Entre com dois numeros");
Num1=input("Primeiro valor: ");
Num2=input("Segundo valor: ");
som = Num1 + Num2;
mprintf("O resultado da soma é %.3f ", som);
Algoritmo 2: Média das notas do semestre
//Programador: 
//Data: 
//O programa calculará a média das notas do semestre
clear;
clc;
mprintf("\nCálculo da média das notas.");
N1 = input ("Nota 1: ");
N2 = input ("Nota 2: ");
N3 = input ("Nota 3: ");
Media = median((N1+N2+N3)/3);
mprintf("\n O Valor da média é %.1f",Media);
if (Media>=7.0) then
 mprintf("\n Aprovado.");
end
if (Media>=4.0 & Media<7.0) then
 mprintf("\n Exame.");
end
if(Media<4.0) then
 mprintf("\n Reprovado.");
end
mprintf("\nFim do programa!");
Algoritmo 3: Conversão de Celsius em Kelvin.
//Programador: 
//Data:
//Cálculo de conversão de Celsius em Kelvin.
clear;
clc;
Celsius=input("Digite a Temperatura: ");
Kelvin=Celsius+273.15;
mprintf("\nTemperatura em Kelvin= %.3f", Kelvin);
mprintf("\nTemperatura em Celsius= %.3f", Celsius);
Algoritmo 4: Hipotenusa de um triângulo retângulo.
//Programador: 
//Data: 
//O programa calculará a hipotenusa de um triângulo retângulo por meio dos catetos
clear;
clc;
a=input("Cateto oposto: ");
b=input("Cateto adjacente: ");
c=sqrt((a^2)+(b^2));
mprintf("\n Valor da hiponusa é %f",c);
mprintf("\nFim do programa!");
2- Aplicação de algoritmos em resolução de sistemas lineares
2.1- Métodos Diretos:
Algoritmo 5: Método de Gauss
//A é a matriz dos coeficientes das variáveis
//b é o vetor de termos independentes
clear;
clc;
function elimGauss(A, b)
 //Eliminação de Gauss ou Método de Gauss
 [n c] = size (A);
 r = zeros (n,1);
 for k = 1 : n-1
 for i = (k+1): n;
 m = A(i,k) / A(k,k);
 A(i,k) = 0.0;
 for j = (k+1) : n
 A(i,j) = A(i,j) - m * A(k,j); 
 end
 b (i) = b (i) - m * b (k);
end
end
disp(A)
//Resolução do sistema
r(n)=b(n)/A(n,n);
for k=(n-1):-1:1
 s = 0;
 for j=(k+1):n
 s=s+A(k,j)*r(j);
 end
 r(k)=(b(k)-s)/A(k,k);
end
mprintf ("\n Matriz de Gauss = \n");
disp (A)
mprintf ("\n Vetor independete de Gauss = \n");
disp (b)
mprintf ("\n Solução do sistema = \n");
disp (r)
endfunction
Algoritmo 6: Método de Gauss com pivotamento parcial
//Método de Gauss com pivotamento parcial
clear;
clc;
function x=linearGaussianPivot(A, b)
n = length(b);
A = [A,b];
//Eliminação de Gauss
for k=1:n-1 //A(k,k) é o pivô
//Escolhendo o maior número em módulo, ou absoluto (abs) 
Amax = abs(A(k,k));
imax = k;
for i=k+1:n
if abs(A(i,k))>Amax
Amax = abs(A(i,k));
imax = i;
end
end
if (imax~=k) //Encontrando o maior número em módulo, troca-se as linhas
u = A(k,:); //copiar a linha enésima
A(k,:) = A(imax,:); //substituí-lo com a linha IMAX
A(imax,:) = u; //substituir a linha IMAX com a linha de ordem k originais
end
//Finalização do pivotamento
for i=k+1:n //eliminando ou zerando os elementos em que i>k
for j=n+1:-1:k
A(i,j) = A(i,j)-A(k,j)*A(i,k)/A(k,k);
end
end //i loop
end //k loop
//Substituição
//Eliminação de Gauss ou Método de Gauss
 [n c] = size (A);
 r = zeros (n,1);
 for k = 1 : n-1
 for i = (k+1): n;
 m = A(i,k) / A(k,k);
 A(i,k) = 0.0;
 for j = (k+1) : n
 A(i,j) = A(i,j) - m * A(k,j); 
 end
 b (i) = b (i) - m * b (k);
end
end
//Resolução do sistema
r(n)=b(n)/A(n,n);
for k=(n-1):-1:1
 s = 0;
 for j=(k+1):n
 s=s+A(k,j)*r(j);
 end
 r(k)=(b(k)-s)/A(k,k);
end
mprintf ("\n Matriz de Gauss = \n");
disp (A)
//Substituição
x = zeros(n,1);
x(n) = A(n,n+1)/A(n,n);
for i=n-1:-1:1
x(i) = A(i,n+1);
for j=i+1:n
x(i) = x(i)-A(i,j)*x(j);
end
x(i) = x(i)/A(i,i);
end
endfunction
Algoritmo 7: Método de Jordan
//Método de Jordan
clear;
clc;
function x=linearJordan(A,b)
n = length(b);//tamanho da matriz dos termos independentes
A = [A,b]; //matriz
for k=1:n //A(k,k) é o pivô
for j=n+1:-1:k //normalizar a linha k assim A(k,k)=1
A(k,j) = A(k,j)/A(k,k);
end
for i=1:n //eliminando ou zerando todos os elementos i diferente de k (i ~= k), ou seja, ficará ao final somente a diagonal principal
if (i~=k) 
for j=n+1:-1:k
A(i,j) = A(i,j)-A(k,j)*A(i,k);
end
end
end 
end 
x = A(:,n+1); //a última coluna da matriz aumentada é agora x
endfunction
Algoritmo 8: Método de LU
//Programador:
// Data:
// O programa resolverá o sistema linear utilizando o método LU, sem pivotamento.
clear;
clc;
function A=linearLU(A)
n = size(A,1);
for k = 1 : n-1
for i = k+1 : n
A(i,k) = A(i,k) / A(k,k);
for j = k+1 : n
A(i,j) = A(i,j) - A(i,k) * A(k,j);
end
end
end
endfunction
function x=linearLUsubstituto(A, b)
n = length(b);
y = zeros(b);
for i=1:n //aplicando a substituição, utilizando a matriz Ly=b, para encontrar os valores de y.
y(i) = b(i);
for j=1:i-1
y(i) = y(i)-A(i,j)*y(j); //A(i,j) = L(i,j) para j<i
end
end
x = zeros(b);
for i=n:-1:1 ////aplicando a substituição, utilizando a matriz Ux=y, para encontrar os valores de x.
x(i) = y(i);
for j=i+1:n
x(i) = x(i)-A(i,j)*x(j); //A(i,j) = U(i,j)para j>i
end
x(i) = x(i)/A(i,i);
end
endfunction
Algoritmo 9: Método de LU com pivotamento parcial
//Programador:
// Data:
// O programa resolverá o sistema linear utilizando o método LU, com pivotamento parcial.
clear;
clc;
function [A, p]=linearLUP(A)
n = size(A,1);
p = [1:n]';
for k=1:n-1
amax = abs(A(k,k));
imax = k;
for i=k+1:n
if abs(A(i,k))>amax
amax = abs(A(i,k));
imax = i;
end
end
if (imax~=k)
w = A(k,:);
A(k,:) = A(imax,:);
A(imax,:) = w; 
t = p(k);
p(k) = p(imax);
p(imax) = t;
end
for i=k+1:n
A(i,k) = A(i,k)/A(k,k);
for j=k+1:n
A(i,j) = A(i,j)-A(i,k)*A(k,j);
end
end
end
endfunction
2.2 Métodos Iterativos
Algoritmo 10: Métodos Jacobi e Gauss-Seidel
// Gauss Seidel
clear;
clc;
function [x, erroFinal]=GaussSeidel(A, b, x)
for k=2:numItera
for i=1:n
x(i,k)=b(i);
for j=1:n
if i<>j
if i>j
x(i,k)=x(i,k)-A(i,j)*x(j,k);
else
x(i,k)=x(i,k)-A(i,j)*x(j,k-1);
end
end
end
x(i,k)=(1/A(i,i))*x(i,k);
erroNovo=abs(x(i,k)-x(i,k-1));
if erroNovo > erro
erro=erroNovo;
end
end
erroFinal(k)=erro;
erro=0;
end
endfunction
// Jacobi
function [x, erroFinal]=Jacobi(A, b, x)
for k=2:numItera
for i=1:n
x(i,k)=b(i);
for j=1:n
if i<>j
x(i,k)=x(i,k)-A(i,j)*x(j,k-1);
end
end
x(i,k)=(1/A(i,i))*x(i,k);
erroNovo=abs(x(i,k)-x(i,k-1));
if erroNovo > erro
erro=erroNovo;
end
end
erroFinal(k)=erro;
erro=0;
end
endfunction
// Definição da Matriz A
function A=leMatrizA()
printf("\n\nEntrada da Matriz A");
for i=1:n
for j=1:n
printf("Entre com o elemento A(%d,%d) :",i,j);
A(i,j)=input("");
end
end
endfunction
// Definição da Matriz b
function b=leVetorb()
for i=1:n
printf("Entre com o elemento b(%d) :",i);
b(i)=input("");
end
endfunction
//
Definição das condições iniciais
function x=leCondInic()
printf("\n\nEntrada das condições iniciais");
for i=1:n
printf("Entre com o elemento x%d(0)",i);
x(i,1)=input("");
end
endfunction
// Definição da ordem do sistema
n=input("Entre com a ordem do sistema: ");
numItera=input("Entre com o número de iterações: ");
erro=0;
A = leMatrizA();
b = leVetorb();
x = leCondInic();
i=1;
while i<>0
i=input("Entre com valor de i: ");
select i
case 1 then
[x,erroFinal]=Jacobi(A,b,x);
// Imprime resultados
printf("\nIter ");
for i=1:n
printf("x%d ",i);
end
printf("\n");
for k=1:numItera;
printf(" %d ",k);
for i=1:n
printf("%f ",x(i,k));
end
printf("Erro =%.15f\n",erroFinal(k));
//printf("\n");
end
case 2 then
[x,erroFinal]=GaussSeidel(A,b,x);
// Imprime resultados
printf("\nIter ");
for i=1:n
printf("x%d ",i);
end
printf("\n");
for k=1:numItera;
printf(" %d ",k);
for i=1:n
printf("%f ",x(i,k));
end
printf("Erro =%.15f\n",erroFinal(k));
//printf("\n");
end
end
end
Trabalho 1 no Scilab-sistemas lineares-Diurno.docx
Trabalho no Scilab.
(Resolução de sistemas lineares)
1- Montar grupos de 4 pessoas.
2- Escolher um único problema na área de engenharia que utilize sistemas lineares na resolução. Obs.: diferente dos exercícios trabalhados em sala ou dados na lista de exercícios.
3- Escrever o enunciado do problema e montar o sistema linear.
4- Resolver este sistema linear, encontrar o vetor solução (valores de x) utilizando o software SCILAB, para isto:
a) Escolha um método direto sem pivotamento, 
b) Um método direto com pivotamento parcial e 
c) Um método iterativo. 
Então, o problema terá 3 resoluções.
5- Esclareça o porquê fez as escolhas dos métodos e compare os resultados.
6- Imprima o algoritmo utilizado, a resolução, os resultados obtidos e as conclusões encontradas.
7- Prazo para a entregar: 14/04/16. 
Bom trabalho!

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Outros materiais