METODO DI JACOBI E CRITERI DI FERMATA....
Ciao a tutti!!!!!! io ho fatto questo codice del metodo di jacobi con criterio di fermata a posteriori. solo che le soluzioni dei sistema non vengono... Dove ho sbagliato? grazie mille
/*METODO DI JACOBI*/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
const int size=50;
typedef double matrice[size][size];
typedef double vettore[size];
void leggimatrice(matrice,int);
void leggivettore(vettore,int);
void jacobi(matrice,vettore,vettore,vettore,int);
double diagonaledominante(matrice,int);
double normamax(vettore, vettore, int);
void stampa(vettore,int);
main()
{
matrice A; vettore b, vettk, vettkp1; double delta;
int n, k=0; double toll, lambda, rho;
printf("\n dammi la dimensione della matrice n=");scanf("%d",&n);
leggimatrice(A,n);
lambda=diagonaledominante(A,n);//lamda=max-i(somm a[i][j])/a[i][i]
if(lambda>=1)
{
printf("\n la matrice non e'a diagonale dominante!non puoi usare jacobi\n\n");
exit(1);
}
leggivettore(b,n);
printf("\n\n Inserire il limite di precisione delle soluzioni. tolleranza=");
scanf("%lf", &toll);
for(int i=1; i<=n; i++) vettk[i]=0;
for(int i=1; i<=n; i++) vettkp1[i]=0;
delta=normamax(vettkp1, vettk, n);
rho=(log(toll*((1-lambda)/delta))/log(lambda));
do(k++);
while(k<=rho);
while(delta>=toll)
{
for(int j=1; j<n; j++)
{
for(int i=1;i<=n;i++) vettk[i]=vettkp1[i];
jacobi(A,b,vettk,vettkp1,n);
delta=fabs(vettkp1[j]-vettk[j]);
}
}
stampa(vettkp1,n);
system("PAUSE");
return 0;
}
void leggimatrice(matrice A,int n)
{
printf("\n La matrice A e' costituita dai seguenti elementi:");
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
printf("\n Inserire l'elemento A[%d][%d]=",i,j);
scanf("%lf",&A[i][j]);
}
return;
}
void leggivettore(vettore b,int n)
{
for(int i=1;i<=n;i++)
{
printf("\n Inserire il termine noto b[%d]=",i);
scanf("%lf",&b[i]);
}
return;
}
void jacobi(matrice A, vettore b,vettore x,vettore y,int n)
{
for(int i=1;i<=n;i++)
{
y[i]=b[i];
for(int j=1;j<=n;j++)
if(j!=i) y[i]=y[i]-A[i][j]*x[j];
y[i]=y[i]/A[i][i];
}
return;
}
double diagonaledominante(matrice A,int n)
{
double sum, lambda=0;
for(int i=1;i<=n;i++)
{
sum=0;
for(int j=1;j<=n;j++)
if(i!=j) sum=sum+(fabs(A[i][j]));
sum=sum/fabs(A[i][i]);
if(lambda<sum) lambda=sum;
}
return lambda;
}
double normamax(vettore vettkp1, vettore vettk, int n)
{
double max=(fabs(vettkp1[1]-vettk[1]));
for(int i=2;i<=n;i++)
if(max<(fabs(vettkp1[i]-vettk[i]))) max=(fabs(vettkp1[i]-vettk[i]));
return max;
}
void stampa(vettore y,int n)
{
printf("\n Le soluzioni del sistema sono:");
for(int i=1;i<=n;i++) printf("\t%lf",y[i]);
return;
}
Risposte
per favore, c'è qualcuno che conosce questo metodo? è importantissimo!!!!!!!!!!
io farei cosi ma non so se è giusto ...ho scritto di getto senza controllare il funzionamento al compilatore:
#include<iostream>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define EPS 0,00001 //tolleranza
#define MAXINTER 100000 //numero max di interazioni
using namespace std;
const int MAX_DIM = 10;
void leggi(double A[MAX_DIM][MAX_DIM],int &dim);
void leggi_b(int dimensione, double b[]);
void stampa(double A[MAX_DIM][MAX_DIM], double x[MAX_DIM], int dim);
int jacobi(double A[MAX_DIM][MAX_DIM], double b[MAX_DIM],int dim)
{
int i,j;
int flag=0;
double sum;
double X[MAX_DIM];
for( i=0; i<dim; i++){
X[i]=b[i]/A[i][i];
}
while(EPS && flag < MAXINTER)
{
for(i=0;i<dim;i++){
b[i]=X[i];
sum=b[i];
for(j=0;j<dim;++j)
if(j!=i)
sum-=A[i][j]*b[j];
X[i]=sum/A[i][i];
for (i=0;i<dim;i++)
if(fabs(X[i]- b[i])>fabs(X[i])*EPS)
++flag;
}
}
}
void leggi( double A[MAX_DIM][MAX_DIM], int &dim)
{
int i,j;
cout << "Inserire la dimensione della matrice: ";
cin >> dim;
for( i=0; i<dim; i++)
for( j=0; j<dim; j++) {
cout << "A(" << i+1 << "," << j+1 << ")=";
cin >> A[i][j];
}
}
void leggi_b( int dim, double b[MAX_DIM])
{
int i;
for( i=0; i<dim; i++) {
cout << "b(" << i+1 << ")=";
cin >> b[i];
}
}
void stampa(double A[MAX_DIM][MAX_DIM], double term_noti[MAX_DIM], int dim)
{
int i,j;
cout << "Matrice\n";
for(i=0;i<dim;i++) {
for(j=0;j<dim;j++)
cout << "\tA("
<< i+1 << ","
<< j+1 << ")="
<<A[i][j];
cout << "\n";
}
}
void stampa_sol(double x[MAX_DIM], int dim)
{
int i;
cout << "Vettore soluzioni\n";
for(i=0;i<dim;i++) {
cout << "\tx(" << i+1 << ")=" << x[i];
cout << "\n";
}
}
main()
{
double A[MAX_DIM][MAX_DIM],b[MAX_DIM], X[MAX_DIM];
int dim;
int success;
cout << "\n\n\n";
leggi(A,dim);
leggi_b(dim,b);
stampa(A,b,dim);
jacobi(A,b,dim);
cout << "\n\nIl vettore delle soluzioni e’:\n";
stampa_sol(X,dim);
system ("PAUSE"); return 0;
}