Baixe o app para aproveitar ainda mais
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; }
Compartilhar