Автор: T****@yandex.ru, 28 Ноября 2011 в 13:49, курсовая работа
Решение систем линейных алгебраических уравнений – одна из основных задач вычислительной линейной алгебры. Хотя задача решения системы линейных уравнений сравнительно редко представляет самостоятельный интерес для приложений, от умения эффективно решать такие системы часто зависит сама возможность математического моделирования самых разнообразных процессов с применением ЭВМ. Значительная часть численных методов решения различных (в особенности – нелинейных) задач включает в себя решение систем линейных уравнений как элементарный шаг соответствующего алгоритма.
Введение 4
Постановка задачи 7
Условие задачи 7
Алгоритм решения системы линейных уравнений методом Гаусса 7
Анализ существующих методов решения задачи 9
Метод Гаусса (схема единственного деления) 10
Метод Гаусса с выбором главного элемента 13
Метод оптимального исключения 14
Сравнение прямых и итерационных методов 16
Описание алгоритма 18
Блок-схемы алгоритма 19
Листинг программы 22
Выполнение программы 26
Список использованной литературы
.
(2.16)
На k-м шаге, используя первые k уравнений, исключаем неизвестные x1,..,xk из (k+1)-го уравнения. Затем посредством этого уравнения исключается неизвестное xk+1 из первых k уравнений и т.д. В результате прямого хода матрица системы приводится к диагональному виду с единицами на главной диагонали. При этом отпадает необходимость обратного хода, поскольку столбец правой части приведенной матрицы и является вектором решения.
.
Как и в методе оптимального исключения, матрица системы приводится к диагональному виду и вектором решения является столбец .
2.8. Сравнение прямых и итерационных методов
Системы линейных алгебраических уравнений можно решать как с помощью прямых, так и итерационных методов. Для систем уравнений средней размерности чаще используют прямые методы.
Итерационные методы применяют главным образом для решения задач большой размерности, когда использование прямых методов невозможно из-за ограничений в доступной оперативной памяти ЭВМ или из-за необходимости выполнения чрезмерно большого числа арифметических операций. Большие системы уравнений, возникающие в основном в приложениях, как правило являются разреженными. Методы исключения для систем с разреженным и матрицами неудобны, например, тем, что при их использовании большое число нулевых элементов превращается в ненулевые и матрица теряет свойство разреженности. В противоположность им при использовании итерационных методов в ходе итерационного процесса матрица не меняется, и она, естественно, остается разреженной. Большая эффективность итерационных методов по сравнению с прямыми методами тесно связанна с возможностью существенного использования разреженности матриц.
Применение
Классическим
методом решения систем линейных алгебраических
уравнений (СЛАУ) является метод Гаусса.
На первом этапе этого метода осуществляется
так называемый прямой ход, когда путём
элементарных преобразований над строками
систему приводят к ступенчатой или треугольной
форме, либо устанавливают, что система
несовместна. А именно, среди элементов
первого столбца матрицы выбирают ненулевой,
перемещают его на крайнее верхнее положение
перестановкой строк и вычитают получавшуюся
после перестановки первую строку из остальных
строк, домножив её на величину, равную
отношению первого элемента каждой из
этих строк к первому элементу первой
строки, обнуляя тем самым столбец под
ним. После того, как указанные преобразования
были совершены, первую строку и первый
столбец мысленно вычёркивают и продолжают
пока не останется матрица нулевого размера.
Если на какой-то из итераций среди элементов
первого столбца не нашёлся ненулевой,
то переходят к следующему столбцу и проделывают
аналогичную операцию.
На втором этапе осуществляется
так называемый обратный ход, суть которого
заключается в том, чтобы выразить все
получившиеся базисные переменные через
небазисные и построить фундаментальную
систему решений либо, если все переменные
являются базисными, то выразить в численном
виде единственное решение системы линейных
уравнений. Эта процедура начинается с
последнего уравнения, из которого выражают
соответствующую базисную переменную
(а она там всего одна) и подставляют в
предыдущие уравнения, и так далее, поднимаясь
по «ступенькам» наверх. Каждой строчке
соответствует ровно одна базисная переменная,
поэтому на каждом шаге, кроме последнего
(самого верхнего), ситуация в точности
повторяет случай последней строки.
5.
Листинг
программы.
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls;
const MaxDimension = 10;
type
Vector = array[1..MaxDimension] of Double;
Matrix = array[1..MaxDimension] of Vector;
TForm3 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
StringGrid1: TStringGrid;
StringGrid2: TStringGrid;
Button1: TButton;
Label2: TLabel;
Label3: TLabel;
ListBox1: TListBox;
procedure Edit1Change(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form3: TForm3;
implementation
{$R *.dfm}
procedure TForm3.Button1Click(Sender: TObject);
var a: Matrix;
b,x: Vector;
h: Double;
i,j,k,n:integer;
begin
//Ввод данных
//Размерность системы
n := StrToIntDef(Text, StringGrid1.ColCount);
//Коэффициенты
for j := 0 to n - 1 do
for i := 0 to n - 1 do
a[i + 1, j + 1] := StrToFloatDef(StringGrid1.
//Правая часть уравнения
for I := 0 to n - 1
do b[i + 1] := StrToFloatDef(StringGrid2.
//Прямой ход - исключение переменных
for i:=1 to n-1 do
for j:=i+1 to n do
begin
a[j,i]:=-a[j,i]/a[i,i];
for k:=i+1 to n do
a[j,k]:=a[j,k]+a[j,i]*a[i,k];
b[j]:=b[j]+a[j,i]*b[i]
end;
x[n]:=b[n]/a[n,n];
//Обратный ход - нахождение корней
for i:=n-1 downto 1 do
begin
h:=b[i];
for j:=i+1 to n do h:=h-x[j]*a[i,j];
x[i]:=h/a[i,i]
end;
//Вывод результата
for i:=1 to n do ListBox1.Items.Append('x(' + IntToStr(i) + ')=' + FloatToStr(x[i]));
end;
procedure TForm3.Edit1Change(Sender: TObject);
begin
with StringGrid1, Edit1 do
begin
ColCount := StrToIntDef(Text, 3);
RowCount := StrToIntDef(Text, 3);
end;
with StringGrid2, Edit1 do
RowCount := StrToIntDef(Text, 3)
end;
procedure TForm3.FormCreate(Sender: TObject);
var i, j: integer;
begin
//Заполнить коэф уравнения
Randomize;
for I := 0 to StrToIntDef(Text, StringGrid1.ColCount) - 1 do
for J := 0 to StrToIntDef(Text, StringGrid1.RowCount) - 1 do
StringGrid1.Cells[I, J] := IntToStr(Random(100));
for I := 0 to StrToIntDef(Text, StringGrid2.RowCount) - 1 do
StringGrid2.Cells[0, I] := IntToStr(Random(100))
end;
end.
6.Выполнение
программы
Рис 6.1
Рис 6.2
Список
использованной литературы: