Mam pytanko. Czy istnieje jakies polecenie obliczania macierzy odwrotnej?
0
0
Google!!
Poniższa funkcja operuje na TStringGrid o nazwie Matrix. Przerobisz sobie do własnych potrzeb.
//---------------------------------------------------------------------------
void __fastcall TfMatEdit::InvertGauss (int col, int row, int n)
/* Funkcja liczy macierz odwrotną algorytmem Gaussa.
Parametry:
col - pierwsza kolumna macierzy
row - pierwszy wiersz macierzy
n - liczba kolumn/wierszy
*/
{long double d, temp, c, **a;
int i, j, k, m, nn, *ipvt;
ipvt = new int[n];
nn = n;
for (i=0; i<nn; i++)
ipvt[i] = i;
a = new long double*[n];
for (k=0; k<n; k++)
a[k] = new long double[n];
for (i=0; i<n; i++) //przepisanie macierzy do tablicy pomocniczej
for (j=0; j<n; j++)
a[i][j] = StrToFloat(Matrix->Cells[i+col][j+row]);
for (k = 0; k < nn; k++)
{temp = 0.;
m = k;
for (i = k; i < nn; i++)
{d = a[k][i];
if (fabs (d) > temp)
{temp = fabs (d);
m = i;
}
}
if (m != k)
{j = ipvt[k];
ipvt[k] = ipvt[m];
ipvt[m] = j;
for (j = 0; j < nn; j++)
{temp = a[j][k];
a[j][k] = a[j][m];
a[j][m] = temp;
}
}
d = 1 / a[k][k];
for (j = 0; j < k; j++)
{c = a[j][k] * d;
for (i = 0; i < nn; i++)
a[j][i] -= a[k][i] * c;
a[j][k] = c;
}
for (j = k + 1; j < nn; j++)
{c = a[j][k] * d;
for (i = 0; i < nn; i++)
a[j][i] -= a[k][i] * c;
a[j][k] = c;
}
for (i = 0; i < nn; i++)
a[k][i] = -a[k][i] * d;
a[k][k] = d;
}
for (i=0; i<nn; i++)
for (j=0; j<nn; j++)
Matrix->Cells[ipvt[i]+col][j+row] = FloatToStr(a[i][j]); //Zapisanie macierzy w dobrej kolejności
delete[] ipvt;
for (k=0; k<n; k++) //Kasowanie tablicy pomocniczej
delete[] a[k];
delete[] a;
}
//---------------------------------------------------------------------------
0
thx ;)