Gdzie są błędy w kodzie (Eliminacja Gaussa – Jordana w rozwiązywaniu układów równań liniowych)?

0

Witam. Mam problem z kodem. Jak w temacie - eliminacja. Po podaniu macierzy 3x4 wyskakują złe wartości.
Macierz wygląda następująco:
0 -1 2 -2
2 2 1 3
4 1 3 -1
Rozwiązanie powinno wyglądać tak, że wyskakują trzy x o wartościach -1, 2,4 , 0,2. Problem polega na tym aby po pierwsze wyświetlić całą tablicę i dodatkowo pod spodem te trzy x. Muszę również poprawić sposób wczytywania cyfr do macierzy, a szczerze gubię się w gąszczu tych pętli. Kod w chwili obecnej wygląda tak:

class Program
    {
        static void Main(string[] args)
        {
            const int n = 3;
            float max = 0;
            int r = 0;
            float p = 0;

            Console.WriteLine("Podaj A[1][1]: ");
            float a11 = float.Parse(Console.ReadLine());
            Console.WriteLine("Podaj A[1][2]: ");
            float a12 = float.Parse(Console.ReadLine());
            Console.WriteLine("Podaj A[1][3]: ");
            float a13 = float.Parse(Console.ReadLine());
            Console.WriteLine("Podaj A[1][4]: ");
            float a14 = float.Parse(Console.ReadLine());
            Console.WriteLine("Podaj A[2][1]: ");
            float a21 = float.Parse(Console.ReadLine());
            Console.WriteLine("Podaj A[2][2]: ");
            float a22 = float.Parse(Console.ReadLine());
            Console.WriteLine("Podaj A[2][3]: ");
            float a23 = float.Parse(Console.ReadLine());
            Console.WriteLine("Podaj A[2][4]: ");
            float a24 = float.Parse(Console.ReadLine());
            Console.WriteLine("Podaj A[3][1]: ");
            float a31 = float.Parse(Console.ReadLine());
            Console.WriteLine("Podaj A[3][2]: ");
            float a32 = float.Parse(Console.ReadLine());
            Console.WriteLine("Podaj A[3][3]: ");
            float a33 = float.Parse(Console.ReadLine());
            Console.WriteLine("Podaj A[3][4]: ");
            float a34 = float.Parse(Console.ReadLine());
            float[,] macierz = new float[,]
            {
                    {a11,a12,a13,a14 },
                    {a21,a22,a23,a24 },
                    {a31,a32,a33,a34 }
            };

            for(int k = 0; k <n-1; k++)
            {
                max = macierz[k, k];
                r = k;
                for(int i = k; i < n; i++)
                {
                    if(Math.Abs(macierz[i,k]) > Math.Abs(max))
                    {
                        max = macierz[i, k];
                        r = i;
                    }
                }
                if (max == 0)
                {
                    Console.WriteLine("Macierz układu osobliwa.");
                    break;
                }
                else
                {
                    for(int j=k; j < n+1;j++)
                    {
                        //int a = macierz[r,j];
                        macierz[k, j] = macierz[r, j];
                        //macierz[k,j]=a;
                    }
                    for(int j=k; j<n+1; j++)
                    {
                        macierz[k, j] = macierz[k, j] / max;
                    }
                    for(int i = 0; i < n-1; i++)
                    {
                        if(i!=k)
                        {
                            p = macierz[i, k];
                            for(int j = k; j < n+1; j++)
                            {
                                macierz[i, j] = macierz[i, j] - (p * macierz[k, j]);
                            }
                        }
                    }
                }

            }
            for(int i = 0; i < macierz.GetLength(0); i++)
            {
                for(int j = 0; j < macierz.GetLength(1); j++)
                {
                    Console.WriteLine(macierz[i,j] + "   " + " \t");
                }
                Console.WriteLine();
            }
        }
    }

Bardzo proszę aby ktoś mi po polsku, jak blondynce to wytłumaczył.

0

Jeśli chodzi o wczytywanie, to zrób sobie plik txt, w którym będziesz mieć macierz przykład. W kodzie go otwórz i wczytaj sobie do tablicy. Rozdziel sobie program też na jakieś metody, będzie ci się lepiej czytać i łatwiej znajdziesz błąd.

0

wiem, że było by łatwiej, ale dostaliśmy schemat blokowy według którego mamy to zadanie zrobić.

Schemat blokowy to jest pokazany pewien algorytm w sposób graficzny. A jak ty to zaimplementujesz to twoja sprawa.

0

title

0

Tak jak napisałem, Czytaj dane nic nie mówi o tym jak masz to robić. Może to być z pliku tekstowego co ułatwi testowanie i życie. Ponadto z boku po lewej stronie przy tych pionowych strzałkach masz na niebiesko napisane informacje, które dla mnie pokazują co powinno iść do osobnej metody

0

@Klaudia Capik:
https://introcs.cs.princeton.edu/java/95linear/GaussianElimination.java.html

Jak widać prof. Sedgewick i spółka, sprawdzając singularity, używają epsilona, a nie bezpośredniego == 0.

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