Ok.
problemi qendron per ta cuar matricen simetrike X->Ak=diag(lambdai);
A1=X;
Ak1 eshte e njejte me matricen Ak, por ndryshon ne elementet
Ak1.App=Ak.App+el.t*Ak.Apq;
Ak1.Aqq=Ak.Aqq-el.t*Ak.Apq;
Ak1.A[j][p]=Ak1.A[p][j]=Ak.A[p][j] - el.s*(Ak.A[q][j] + el.r*Ak.A[p][j]);
Ak1.A[j][q]=Ak1.A[q][j]=Ak.A[q][j] + el.s*(Ak.A[p][j] - el.r*Ak.A[q][j]);
per j!=p
ku t dhe r jane te dhena me formulat: t=c/s r=s/1+c
ku c dhe s jane vlerat e rrotulimeve givensa me kend fi;
kendi fi llogaritet ne baze elementit me te madh Apq (pervec diagonales) te matrices Ak
ndryshimet nga matrica Ak na Ak1 vazhdojne, deri sa elementet e matrices (pervec diagonales) te jene me te vogla se nje vlere eps.
problemi eshte se ky program nuk punon mire.elementet nuk zerohen.
do te isha mirenjohes po me ndihmove ketu.
te fala suli
Kodi PHP:
struct Matrix{
float A[MAX_SIZE][MAX_SIZE];
int p;
int q;
float Apq;
float App;
float Aqq;
};
struct elem{
float t;
float r;
float s;
};
//METODA JACOBIEGO
//funkcje potrzebne
/*
/**
1. funksioni per te gjetru vleren me te madhe te mactices
.kthen kete element, kooordinatat p, dhe q dhe vleren A[p][p] dhe A[q][q]
*/
Matrix MaxElement( float A[MAX_SIZE][MAX_SIZE], int n)
{
Matrix wynik;
wynik.Apq=0.0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
if(A[i][j]>wynik.Apq && i!=j){
wynik.Apq=A[i][j];
wynik.p=i;
wynik.q=j;
wynik.App=A[i][i];
wynik.Aqq=A[j][j];
}
wynik.A[i][j]=A[i][j];
}
return wynik;
}
//----------------------------------------
/*
/** funksjoni kthen vlrene t, r dhe s
*/
elem DifferencElement(Matrix T, int n){
//obliczenie kata
float fi=0;
if(T.App-T.Aqq==0){
if(T.Apq > 0) fi = (float)PI/4;
else if(T.Apq < 0) fi = (float) -PI/4;
}else
fi=0.5*atanf(2*T.Apq/(T.App-T.Aqq));
//obliczenie wartosci t i r z korymi roznia sie macierz Ak+1
elem wynik;
wynik.t=(float)cos(fi)/sin(fi);
wynik.r=(float)sin(fi)/(1+cos(fi));
wynik.s=sin(fi);
return wynik;
}
//----------------------------------------
/*
/**
*/
void overwrite(float A[MAX_SIZE][MAX_SIZE],float B[MAX_SIZE][MAX_SIZE],int n){
for (int i=0;i<n;i++)
for(int j=0;j<n;j++)
A[i][j]=B[i][j];
}
//--------------------------------------
/*
/**
*/
bool IsEnd(Matrix Ak, int n){
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
if(Ak.A[i][j] < eps && i!=j)
return true;
else
return false;
}
}
//--------------------------------------
/*
/**
funk kthen Ak+1 ne baze te Ak
*/
Matrix Diagonalizacja(Matrix Ak, int n){
Matrix Ak1;
Ak=MaxElement(Ak.A,n);//znajdziemy najwiekszy element w macierzy C (oraz informacje
int p=Ak.p;
int q=Ak.q;
elem el;
el= DifferencElement(Ak,n);
//float Ak1[MAX_SIZE][MAX_SIZE];
overwrite(Ak1.A,Ak.A,n);
Ak1.App=Ak.App+el.t*Ak.Apq;
Ak1.Aqq=Ak.Aqq-el.t*Ak.Apq;
for(int j=0;j<n;j++){
if(p!=j){
Ak1.A[j][p]=Ak1.A[p][j]=Ak.A[p][j] - el.s*(Ak.A[q][j] + el.r*Ak.A[p][j]);
Ak1.A[j][q]=Ak1.A[q][j]=Ak.A[q][j] + el.s*(Ak.A[p][j] - el.r*Ak.A[q][j]);
}
}
return Ak1;
}
//--------------------------------------
/*
/**
Metoda Jacobiego
*/
void Jacobiego(float C[MAX_SIZE][MAX_SIZE], int n)
{
Matrix A;
overwrite(A.A,C,n); //przepisujemy macierz C na A
elem wart;
wart=DifferencElement(A,n);
//sprawdzenie czy jest warunek stopu oraz interacja na macierz Ak+1
while(IsEnd(A,n)==false){
A=Diagonalizacja(A,n);
printf("\n\n\n");
}
//return A;
}
Krijoni Kontakt