[C++] Rozkład Choleskiego

Problemowa
Użytkownik
Użytkownik
Posty: 27
Rejestracja: 25 lis 2012, o 14:56
Płeć: Kobieta
Lokalizacja: 3city

[C++] Rozkład Choleskiego

Post autor: Problemowa »

Dzień dobry,

piszę program na rozkład Choleskiego w C++ używając Code::Blocks. Napisałam już wczytywanie macierzy (zakładam, że użytkownik jest na tyle inteligentny, że wprowadza macierz z twierdzenia Banachiewicza). Ale nie działa mi obliczanie elementów \(\displaystyle{ l_{ij}, l_{ii}}\) co powinnaś poprawić?

Kod: Zaznacz cały

#include <iostream>
#include <iomanip>
#include <cmath>
#include <cstdlib>

using namespace std;

int main()
{
  int i,j,k,n,p;
  double sum;
  cout << "Podaj rozmiar macierzy A = "; //podanie rozmiaru
  cin >> n;
  p=n*n;
  double * A = new double[p];
  double * B = new double[p];
  cout << "Podaj elementy macierzy A = "; //wczytanie macierzy
    for(i = 0; i < n; i++)
      for(j = 0; j < n; j++) cin >> A[i * n + j];
      cout << endl;

      //kontrolne wypisanie macierzy
  for(i = 0; i < n; i++)
   {
    for(j = 0; j < n; j++) cout << A[i * n + j] << " ";
    cout << endl;
   }

//obliczanie elementow ?????????????????????????????????????/
for (i=0;i<n;i++){
 for (j=i;i<n;j++){
     for (sum=A[i * n + j];k=i+1;k++) sum=A[i * n + k]*A[j * n + k];
         if(i==j) nerror("nie dziala");{
           B[i]=sqrt(sum);
           } else A[i*n+j] = sum/B[i];
}

 //?????????????????????????????????????????????????????

 system("pause");
  return 0;
  }
Ostatnio zmieniony 2 gru 2012, o 11:35 przez Afish, łącznie zmieniany 1 raz.
Powód: Staraj się lepiej dobierać nazwy tematów, tak by wskazywały o czym jest treść zadania. Stosuj tagi.
royas
Użytkownik
Użytkownik
Posty: 363
Rejestracja: 24 sie 2012, o 09:27
Płeć: Mężczyzna
Lokalizacja: Cieszyn
Pomógł: 80 razy

[C++] Rozkład Choleskiego

Post autor: royas »

Warunkek w pętli w linii 32. jest dziwny. Jest przypisanie a nie porównanie. Taka pętla wykona się bardzo dużo (za dużo) razy.

W "if'ie" z 33 jest tylko "nerror", klamra otwierająca jest już równorzędna z if'em. Więc else z 35 nie ma odpowiadającego mu if'a.

Czy to się w ogóle kompiluje?
Problemowa
Użytkownik
Użytkownik
Posty: 27
Rejestracja: 25 lis 2012, o 14:56
Płeć: Kobieta
Lokalizacja: 3city

[C++] Rozkład Choleskiego

Post autor: Problemowa »

Kompiluje, ale bez tego nerror, tzn. jak usuwałam odpowiednie rzeczy, to się kompilowało, ale nie działa to jak należy...
royas
Użytkownik
Użytkownik
Posty: 363
Rejestracja: 24 sie 2012, o 09:27
Płeć: Mężczyzna
Lokalizacja: Cieszyn
Pomógł: 80 razy

[C++] Rozkład Choleskiego

Post autor: royas »

Wydaje mi się, że w linii 32 powinno być raczej coś w stylu:

Kod: Zaznacz cały

for(sum=0,k=0;k<j;k++) sum += A[i * n + k]*A[j * n + k]
A, co tu za bzdury przed chwilą napisałem.
Problemowa
Użytkownik
Użytkownik
Posty: 27
Rejestracja: 25 lis 2012, o 14:56
Płeć: Kobieta
Lokalizacja: 3city

[C++] Rozkład Choleskiego

Post autor: Problemowa »

Kod: Zaznacz cały

#include <iostream>
#include <iomanip>
#include <cmath>
#include <cstdlib>

using namespace std;

int main()
{
  int i,j,k,n,p;
  double sum;
  cout << "Podaj rozmiar macierzy A = "; //podanie rozmiaru
  cin >> n;
  p=n*n;
  double * A = new double[p];
  double * B = new double[p];
  cout << "Podaj elementy macierzy A = "; //wczytanie macierzy
    for(i = 0; i < n; i++)
      for(j = 0; j < n; j++) cin >> A[i * n + j];
      cout << endl;

      //kontrolne wypisanie macierzy
  for(i = 0; i < n; i++)
   {
    for(j = 0; j < n; j++) cout << A[i * n + j] << " ";
    cout << endl;
   }
 system("pause");
  return 0;
  }
Ta część programu działa, problemy pojawiają się po dopisaniu pętli odpowiedzialnych za obliczenie macierzy B, która ma być macierzą trójkątną dolna. Korzystamy z tych wzorów na poszczególne elementy macierzy trójkątnej dolnej. Nawet, jeśli poprawiam to i w miarę logicznie to wygląda to nie działa mi to nadal. Do programu mam jeszcze dopisać sprawdzanie określoności macierzy, ale na razie staram się zrobić główny szkielet, który może nie jest "idiotoodporny", ale działa w ogóle...
Ostatnio zmieniony 3 gru 2012, o 09:52 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
royas
Użytkownik
Użytkownik
Posty: 363
Rejestracja: 24 sie 2012, o 09:27
Płeć: Mężczyzna
Lokalizacja: Cieszyn
Pomógł: 80 razy

[C++] Rozkład Choleskiego

Post autor: royas »

Dwie organizacyjne sprawy.
Macierz w tablicy przechowujesz wierszami czy kolumnami
czyli A[i*n+j] to i-ty wiersz j-ta kolumna, czy j-ty wiersz i-ta kolumna?
Macierz wynikową chcesz obliczać wierszmi czy kolumnami? Czyli chcesz algorytm Choleskiego-Banachiewicza czy Choleskiego-Crouta?
Napisz jak teraz wygląda u Ciebie fragment obliczający elementy.
I czy wolisz tylko wskazówki co jest źle, czy raczej jak powinien wyglądać gotowy fragment.

Poniżej fragment, który powinien działać, macierz przechowywana wierszami i wypełniana też wierszami.
Ukryta treść:    
Problemowa
Użytkownik
Użytkownik
Posty: 27
Rejestracja: 25 lis 2012, o 14:56
Płeć: Kobieta
Lokalizacja: 3city

[C++] Rozkład Choleskiego

Post autor: Problemowa »

Właśnie o to chodziło Dziękuję ogromnie Naprawdę jest to bardzo duża pomoc dla mnie


A jakbym chciała jeszcze sprawdzać przed obliczeniem tej macierzy, czy jest ona dodatnio określona, to jak to powinnam zrobić? Za pomocą funkcji?
ODPOWIEDZ