Знаходження коренів систем лінійних рівнянь методом Гаусса, методом Зейделя та методом простих ітерацій

Автор: Пользователь скрыл имя, 17 Марта 2012 в 12:47, курсовая работа

Описание работы

Линейная алгебра – часть алгебры, изучающая векторные (линейные) пространства и их подпространства, линейные отображения (операторы), линейные, билинейные, и квадратичные функции на векторных пространствах.
Линейная алгебра, численные методы – раздел вычислительной математики, посвященный математическому описанию и исследованию процессов численного решения задач линейной алгебры.

Содержание

ВВЕДЕНИЕ…………………………………………………………………………5
1 ПОСТАНОВКА ЗАДАЧИ…………………………………………………......…6
2 ТЕОРЕТИЧЕСКАЯ ЧАСТЬ………………………………………………......….7
2.1 Разрешимость системы линейных уравнений…………………………7
2.2 Метод Гаусса…………………………….……………………..…….…..8
2.3 Метод простых итераций………………………………………………13
2.4 Метод Зейделя…………………………………………………………. 18
ВЫВОДЫ……………………………………………………………………......…21
ПЕРЕЧЕНЬ ССЫЛОК…………………………………………………

Работа содержит 1 файл

Курсова робота.doc

— 863.00 Кб (Скачать)

                            }

                            for (i=0; i<size; i++)

                                          delete coefficients[i];

                            delete coefficients;

              }

}

Zeidel.h

 

#include "stdafx.h"

#include <stdio.h>

#include <iostream>

#include <math.h>

using namespace std;

 

namespace ZEIDEL

{

              //===================== преобразование матрицы ========================================

              bool Change ( double **coefficients, double *rightPart, int col, int n)

              {

                            bool result = false;

                            int i, row = col;

                            double tempItem;

                            // для матрицы 1x1 ответом является ненулевость ее единственного элемента

                            if (col == n-1)

                            {

                                          result = coefficients[col][col] != 0;

                            }

                            else

                            {

                                          while (!result && row<n)

                                          {

                                                        if ( coefficients[row][col] != 0 )

                                                        {

                                                                      if (row != col)

                                                                      {

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

                                                                                    {

                                                                                                  tempItem = coefficients[col][i];

                                                                                                  coefficients[col][i] = coefficients[row][i];

                                                                                                  coefficients[row][i] = tempItem;

                                                                                    }               

                                                                                    tempItem = rightPart[col];

                                                                                    rightPart[col] = rightPart[row];

                                                                                    rightPart[row] = tempItem;                   

                                                                      }

                                                                      result = Change(coefficients, rightPart, col+1, n) ;

                                                                      if (result)

                                                                      {

                                                                                    break;

                                                                      }

                                                        }

                                                        row ++;

                                          }

                            }

 

                            return result;

              }

 

              //===================== получение корней системы методом Зейделя ========================================

              int iteration (double **coefficients, double *rightPart, int n, double *solution, double precision)

              {

                            bool result;

                            int i, j, step = 1;

                            double *tempSolution;

                            tempSolution = new double[n];                 

                            result = Change (coefficients, rightPart, 0, n);   

                            if (result)

                            {

                                          double fault = precision+1;

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

                                          {

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

                                                        {

                                                                      if (i!=j)

                                                                      {

                                                                                    coefficients[i][j] = - coefficients[i][j] / coefficients[i][i];

                                                                      }

                                                        }

                                                        rightPart[i] = rightPart[i] / coefficients[i][i];

                                                        coefficients[i][i] = 0;

                                          }

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

                                          {

                                                        solution[i] = rightPart[i];

                                          }

                                          while (fault > precision && step <= 1000)

                                          {

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

                                                        {

                                                                      tempSolution[j] = 0;

                                                        }

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

                                                        {

                                                                      for (j=0; j<i; j++)

                                                                      {

                                                                                    tempSolution[i] = tempSolution[i] + coefficients[i][j] * tempSolution[j];

                                                                      }

                                                                      for (j=i; j<n; j++)

                                                                      {

                                                                                    tempSolution[i] = tempSolution[i] + coefficients[i][j] * solution[j];

                                                                      }

                                                                      tempSolution[i] = tempSolution[i] + rightPart[i];

                                                        }

                                                        fault = 0;

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

                                                        {

                                                                      fault = fault + (solution[j] - tempSolution[j])*(solution[j] - tempSolution[j]);

                                                        }

                                                        fault = sqrt(fault);

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

                                                        {

                                                                      solution[j] = tempSolution[j];

                                                        }

                                                        step++;

                                          }

                            }

                            else

                            {

                                          step = 1001;

                            }

                            delete tempSolution;

                            return step;

              }

 

