Консультация № 188157
30.10.2015, 00:04
0.00 руб.
0 0 0
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Есть матрица 14х14(задана как long double), нужно взять обратную матрицу от нее, но проблема в том что при решении значения выходят за границы long double. Если сделать ее 12х12 то все нормально, но если сделать больше 12х12 то не решается. Код писал по памяти(кроме матрицы), поэтому могут быть ошибки. Так же мне нужна точность на сколько это возможно, поэтому не использовал какие нибуть сокращения до определенных знаков. И динамически заданный массив мне не подходят(по определенным причинам).

П.с. Заранее спасибо!

Приложение:
A[0][0] = 1; A[0][1] = 0.866014; A[0][2] = 0.0745346; A[0][3] = 0.661429; A[0][4] = 0.829925; A[0][5] = 0.689922; A[0][6] = 0.425892; A[0][7] = 0.277215; A[0][8] = 0.352134; A[0][9] = 0.182359; A[0][10] = 0.37896; A[0][11] = 0.348349; A[0][12] = 0.817552; A[0][13] = 0.791896;
A[1][0] = 0.866014; A[1][1] = 1; A[1][2] = 0.968246; A[1][3] = 0.916515; A[1][4] = 0.97446; A[1][5] = 0.271314; A[1][6] = 0.216643; A[1][7] = -0.172131; A[1][8] = 0.188172; A[1][9] = -0.110496; A[1][10] = 0.196049; A[1][11] = 0.096608; A[1][12] = 0.987457; A[1][13] = 0.41433;
A[2][0] = 0.745346; A[2][1] = 0.968246; A[2][2] = 1; A[2][3] = 0.986013; A[2][4] = 0.927403; A[2][5] = 0.0417292; A[2][6] = -0.00988598; A[2][7] = -0.309305; A[2][8] = 0.0953449; A[2][9] = -0.156941; A[2][10] = 0.0665416; A[2][11] = 0.0923241; A[2][12] = 0.963265; A[2][13] = 0.194327;
A[3][0] = 0.661429; A[3][1] = 0.916515; A[3][2] = 0.986013; A[3][3] = 1; A[3][4] = 0.853868; A[3][5] = -0.0857702; A[3][6] = -0.171429; A[3][7] = -0.333014; A[3][8] = 0.067251; A[3][9] = -0.160046; A[3][10] = 0.0168243; A[3][11] = 0.14202; A[3][12] = 0.906429; A[3][13] = 0.0669494;
A[4][0] = 0.829925; A[4][1] = 0.97446; A[4][2] = 0.927403; A[4][3] = 0.853868; A[4][4] = 1; A[4][5] = 0.285788; A[4][6] = 0.32947; A[4][7] = -0.290134; A[4][8] = 0.111065; A[4][9] = -0.108613; A[4][10] = 0.0859867; A[4][11] = -0.0535607; A[4][12] = 0.993763; A[4][13] = 0.424397;
A[5][0] = 0.689922; A[5][1] = 0.271314; A[5][2] = 0.0417292; A[5][3] = -0.0857702; A[5][4] = 0.285788; A[5][5] = 1; A[5][6] = 0.753003; A[5][7] = 0.682594; A[5][8] = 0.385876; A[5][9] = 0.370417; A[5][10] = 0.501918; A[5][11] = 0.29467; A[5][12] = 0.217287; A[5][13] = 0.987989;
A[6][0] = 0.425892; A[6][1] = 0.216643; A[6][2] = -0.00988598; A[6][3] = -0.171429; A[6][4] = 0.32947; A[6][5] = 0.753003; A[6][6] = 1; A[6][7] = 0.23054; A[6][8] = 0.0653384; A[6][9] = -0.093685; A[6][10] = 0.42454; A[6][11] = -0.380585; A[6][12] = 0.231517; A[6][13] = 0.733815;
A[7][0] = 0.277215; A[7][1] = -0.172131; A[7][2] = -0.309305; A[7][3] = -0.333014; A[7][4] = -0.290134; A[7][5] = 0.682594; A[7][6] = 0.23054; A[7][7] = 1; A[7][8] = 0.475551; A[7][9] = 0.31573; A[7][10] = 0.676723; A[7][11] = 0.619839; A[7][12] = -0.300776; A[7][13] = 0.616482;
A[8][0] = 0.352134; A[8][1] = 0.188172; A[8][2] = 0.0953449; A[8][3] = 0.067251; A[8][4] = 0.111065; A[8][5] = 0.385876; A[8][6] = 0.0653384; A[8][7] = 0.475551; A[8][8] = 1; A[8][9] = 0.151664; A[8][10] = 0.483072; A[8][11] = 0.657261; A[8][12] = 0.111757; A[8][13] = 0.393679;
A[9][0] = 0.182359; A[9][1] = -0.110496; A[9][2] = -0.156941; A[9][3] = -0.160046; A[9][4] = -0.108613; A[9][5] = 0.370417; A[9][6] = -0.093685; A[9][7] = 0.31573; A[9][8] = 0.151664; A[9][9] = 1; A[9][10] = -0.400234; A[9][11] = 0.575396; A[9][12] = -0.122048; A[9][13] = 0.352422;
A[10][0] = 0.37896; A[10][1] = 0.196049; A[10][2] = 0.0665416; A[10][3] = 0.0168243; A[10][4] = 0.0859867; A[10][5] = 0.501918; A[10][6] = 0.42454; A[10][7] = 0.676723; A[10][8] = 0.483072; A[10][9] = -0.400234; A[10][10] = 1; A[10][11] = 0.18809; A[10][12] = 0.0793679; A[10][13] = 0.487557;
A[11][0] = 0.348349; A[11][1] = 0.096608; A[11][2] = 0.0923241; A[11][3] = 0.14202; A[11][4] = -0.0535607; A[11][5] = 0.29467; A[11][6] = -0.380585; A[11][7] = 0.619839; A[11][8] = 0.657261; A[11][9] = 0.575396; A[11][10] = 0.18809; A[11][11] = 1; A[11][12] = -0.00767146; A[11][13] = 0.307899;
A[12][0] = 0.817552; A[12][1] = 0.987457; A[12][2] = 0.963265; A[12][3] = 0.906429; A[12][4] = 0.993763; A[12][5] = 0.217287; A[12][6] = 0.231517; A[12][7] = -0.300776; A[12][8] = 0.111757; A[12][9] = -0.122048; A[12][10] = 0.0793679; A[12][11] = -0.00767146; A[12][12] = 1; A[12][13] = 0.362287;
A[13][0] = 0.791896; A[13][1] = 0.41433; A[13][2] = 0.194327; A[13][3] = 0.0669494; A[13][4] = 0.424397; A[13][5] = 0.987989; A[13][6] = 0.733815; A[13][7] = 0.616482; A[13][8] = 0.393679; A[13][9] = 0.352422; A[13][10] = 0.487557; A[13][11] = 0.307899; A[13][12] = 0.362287; A[13][13] = 1;

matr = 13;

for (int k = 0; k < matr; k++)
{
for (int p = 0; p < matr; p++)
{
B[k][p] = 0;
B[k][k] = 1;
}
}

for (int k = 0; k < matr+1; k++)
{
nn = 0.;
nn = A[k][k];
for (int p = k+1; p < matr+1; p++)
{
mm = 0.;
mm = A[p][k];
for (int pp = 0; pp < matr+1; pp++)
{
A[p][pp] = A[k][pp] * mm - A[p][pp] * nn;
B[p][pp] = B[k][pp] * mm - B[p][pp] * nn;
}
}
}

for (int k = 0; k < matr+1; k++)
{
for (int p = matr; p >= 0; p--)
{
sum = 0;
for (int pp = matr; pp > p; pp--)
sum += A[p][pp] * B[pp][k];
if (A[p][p] == 0.)
{
B[p][k] = 0.;
}
else
{
B[p][k] = (B[p][k] - sum) / A[p][p];
}
}
}

Обсуждение

Форма ответа