Метод Гаусса с выбором главной переменной
(
практическая работа по компьютерной алгебре
)
Текст программы.
#include <fstream.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
const num = 4;
int i,j,I,J;
int c[num+1];
long double x[num+1];
long double max;
long double A[num][num+1];
// -----------------------------------------------------------
void max_el(int sr, int st)
{ max = A[num+1-sr][num+2-st];
I = num+1-sr;
J = num+2-st;
for (i = num+1-sr ; i<=num ; i++)
{
for (j = num+2-st ; j<=num ; j++)
{
if (fabs(A[i][j]) > fabs(max))
{
max = A[i][j];
I = i;
J = j;
}
}
}
cout << "\n\n Max = " << max << " I=" << I<< " J=" << J;
}
// -----------------------------------------------------------
void print(int sr,int st)
{
cout << "\n";
int i,j;
for (i = num+1-sr ; i<=num ; i++)
{
for (j = num+2-st ; j<=num+1 ; j++)
{
if (A[i][j] < 0 ) gotoxy(12*j + j - 1,i+1);
else gotoxy(12*j + j,i+1);
cout << A[i][j];
}
}
}
// ------------------------------------------------------------------
void preob(int S)
{
int i,j;
long double temp;
for (j = S; j<=num+1; j++) A[S][j] = A[S][j]/max;
for (i = S + 1; i <= num; i++)
{
temp = A[i][S];
for (j = S; j<= num+1 ; j++) A[i][j] = A[i][j] - A[S][j]*temp;
}
}
// ------------------------------------------------------------------
void perestanovka(int sr,int st)
{
if (J != (num+1-sr))
{
for (i = 1; i<=num; i++) {
A[i][J] = A[i][J] + A[i][num+1-sr];
A[i][num+1-sr] = A[i][J] - A[i][num+1-sr];
A[i][J] = A[i][J] - A[i][num+1-sr];
}
c[J] = c[J] + c[num+1-sr];
c[num+1-sr] = c[J] - c[num+1-sr];
c[J] = c[J] - c[num+1-sr];
}
if (I != (num+2-st))
{
for (j = 1; j<=num+1; j++) {
A[I][j] = A[I][j] + A[num+2-st][j];
A[num+2-st][j] = A[I][j] - A[num+2-st][j];
A[I][j] = A[I][j] - A[num+2-st][j]; }
}
}
// ------------------------------------------------------------------
void otvet()
{
float temp;
for (i=num; i>=1; i--)
{
temp = A[i][num+1];
for(j = num; j > i; j--) temp = temp - A[i][j]*x[j];
x[i] = temp/A[i][i];
}
}
// ------------------------------------------------------------------
void interface()
{
clrscr();
print(num,num+1);
cout << "\n Массив перестановок столбцов ";
for (i = 1; i <= num ;i++) cout << " " << c[i];
}
// ------------------------------------------------------------------
void load_file()
{
char ch;
ifstream in("c:\\gauss\\mat.dat");
cout << "\n";
for (i = 1 ; i<=num ; i++)
{
c[i] = i;
while (ch != '|') in >> ch;
ch = 'q';
for (j = 1 ; j<=num+1 ; j++) in >> A[i][j];
}
}
// ------------------------------------------------------------------
void main()
{
clrscr();
load_file();
int g;
for(g = num+1; g >= 3; g--)
{
interface(); max_el(g-1,g); getch();
perestanovka(g-1,g); interface(); getch();
preob(num+2-g); interface(); getch();
}
clrscr();
print(num,num+1);
otvet();
print(num,num+1);
cout << "\n\n ";
long double X[num];
for (i=1; i<=num; i++) X[c[i]] = x[i];
for (i=1; i<=num; i++) cout << " X" << i << " = " << X[i];
getch();
}
Тестовые задания.
Задание №1 (найти неизвестные):
4.24x1
+ 2.73x2
- 1.55x3
= 1.87
2.34x1
+ 1.27x2
+ 3.15x3
= 2.16
3.05x1
- 1.05x2
- 0.63x3
= -1.25
1.1 Результат выполнения программы:
x1
= - 0.025461 x2
= 0.915112 x3
= 0.335678
1.2 Расчёт погрешности вычисления:
4.24*(- 0.025461) + 2.73*0.915112 - 1.55*0.335678 = 1,87000022 погрешность: 2,2*10-7
2.34*(- 0.025461) + 1.27*0.915112 + 3.15*0.335678 = 2,1599992 погрешность: 8,0*10-7
3.05*(- 0.025461) - 1.05*0.915112 - 0.63*0.335678 = -1,25000079 погрешность: 7,9*10-7
средняя погрешность вычисления: 6,0*10-7
Задание №2 (найти неизвестные):
3.81x1
+ 0.25x2
+ 1.28x3
+ (0.75+a)x4
= 4.21
2.25x1
+ 1.32x2
+ (4.5+a)x3
+ 0.49x4
= 6.47+b
5.31x1
+ (0.28+a) x2
+ 0.98x3
+ 1.04x4
= 2.38
(9.39+a)x1
+ 2.45x2
+ 3.35x3
+ 2.28x4
= 10.48+b
a = (0,1,2,3,4) b = (0,1,2,3,4,5)
2.1 Таблица значений.
a
|
b
|
Ответы:
|
0
|
0
|
X1 = -12.660899
|
|
|
X2 = -16.107649
|
|
|
X3 = 5.273899
|
|
|
X4 = 66.299137
|
|
1
|
X1 = -12.132586
|
|
|
X2 = -14.858407
|
|
|
X3 = 5.186943
|
|
|
X4 = 63.347289
|
|
2
|
X1 = -11.604272
|
|
|
X2 = -13.609166
|
|
|
X3 = 5.099988
|
|
|
X4 = 60.39544
|
|
3
|
X1 = -11.075957
|
|
|
X2 = -12.359925
|
|
|
X3 = 5.013031
|
|
|
X4 = 57.443595
|
|
4
|
X1 = -10.547642
|
|
|
X2 = -11.110685
|
|
|
X3 = 4.926076
|
|
|
X4 = 54.491746
|
|
5
|
X1 = -10.019327
|
|
|
X2 = -9.861445
|
|
|
X3 = 4.839121
|
|
|
X4 = 51.539901
|
1
|
0
|
X1 = 13.959632
|
|
|
X2 = -39.106359
|
|
|
X3 = 7.324007
|
|
|
X4 = -27.756765
|
|
1
|
X1 = 16.668562
|
|
|
X2 = -46.672114
|
|
|
X3 = 8.73446
|
|
|
X4 = -33.605312
|
|
2
|
X1 = 19.377489
|
|
|
X2 = -54.237864
|
|
|
X3 = 10.144913
|
|
|
X4 = -39.453861
|
|
3
|
X1 = 22.086416
|
|
|
X2 = -61.803618
|
|
|
X3 = 11.555367
|
|
|
X4 = -45.30241
|
|
4
|
X1 = 24.795347
|
|
|
X2 = -69.369373
|
|
|
X3 = 12.96582
|
|
|
X4 = -51.150959
|
|
5
|
X1 = 27.504276
|
|
|
X2 = -76.935127
|
|
|
X3 = 14.376274
|
|
|
X4 = -56.999508
|
2
|
0
|
X1 = 1.033843
|
|
|
X2 = -1.696273
|
|
|
X3 = 0.997951
|
|
|
X4 = -0.211727
|
|
1
|
X1 = 1.191176
|
|
|
X2 = -2.016845
|
|
|
X3 = 1.183171
|
|
|
X4 = -0.486773
|
|
2
|
X1 = 1.348508
|
|
|
X2 = -2.337417
|
|
|
X3 = 1.36839
|
|
|
X4 = -0.761819
|
|
3
|
X1 = 1.505841
|
|
|
X2 = -2.657989
|
|
|
X3 = 1.55361
|
|
|
X4 = -1.036865
|
|
4
|
X1 = 1.663174
|
|
|
X2 = -2.978561
|
|
|
X3 = 1.73883
|
|
|
X4 = -1.311911
|
|
5
|
X1 = 1.820507
|
|
|
X2 = -3.299134
|
|
|
X3 = 1.92405
|
|
|
X4 = -1.586957
|
3
|
0
|
X1 = 0.772977
|
|
|
X2 = -0.794749
|
|
|
X3 = 0.762146
|
|
|
X4 = 0.13016
|
|
1
|
X1 = 0.872765
|
|
|
X2 = -0.954303
|
|
|
X3 = 0.902687
|
|
|
X4 = -0.008559
|
|
2
|
X1 = 0.972553
|
|
|
X2 = -1.113856
|
|
|
X3 = 1.043229
|
|
|
X4 = -0.147278
|
|
3
|
X1 = 1.072341
|
|
|
X2 = -1.27341
|
|
|
X3 = 1.18377
|
|
|
X4 = -0.285998
|
|
4
|
X1 = 1.172129
|
|
|
X2 = -1.432964
|
|
|
X3 = 1.324311
|
|
|
X4 = -0.424717
|
|
5
|
X1 = 1.271917
|
|
|
X2 = -1.592518
|
|
|
X3 = 1.464853
|
|
|
X4 = -0.563436
|
4
|
0
|
X1 = 0.675128
|
|
|
X2 = -0.476895
|
|
|
X3 = 0.645225
|
|
|
X4 = 0.196021
|
|
1
|
X1 = 0.754634
|
|
|
X2 = -0.580642
|
|
|
X3 = 0.763131
|
|
|
X4 = 0.105936
|
|
2
|
X1 = 0.83414
|
|
|
X2 = -0.68439
|
|
|
X3 = 0.881037
|
|
|
X4 = 0.015852
|
|
3
|
X1 = 0.913647
|
|
|
X2 = -0.788137
|
|
|
X3 = 0.998942
|
|
|
X4 = -0.074233
|
|
4
|
X1 = 0.993153
|
|
|
X2 = -0.891884
|
|
|
X3 = 1.116848
|
|
|
X4 = -0.164317
|
|
5
|
X1 = 1.072659
|
|
|
X2 = -0.995631
|
|
|
X3 = 1.234754
|
|
|
X4 = -0.254402
|
|