Wczytanie odpowiednich współczynników

0

Mam macierz G która wygląda następująco
1 3 0 0 0
1 2 1 0 0
0 1 2 1 0
0 0 1 2 1
0 0 0 1 1

wczytuje ją z pliku i teraz chce zeby do tablica A jednowymiarowej wczytać przekątną

title

napisałem taką funkcję,ale ona nie działa prawidłowo mógłby ktoś mnie nakierować?

void wczytaj_thomasa(double a[n-1],double G[n][2*n]){
for(int i=1;i<n-1;i++){
  for(int j=0;j<n-1;j++){
    a[i-1]=g[i][j];
  }
}
0

Indeksi idzie od 1 do n - 1. Oraz, Zrob pojedyncza petle, inkrementujaca i i j.

1

Hmmm, przekątne to przecie 12221 albo 00200...autorze wątku co wobec tego oznacza to zakreślenie?

0

Tak jest to metoda Thomasa.
Teraz mam nieco inny problem poradziłem sobie z tym dzięki radzie liona.
Thomas liczy prawidłowo dla macierzy podanej wyżej ,ale gdy już wygeneruje sobie jakąś macierz 5x5 to nie działa prawidłowo ,a Gauss i odwrotna liczy prawidłowo,bo mam zrobione jeszcze te algorytmy one liczą dobrze dla takich samych danych są takie same wyniki ,a Thomas ma inne.
Jedynie na tej przykładowej liczy dobrze.
Wiem że macierz musi być trójdiagonalna ale ja wczytuje tylko a,b,c no i d z odzielnnego pliku.
Wklejam cały kod na Thomasa
Mógłby ktoś wyjaśnić jak to poprawić albo co zrobić,jak wygenerować taką macierz która na wszystkich trzech algorytmach by dawała takie same wyniki?

#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
int i;
int j;
const int n=5;
double a[n-1];
double b[n];
double c[n-1];
double d[n];
double g[n][2*n];
double x[n];
double bet[n];
double gam[n];
void Thomas(double a[],double b[],double c[],double d[],double x[],double bet[],double gam[]){
bet[0]=-c[0]/b[0];
gam[0]=d[0]/b[0];
for(int i=1;i<n;i++){
    bet[i]=-(c[i]/((a[i]*bet[i-1])+b[i]));
    gam[i]=(d[i]-(a[i]*gam[i-1]))/((a[i]*bet[i-1])+b[i]);
}
x[n-1]=gam[n-1];
for(int i=n-2;i>=0;i--){
    x[i]=(bet[i]*x[i+1])+gam[i];
}
for(int i=0;i<n;i++){
    cout<<setw(3)<<x[i]<<"\t";
}
}
void wczytaj_z_pliku(double G[n][2*n]){
ifstream plik;
plik.open("m.txt");
for(int i=0;i<n;i++){
 for(int j=0;j<n;j++){
    plik>>G[i][j];
}
}
plik.close();
}
void wyswietl(double G[n][2*n]){
for(int i=0;i<n;i++){
    for(int j=0;j<n;j++){
    cout<<setw(5)<<G[i][j]<<"\t";
    }
    cout<<endl;
}
}
void wczytaj_thomasa(double a[n-1],double g[n][2*n]){
int i=1,j=0;
for(int x=0;x<n;x++){
a[i-1]=g[i][j];
i++;
j++;
}
i=0,j=0;
for(int x=0;x<n;x++){
b[i]=g[i][j];
i++;
j++;
}
i=0,j=1;
for(int x=0;x<n;x++){
c[i]=g[i][j];
i++;
j++;
}
}
void wczytaj_vektor(double d[n]){
ifstream plik;
plik.open("v.txt");
for(int i=0;i<n;i++)
    plik>>d[i];
plik.close();
}
int main()
{
cout<<"Macierz: ";
cout<<endl;
wczytaj_z_pliku(g);
wyswietl(g);
wczytaj_thomasa(a,g);
wczytaj_vektor(d);
cout<<"Wyniki: ";
Thomas(a,b,c,d,x,bet,gam);
return 0;
}

Dodam jeszcze kod go generowania macierzy i wektora (d)

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <ctime>
#include <iomanip>
const int n=5;
using namespace std;
void generator_m(){
ofstream plik;
plik.open("m.txt");
for(unsigned i=0;i<n;i++){
  for(unsigned j=0;j<n;j++){
    plik<<setw(3)<<rand()%20<<"\t";
  }
  plik<<endl;
}
}
void generator_v(){
ofstream plik;
plik.open("v.txt");
for(unsigned i=0;i<n;i++){
  plik<<rand()%20<<endl;
}
}
int main(){
srand(time(NULL));
generator_m();
generator_v();
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1