Gauss-féle eliminációs eljárás

Lineáris egyenletrendszer megoldása. Az egyenletek együtthatóit a program a gauss.be állományból olvassa be. Pl:

gauss.be

5
0 2 3 4 5 7
2 3 4 6 4 0
5 5 5 5 5 6
3 3 1 1 4 7
9 4 2 3 1 5

A program még nem teljesen kész. (Mit is kell tenni, ha nem találunk egy adott ismeretlenhez nem nulla együtthatót?)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
 
namespace gauss
{
    class Program
    {
        static int N;
        static double[,] A;
        static double[] B;
        static int[] valtozo;
 
        static void beolvasas()
        {
            StreamReader be = new StreamReader("gauss.be");
            N = Convert.ToInt32(be.ReadLine());
            A = new double[N, N];
            B = new double[N];
            valtozo = new int[N];
            for (int i = 0; i < N; i++)
			{
			    valtozo[i] = i; 
			}
            for (int i = 0; i < N; i++)
            {
                string[] mezok = be.ReadLine().Split(' ');
                for (int j = 0; j < N; j++)
                {
                    A[i, j] = Convert.ToDouble(mezok[j]);
                }
                B[i] = Convert.ToDouble(mezok[N]);
            }
            be.Close();
        }
        static void kiir()
        {
            for (int i = 0; i < N; i++)
            {
                Console.Write("|  ");
                for (int j = 0; j < N; j++)
                {
                    Console.Write("{0:F2} ", A[i, j]);
                }
                Console.WriteLine(" |  {0:F2}  |", B[i]);
            }
            Console.WriteLine();
            Console.ReadKey();
        }
        static void oszlopcsere(int i, int j)
        {
            for (int sor = 0; sor < N; sor++)
            {
                double seged = A[sor, i];
                A[sor, i] = A[sor, j];
                A[sor, j] = seged;
 
                seged = valtozo[i];
                valtozo[i] = valtozo[j];
                valtozo[j] = (int)seged;
            }
        }
        static void sornormalas(int i)
        {
            double oszto = A[i, i];
            for (int j = 0; j < N; j++)
            {
                A[i, j] = A[i, j] / oszto;
            }
            B[i] = B[i] / oszto;
        }
        static void valtozokiejtes(int i, int k)
        {
            double szorzo = A[k, i];
            for (int j = 0; j < N; j++)
            {
                A[k, j] -= A[i, j] * szorzo;
            }
            B[k] -= B[i] * szorzo;
        }
        static void megoldas()
        {
            for (int i = 0; i < N; i++)
			{
			    Console.WriteLine("X{0} = {1}", valtozo[i]+1, B[i]);
			}
        }
        static void Main(string[] args)
        {
            beolvasas();
            kiir();
            for (int i = 0; i < N; i++)
            {
                int j = i;
                while (j < N && A[i, j] == 0) j++;
                if (j >= N) Console.WriteLine("Baj van! (Végtelen sok megoldás van?)");
                else
                {
                    oszlopcsere(i, j);
                    sornormalas(i);
                    for (int k = 0; k < N; k++)
                    {
                        if (k != i)
                        {
                            valtozokiejtes(i, k);
                        }
                    }
 
                }
                kiir();
            }
            megoldas();
 
            Console.ReadKey();
        }
    }
}
oktatas/informatika/programozas/feladatok/gauss.txt · Utolsó módosítás: 2019/06/04 14:18 szerkesztette: barnkopf
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0