Métodos de Gauss-Seidel e Gauss-Jacobi
Algoritmos de implementação dos métodos de Gauss-Seidel e Gauss-Jacobi em C++, pela disciplina de Cálculo Numérico e Computacional.
#include<iostream>
using namespace std;
double erro=0.0000000001;
int len=3;
double A[3][3] = { {3,1,-1}, {2,4,1}, {1,2,4} };
double B[3] = {5,4,6};
double Subtratorio(double *X1,int lin){
double total=0;
for(int i=0;i<len;i++)
if(i!=lin) total-=X1[i]*A[lin][i];
return total;
}
double max(double* X1){
double max=X1[0];
for(int i=0;i<len;i++)
if(X1[i]>max)max=X1[i];
return max;
}
double* diferenca(double* X1,double* Y){
double * dif = new double[len];
for(int i=0;i<len;i++)
dif[i]=X1[i]-Y[i];
return dif;
}
void escreve(double *X1,int iteracao){
cout << "P/ K=" << iteracao << endl;
for(int i=0;i<len;i++)
cout << "x" << i << " = " << X1[i] << " ";
cout << endl;
}
void copy(double *X1, double *X2){
for(int i=0;i<len;i++)
X1[i]=X2[i];
}
double abs(double v){
if(v<0)return v*-1;
return v;
}
void Jacob(){
double X[3] = {0,0,0};
double X1[len];
int iteracao=0;
while(true){
for(int i=0;i<len;i++)
X1[i] = ((B[i] + Subtratorio(X,i))/A[i][i]);
escreve(X1,iteracao++);
if(abs(max(diferenca(X,X1))) < erro)break;
copy(X,X1);
}
}
void Seidel(){
double X[3] = {0,0,0};
double X1[len];
int iteracao=0;
copy(X1,X);
while(true){
for(int i=0;i<len;i++)
X1[i] = (B[i] + Subtratorio(X1,i))/A[i][i];
escreve(X1,iteracao++);
if(abs(max(diferenca(X,X1))) < erro)break;
copy(X,X1);
}
}
int main(){
cout.setf(ios::fixed);
cout.precision(10);
cout << "Gaus-Jacob";
Jacob();
cout << endl<< endl << "Gaus-Seidel" << endl;
Seidel();
return 0;
}
Posts relacionados:
- Algoritmo: Ajudando a prefeitura
- Algoritmo: O imperador Lu Zhin Du
- Algoritmo: Os tesouros de Shaou Lee
- Alguns algoritmos da Regional da Maratona da ACM 2007
- Desenhando curvas de Hermite em Java
Tags: algoritmos, calculo