Buscar

cn lista 5 (1)

Prévia do material em texto

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define NMAX 20
#define L 4
#define C 2
// Recebe a matriz m_in, sua quantidade de linhas e colunas, e uma 
outra matriz 
// m_out onde sera armazenada a transposta de m_in.
void transposta(float m_in[NMAX][NMAX], int lin, int col, float 
m_out[NMAX][NMAX]);
// Recebe as duas matrizes a serem multiplicadas e seus tamanhos, e 
uma outra
// matriz m_out onde sera armazenado o resultado da multiplicacao.
void multiplica(float m1[NMAX][NMAX], int lin1, int col1, float 
m2[NMAX][NMAX], int lin2, int col2, float m_out[NMAX][NMAX]);
// Imprime a matriz m na tela.
void imprime(float m[NMAX][NMAX], int lin, int col);
// Recebe as matrizes A e B e mostra na tela a solução do sistema de 
equacoes. 
void gauss_seidel(float a[NMAX][NMAX], int lin, int col, float b[NMAX]
[NMAX], int max_iter, float e_min); 
// As funcoes abaixo sao as duas do modelo de uma parabola p(x) = 
a1*x^2 + a2.
float g1(float x){ return x*x;}
float g2(float x){ return 1;}
int main()
{
 float a[NMAX][NMAX];
 float b[NMAX][NMAX];
 float at[NMAX][NMAX];
 float ata[NMAX][NMAX];
 float atb[NMAX][NMAX];
 int max_iter = 20;
 float e_min = 0.001;
 int i, j;
 float x_tab[L] = {1, 2, 3, 5}; 
 float y_tab[L] = {1.2, 0.9, 3.1, 6.1}; 
 /*
 *
 * COMPLETE O CÓDIGO DA MAIN
 *
 */
 return 0;
}
void transposta(float m_in[NMAX][NMAX], int lin, int col, float 
m_out[NMAX][NMAX])
{
 int i, j;
 for (i = 0; i < lin; i++)
 {
 for (j = 0; j < col; j++)
 {
 m_out[j][i] = m_in[i][j];
 }
 }
}
void imprime(float m[NMAX][NMAX], int lin, int col) {
 int i, j;
 for (i = 0; i < lin; i++)
 {
 for (j = 0; j < col; j++)
 printf("%f ", m[i][j]);
 printf("\n");
 }
}
void multiplica(float m1[NMAX][NMAX], int lin1, int col1, float 
m2[NMAX][NMAX], int lin2, int col2, float m_out[NMAX][NMAX])
{
 int i, j, k;
 for (i = 0; i < lin1; i++)
 for (j = 0; j < col2; j++)
 m_out[i][j] = 0;
 for (i = 0; i < lin1; i++)
 {
 for (j = 0; j < col2; j++)
 {
 for (k = 0; k < col1; k++)
 m_out[i][j] += m1[i][k]*m2[k][j];
 }
 }
}
float diferencaMaxima(float x1[NMAX][NMAX], float x2[NMAX][NMAX], int 
lin);
void gauss_seidel(float A[NMAX][NMAX], int lin, int col, float b[NMAX]
[NMAX], int max_iter, float e_min) 
{
 float x[NMAX][NMAX], x_novo[NMAX][NMAX];
 int i, j, iteracao;
 float e, soma;
 
 for(i = 0; i < lin; i++){
 x[i][0] = 0;
 }
 
 for(iteracao = 0; iteracao < max_iter; iteracao++){
 
 for(i = 0; i < lin; i++){
 soma = 0.0;
 for(j = 0; j < col; j++){
 if(i != j){
 if(j < i){
 soma = soma + A[i]
[j]*x_novo[j][0]; 
 }else{
 soma = soma + A[i]
[j]*x[j][0];
 }
 
 }
 }
 x_novo[i][0] = (b[i][0] - soma) / A[i][i];
 }
 
 e = diferencaMaxima(x, x_novo, lin);
 printf("\n(%d)[e: %f] - ",iteracao, e);
 printf("\n");
 imprime(x_novo, lin, 1);
 
 if(e < e_min){
 break;
 }
 
 for(i = 0; i < lin; i++){
 x[i][0] = x_novo[i][0];
 }
 }
 
}
float diferencaMaxima(float x1[NMAX][NMAX], float x2[NMAX][NMAX], int 
lin){
 float d, dMax = 0.0;
 int i;
 
 for(i = 0; i < lin; i++){
 d = fabs(x1[i][0] - x2[i][0]);
 if(dMax < d){
 dMax = d;
 }
 }
 return dMax;
}

Continue navegando