Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Иллюстрирующий пример





 

Пусть дана система уравнений

 

или в матричной форме

 

Выбираем строку с максимальным коэффициентом ai1 и меняем ее с первой.

Нормируем уравнения относительно коэффициента при x1:

 

Вычитаем 1 уравнение из 2 и 3:

 

Выбираем строку с наибольшим коэффициентом при ai2 (уравнение 1 не рассматривается) и перемещаем ее на место 2.

 

Нормируем 2 и 3 уравнения относительно коэффициента при x2

 

Вычитаем уравнение 2 из 3

 

Нормируем уравнение 3 относительно коэффициента при x3

 

Откуда получаем x3 =2. Подставляем полученное значение в уравнения 2 и 1 получаем


 

Подставляя полученное значение x2 =5 в уравнение 1, найдем

 

Таким образом, решением системы уравнений будет вектор

 

 

Блок схема:

Код программы:

#include <iostream>
using namespace std;
// Вывод системы уравнений
void sysout(double **a, double *y, int n) {

for (int i = 0; i < n; i++) {

for (int j = 0; j < n; j++){

cout << a[i][j] << "*x" << j;

if (j < n - 1) {

cout << " + ";

}

}

cout << " = " << y[i] << endl;

}

return;
}

double * gauss(double **a, double *y, int n) {

double *x, max;

int k, index;

const double eps = 0.00001; // точность

x = new double[n];

k = 0;

while (k < n) {

// Поиск строки с максимальным a[i][k]

max = abs(a[k][k]);

index = k;

for (int i = k + 1; i < n; i++) {

if (abs(a[i][k]) > max) {

max = a[i][k];

index = i;

}

}

// Перестановка строк

if (max < eps) {

// нет ненулевых диагональных элементов

cout << "Решение получить невозможно из-за нулевого столбца ";

cout << index << "матрицы A" << endl;

return 0;

}

for (int j = 0; j < n; j++) {

double temp = a[k][j];

a[k][j] = a[index][j];

a[index][j] = temp;

temp = y[k];

y[k] = y[index];

y[index] = temp;

}

// Нормализация уравнений

for (int i = k; i < n; i++) {

double temp = a[i][k];

if (temp < eps) continue; // для нулевого коэффициента пропустить

 

for (int j = 0; j < n; j++) {

a[i][j] = a[i][j] / temp;

}

y[i] = y[i] / temp;

if (i == k) continue; // уравнение не вычитать само из себя

for (int j = 0; j < n; j++) {

a[i][j] = a[i][j] - a[k][j];

}

y[i] = y[i] - y[k];

}

k++;

}

// обратная подстановка

for (k = n - 1; k >= 0; k--) {

x[k] = y[k];

for (int i = 0; i < k; i++) {

y[i] = y[i] - a[i][k] * x[k];

}

}

return x;
}

int main() {

double **a, *y, *x;

int n;

system("chcp 1251");

system("cls");

cout << "Введите количество уравнений: ";

cin >> n;

a = new double*[n];

y = new double[n];

for (int i = 0; i < n; i++) {

a[i] = new double[n];

for (int j = 0; j < n; j++) {

cout << "a[" << i << "][" << j << "]= ";

cin >> a[i][j];

}

}

for (int i = 0; i < n; i++) {

cout << "y[" << i << "]= ";

cin >> y[i];

}

sysout(a, y, n);

x = gauss(a, y, n);

for (int i = 0; i < n; i++){

cout << "x[" << i << "]=" << x[i] << endl;

}

cin.get(); cin.get();

return 0;
}

Date: 2015-07-24; view: 395; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.006 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию