Jakiś czas temu wygrzebałem w systemie Windows kompilator języka C# ale do tej pory
nie znalazłem dobrego samouczka do tego języka
Oto kod programu do rozwiązywania układów równań liniowych
using System;
using System.IO;
using System.Globalization;
namespace LUdecomposition
{
class LUdecomposition
{
public const double ZERO = 1.0e-15;
public static void Main()
{
char esc;
string str,path;
int i,j,n;
double[,] A;
double[] b;
int[] p;
double d;
NumberFormatInfo nfi = new NumberFormatInfo();
nfi.NumberDecimalSeparator = ".";
Console.WriteLine("Podaj ścieżkę do pliku w którym chcesz zapisać wynik");
path = Console.ReadLine();
using(StreamWriter sw = new StreamWriter(path,true))
{
do
{
try
{
Console.Clear();
Console.WriteLine("Rozwiązywanie układów równań liniowych metodą rozkładu macierzy LU = PA");
Console.WriteLine();
Console.WriteLine("Podaj liczbę równań n=");
str = Console.ReadLine();
int.TryParse(str,out n);
A = new double[n,n];
b = new double[n];
p = new int[n];
for(i = 0;i < n;i++)
{
Console.WriteLine("Wprowadz " + (i+1).ToString(nfi) + ". wiersz macierzy");
for(j = 0;j < n;j++)
{
str = Console.ReadLine();
double.TryParse(str,out A[i,j]);
}
Console.WriteLine("Wprowadz " + (i+1).ToString(nfi) + ". wyraz wolny");
str = Console.ReadLine();
double.TryParse(str,out b[i]);
}
FactorLU(n,A,p,out d);
sw.WriteLine(d.ToString(nfi));
for(i = 0;i < n && Math.Abs(d) > ZERO ;i++)
{
for(j = 0;j < n; j++)
{
Console.Write(A[i,j].ToString(nfi)+" , ");
sw.Write(A[i,j].ToString(nfi) + " , ");
}
Console.WriteLine();
sw.WriteLine();
}
if(Math.Abs(d) <= ZERO)
{
SolveLU(n,A,p,b);
for(i = 0;i < n && Math.Abs(d) > ZERO ;i++)
{
Console.WriteLine(b[i].ToString(nfi));
sw.WriteLine(b[i].ToString(nfi));
}
Console.WriteLine();
sw.WriteLine();
}
}
catch(System.IndexOutOfRangeException e)
{
}
esc = (char)Console.ReadKey().Key;
}
while(esc != (char)ConsoleKey.Escape);
}
}
public static void FactorLU(int n,double[,] A,int[] p,out double d)
{
int k,i,j,l;
double pmax,tmp;
d = 1.0;
for(k = 0;k < n ;k++)
{
pmax = Math.Abs(A[k,k]);
l = k;
for(j = k + 1;j < n; j++)
{
if(Math.Abs(A[j,k]) > pmax)
{
pmax = Math.Abs(A[j,k]);
l = j;
}
}
if(l != k)
{
for(j = 0;j < n; j++)
{
tmp = A[k,j];
A[k,j] = A[l,j];
A[l,j] = tmp;
}
d = -d;
}
d *= A[k,k];
if(pmax <= ZERO)
return ;
p[k] = l;
for(i = k + 1; i < n; i++)
{
A[i,k]/=A[k,k];
for(j = k + 1;j < n; j++)
A[i,j] -= A[i,k]*A[k,j];
}
}
}
public static void SolveLU(int n,double[,] LU,int[] p,double[] b)
{
int i,k;
double tmp;
for(k = 0;k < n - 1; k++)
{
tmp = b[k];
b[k] = b[p[k]];
b[p[k]] = tmp;
}
for(k = 1;k < n; k++)
for(i = 0; i < k; i++)
b[k] -= b[i]*LU[k,i];
for(k = n - 1; k >= 0; k--)
{
for(i = k + 1;i < n; i++)
b[k] -= LU[k,i]*b[i];
b[k] /= LU[k,k];
}
}
}
}
Dotychczas dowiedziałem się jak wczytywać dane z pliku linia po linii do łańcucha
Przeglądając anglojęzyczne fora zobaczyłem że można użyć funkcji Split
do tego aby pociąć łańcuch a następnie iterując po utworzonej tablicy parsować elementy tej tablicy
funkcją TryParse
jednak wymaga ona utworzenia dodatkowej tablicy co sprawia że rozwiązanie nie jest optymalne pamięciowo
i szukam czegoś innego