Kodi PHP:
// projekt.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#define MAX_SIZE 20
#define PI 3.14159265358979
#define eps 0.01
//----------------------------------------
struct Matrix{
float A[MAX_SIZE][MAX_SIZE];
int p;
int q;
float Apq;
float App;
float Aqq;
int epsilon;
};
struct elem{
float t;
float r;
float s;
};
//----------------------------------------
//----------------------------------------
void wyswietlanie_ok(float A[MAX_SIZE][MAX_SIZE], int n)
{
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
printf("%f\t",A[i][j]);
printf("\n");
}
printf("\n\n");
}
//----------------------------------------
void wyswietlanie(float A[MAX_SIZE][MAX_SIZE], int n)
{
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
printf("%.2f\t",A[i][j]);
printf("\n");
}
printf("\n\n");
}
//----------------------------------------
Matrix mnozenie(float A[MAX_SIZE][MAX_SIZE],float B[MAX_SIZE][MAX_SIZE], int n){
Matrix C;
for(int m=0;m<n;m++)
for(int l=0;l<n;l++)
C.A[m][l]=0.0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
for(int k=0;k<n;k++)
C.A[i][j]+=A[i][k]*B[k][j];
return C;
}
//----------------------------------------
void zakoncz(){
printf("zakoncz\n");
exit(0);
}
//METODA JACOBIEGO
//funkcje potrzebne
/*
/**
1. funkcja do znalezienia najwiekszego elementu w macierzy;
zwraca ten element, wsporzedne p oraz q, wartosc A[p][p] i 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(fabs(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];
}
printf("\nky eshte max = %f\n\n",wynik.Apq);
return wynik;
}
//----------------------------------------
/*
/** funkcja ta zwraca wartosci t i r potrzebne aby wykonywac
nastepne kroki interacji
*/
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;
}
//----------------------------------------
/*
/**
Funkcja przepisujaca macierz B na macierz A
*/
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];
}
//--------------------------------------
/*
/**
funkcja ktora zwraca macierz Ak+1 od macierzy 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);
printf("p=%i, q=%i, Apq=%f, App%f, Aqq=%f\n\n",Ak.p,Ak.q,Ak.Apq,Ak.App,Ak.Aqq);
printf("r=%f, t=%f, s=%f\n\n",el.r,el.t,el.t);
//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]);
}
}
wyswietlanie_ok(Ak1.A,n);
Ak1.epsilon=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(Ak.A[i][j]<eps && i!=j){
Ak1.epsilon++;
}
printf("\n\neps=%i\n",Ak1.epsilon);
return Ak1;
}
//--------------------------------------
/*
/**
Metoda Jacobiego
*/
Matrix Jacobiego(float C[MAX_SIZE][MAX_SIZE], int n)
{
Matrix A,Ak;
overwrite(A.A,C,n); //przepisujemy macierz C na A
Ak=Diagonalizacja(A,n);
while(1)
{
if(Ak.epsilon<n*n-n)
Ak=Diagonalizacja(Ak,n);
else{
wyswietlanie_ok(Ak.A,n);
return Ak;
}
}
}
//--------------------------------------
/*
/**
fukncja ktora zwraca macierz odwrotna macierzy trojkatnej dolnej L
*/
Matrix Odwrotna( float A[MAX_SIZE][MAX_SIZE], int n){
Matrix X;
for(int m=0;m<n;m++)
for(int l=0;l<n;l++)
X.A[m][l]=0.0;
float Z[MAX_SIZE][MAX_SIZE];
for(int i=0;i<n;i++){
X.A[i][i]=(float)1/A[i][i];
for(int k=i+1;k<n;k++)
for(int j=i;j<k;j++)
X.A[k][i]=(float)-A[k][j]*X.A[j][i]/A[k][k];
}
return X;
}
//----------------------------------------
void obliczenia(){
float A[MAX_SIZE][MAX_SIZE]={0},B[MAX_SIZE][MAX_SIZE];
int n,i,j;
printf("obliczenia\n\n");
printf("podaj rzad macierzy ");
scanf("%i",&n);
if(n<=0){
printf("blad, rzad musi byc dodatny\n");
exit(0);
}
printf("\ndane dla macierzy symetrycznej A\n\n");
for (i=0;i<n;i++)
for (j=i;j<n;j++)
{
printf("A[%d][%d]: ",i+1,j+1);
scanf("%f",&A[i][j]);
}
printf("\n");
printf("\n");
for(i=n-1;i>=0;i--)
for(j=n-1;j>=i;j--)
A[j][i]=A[i][j];
printf("\ndane dla macierzy symetrycznej, dodatnio okreslonej B\n\n");
for (i=0;i<n;i++)
for (j=i;j<n;j++)
{
printf("B[%d][%d]: ",i+1,j+1);
scanf("%f",&B[i][j]);
if(B[i][j]<=0)
{
printf("Macierz B jest musi byc dodatnio okreslona\n");
printf("B[%d][%d]: ",i+1,j+1);
scanf("%f",&B[i][j]);
if(B[i][j]<=0)
exit(0);
}
}
for(i=n-1;i>=0;i--)
for(j=n-1;j>=i;j--)
B[j][i]=B[i][j];
printf("\n\nMacierz A\n");
wyswietlanie(A,n);
printf("\n\nMacierz B\n");
wyswietlanie(B,n);
printf("\n\n");
//algorytm choleskyego - Banachiewicza
float L[MAX_SIZE][MAX_SIZE]={0.0};
for(int k=0;k<n;k++)
{
if(B[k][k]<0.0){
printf("%f < 0.0\n",L[k][k]);
// exit(0);
}
else
{
L[k][k]=sqrt((float)B[k][k]);
for(int s=k+1;s<n;s++)
if(L[k][k]==0.0)printf("dzielenie przez 0\n");
else
L[s][k]=(float)B[s][k]/L[k][k];
for(j=k+1;j<n;j++)
for(i=j;i<n;i++)
B[i][j] = fabs(B[i][j] - L[i][k]*L[j][k]); //ketu kam marre fabs-duhet?? pyete
}
}
L[n][n]=sqrt((float)B[n][n]);
//----------------------------
printf("Macierz trojdiagonalna L\n");
wyswietlanie(L,n);
float LT[MAX_SIZE][MAX_SIZE];
for(i=0;i<n;i++){
for(j=0;j<n;j++)
LT[i][j]=L[j][i];
}
printf("\n\nMAcierz LT\n");
wyswietlanie(LT,n);
Matrix S,SS,I,II; //S=(L)-1; SS=(LT)-1
//TW. (AT)-1=(A-1)T
S=Odwrotna(L,n);
printf("\nodwrotna matricy L\n");
wyswietlanie_ok(S.A,n);
for(i=0;i<n;i++){
for(j=0;j<n;j++)
SS.A[i][j]=S.A[j][i];
}
wyswietlanie_ok(SS.A,n);
tmp=mnozenie(S.A,A,n);
wyswietlanie(tmp.A,n);
C=mnozenie(tmp.A,SS.A,n);
printf("macierz C dla ktorej bedzie\n");
printf("zastosowana metoda Jacobiego\n\n");
wyswietlanie_ok(C.A,n);
temp=Jacobiego(C.A,n);
printf("\n\nWartosci walsne\n");
for(i=0;i<n;i++)
printf("%f\n",temp.A[i][i]);
printf("\n\n\n");
menu();
}
void main(int argc, _TCHAR* argv[])
{
obliczenia();
}
Krijoni Kontakt