              //===================== нулевая главная диагональ ========================================

              void Zero (double **coefficients, double *rightPart, int n)

              {

                            int i, j, k, J;

                            double Z, X;

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

                            {

                                          if (coefficients[i][i] != 0)

                                          {

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

                                                        {

                                                                      if ((coefficients[j][i] != 0) && (j != i))

                                                                      {

                                                                                    J=j;

                                                                                    Z=coefficients[j][i];

                                                                                    X=coefficients[i][i];

                                                                                    break;                                                       

                                                                      }

                                                        }

                                                        for (k=0; k<n; k++)

                                                        {

                                                                      coefficients[i][k] = coefficients[i][k] - coefficients[J][k]*X/Z;

                                                        }

                                                        rightPart[i]=rightPart[i]-rightPart[J]*X/Z;

                                          }

                            }

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

                            {

                                          cout << "\n\n";

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

                                                        cout << coefficients[i][j] << "\t";

                            }

                            cout << "\n\nправая часть: ";

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

                                          cout << rightPart[i] << "  ";

              }

 

              void Zeidel()

              {

                            setlocale (LC_ALL, "Rus");

                            int i, j;

                            int size;

                            double precision;

                            cout << "\n\t\tМЕТОД ЗЕЙДЕЛЯ\n\n";

                            bool STOP;

                            do {

                                          cout << "введите размерность матрицы: ";

                                          cin >> size;

                                          if (size<1) {

                                                        STOP = false;

                                                        cout << "матрица должна быть не менее чем 2х2!\n";

                                          }

                                          else STOP = true;

                            } while (STOP == false);

 

                            double **coefficients = new double *[size];

                            for (i=0; i<size; i++)

                            {

                                          coefficients[i] = new double[size];

                            }

                            double *rightPart = new double[size];

                            double *solution = new double[size];

                            for (i=0; i<size; i++)

                            {

                                          cout << "введите строку " << i+1 << ": ";

                                          for (j=0; j<size; j++)

                                          {

                                                        cin >> coefficients[i][j];

                                          }

                            }

                            cout << "введите правую часть: ";

                            for (j=0; j<size; j++)

                            {

                                          cin >> rightPart[j];

                            }

                            cout << "введите точность решения: ";

                            cin >> precision;

                            Zero (coefficients, rightPart, size);

                            int steps = iteration(coefficients, rightPart, size, solution, precision);

                            cout << "\n*********************************" ;

                            for (i=0; i<size; i++)

                            {

                                          cout << "\n\n";

                                          for (j=0; j<size; j++)

                                                        cout << coefficients[i][j] << "\t";

                            }

                            cout << "\n\nправая часть: ";

                            for (i=0; i<size; i++)

                                          cout << rightPart[i] << "  ";

                            cout << "\n*********************************" ;

                            if (steps>1000)

                            {

                                          cout << "Решение для этой СЛАУ не существует или не найдено. Попробуйте решить СЛАУ другим методом.";

                            }

                            else {

                                          cout << "\nКорни системы:\n";

                                          for (j=0; j<size; j++)

                                          {

                                                        cout << "x" << j+1 << " = " <<solution[j] << "\n";

                                          }

                                          cout << "колличество итераций: " << steps;

                            }

                            for (i=0; i<size; i++)

                                          delete coefficients[i];

                            delete coefficients;  

Информация о работе Знаходження коренів систем лінійних рівнянь методом Гаусса, методом Зейделя та методом простих ітерацій