Witam, mam problem z programami w obydwóch chodzi prawie o to samo. Mam wyznaczyć macierze schodkowe w programie Interpolacja Lagrange oraz w programie Eliminacji Gaussa.
W Lagrange: wszystko działa ładnie dla macierzy maks 5x5 w przypadku 6x6 i wyższych program sie zawiesza.
W Metodzie Eliminacji Gaussa: działa dla dużych wartości ale wyświetla czasami a nawet dość często wartości ,,-0" w macierzy schodkowej która jest wyzerowana.
Nie chce gotowego kodu żeby wkleić tylko jakąś podpowiedź albo nakierowanie na to bym znalazł problem.
ELIMINACJA GAUSSA:
#include <iostream>
using namespace std;
class EG
{
private:
int rozmiar;
long double **macierz;
public:
void wprowadzanie()
{
cin>>rozmiar;
macierz=new long double*[rozmiar];
for(int i=0;i<rozmiar+1;i++)
macierz[i]=new long double[rozmiar+1];
for(int i=0;i<rozmiar;i++)
for(int j=0;j<rozmiar+1;j++)
cin>>macierz[i][j];
}
void drukuj()
{
cout.precision(4);
for(int i=0;i<rozmiar;i++)
{
for(int j=0;j<rozmiar+1;j++)
cout<<macierz[i][j]<<"\t";
cout<<endl;
}
}
//zamienia miejscami wiersze w wskazanym wierszu
void element_max(int nr_wier)
{
int nr_kol=nr_wier;
int maks=macierz[nr_wier][nr_kol];
int wiersz_z_maks=nr_wier;
for(int j=nr_wier+1;j<rozmiar;j++)
if(macierz[j][nr_kol]>maks)
{
maks=macierz[j][nr_kol];
wiersz_z_maks=j;
}
for(int i=nr_wier;i<rozmiar;i++)
{
float tmp;
tmp=macierz[nr_wier][i];
macierz[nr_wier][i]=macierz[wiersz_z_maks][i];
macierz[wiersz_z_maks][i]=tmp;
}
}
void wyzn_mac_schodkowej()
{
int a=1,b=0,c;// zmienne pomocnicze
long double wsp;
element_max(0);
//wyznaczenie ,,1" w pierwszym wierszu a00
float dzielnik=macierz[0][0];
for(int i=0;i<=rozmiar;i++)
macierz[0][i]=macierz[0][i]/dzielnik;
while(a<rozmiar)
{
c=a;
element_max(a);
for(int i=a;i<rozmiar;i++)
{
wsp=(macierz[c][b]/macierz[b][b]); //wyznaczanie wspolczynnika
//zerowanie elementow w kolumniie
for(int j=b;j<=rozmiar;j++)
{
macierz[i][j]=macierz[i][j]-(wsp*macierz[a-1][j]);
}
//wyznaczanie "1" na przekatnej
dzielnik=macierz[i][i];
for(int k=0;k<=rozmiar;k++)
macierz[i][k]=macierz[i][k]/dzielnik;
c++;
}
a++;
b++;
}
}
};
int main()
{
EG obiekt1;
obiekt1.wprowadzanie();
obiekt1.drukuj();
obiekt1.wyzn_mac_schodkowej();
obiekt1.drukuj();
return 0;
}
INTERPOLACJA LAGRANGE
#include <iostream>
#include <math.h>
using namespace std;
class lagrange
{
float *tabX;
float *tabY;
long double **macierzA;
int rozmiar;
public:
void wprowadzanie()
{
cin>>rozmiar;
tabX=new float [rozmiar];
tabY=new float [rozmiar];
for(int i=0;i<rozmiar;i++)
{
cin>>tabX[i];
cin>>tabY[i];
}
}
void tworzenie_macierzA()
{
macierzA=new long double *[rozmiar];
for(int i=0;i<rozmiar;i++)
macierzA[i]=new long double [rozmiar];
for(int i=0;i<rozmiar;i++)
for(int j=0;j<rozmiar;j++)
macierzA[i][j]=pow(tabX[i],j);
}
void wyzn_mac_schodkowej()
{
int a=1,b=0,c;// zmienne pomocnicze
long double wsp;
while(a<rozmiar)
{
c=a;
for(int i=a;i<rozmiar;i++)
{
wsp=(macierzA[c][b]/macierzA[b][b]); //wyznaczanie wspolczynnika
//zerowanie elementow w kolumniie
for(int j=b;j<=rozmiar;j++)
{
macierzA[i][j]=macierzA[i][j]-(wsp*macierzA[a-1][j]);
}
c++;
}
a++;
b++;
}
}
void wyswietl()
{
for(int i=0;i<rozmiar;i++)
{
for(int j=0;j<rozmiar;j++)
cout<<macierzA[i][j]<<"\t";
cout<<"\n";
}
}
};
int main()
{
lagrange obiekt1;
obiekt1.wprowadzanie();
obiekt1.tworzenie_macierzA();
obiekt1.wyswietl();
obiekt1.wyzn_mac_schodkowej();
obiekt1.wyswietl();
return 0;
}