dev/cpp/gauss_miron/gauss.cpp

64 lines
2.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
int razmer; //размер матрицы
double **a, // матрица с коэфицентами
*x, // х
*b; // свободные члены
/* Здесь переменной razmer необходимо присвоить размер матрицы */
// создание динамических переменных
b = new double[razmer];
x = new double[razmer];
a = new double*[razmer];
for(int i=0; i < razmer; i++){
a[i] = new double[razmer];
}
/* Здесь нам надо присвоить значения матрице а, и заполнить свободные члены b */
// начинаем решать)
// частный случай, если размер матрицы == 1
if(razmer == 1){
if(a[0][0] != 0){
cout << "x=" << b[0]/a[0][0] << endl;
}else{
cout << "Х любое" << endl;
}
sleep(5);//getch();
exit(0);
}
// прямой проход
// идем слево на право по коэфицентам х
for(int k=0; k < razmer-1; k++){
// вычитаем по строкам
for(int m=k+1; m < razmer; m++){
// если на диагонали элемент = 0, то поменяем местами строки
if(a[m][m] == 0) exchange(a, razmer, m, get_n_no_empty(a, razmer, m));
double koeficent=a[m][k]/a[0][k];
//вычисление новых коэфицентов уравнения
b[m] = b[m] - b[0] * koeficent;
for(int z=0; z < razmer; z++){
a[m][z] = a[m][k] - a[0][k] * koeficent;
}
}
}
// ищем решения
for(int m=razmer-1; m >= 0; m--){
double sum=0;
// идем по строке спаво налево, считая сумму корень*коэфицент, до текущего корня
for(int i=razmer-1; i > m; i--){
sum += x[i] * a[m][i];
}
x[m] = (b[m] - sum)/a[m][m];
}
// вывод решений
cout << "###Решения:" << endl;
for(int i=0; i < razmer; i++){
cout << "x[" << i << "]=" << x[i] << endl;
}
pause();
}