Решение системы линейных алгебраических уравнений методом вращений

Приведение системы линейных алгебраических уравнений к треугольному виду прямым ходом метода Гаусса. Применение обратного хода метода вращений. Создание алгоритма, блок-схемы и кода программы. Тестовый пример решения уравнения и его проверка в MathCad.

Рубрика Программирование, компьютеры и кибернетика
Вид лабораторная работа
Язык русский
Дата добавления 02.10.2013
Размер файла 164,3 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Министерство образования и науки Российской Федерации

Государственное образовательное учреждение

Высшего профессионального образования

"ОРЕНБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ"

Факультет экономики и управления

Кафедра математических методов и моделей в экономике

Лабораторная работа

по теме "Решение системы линейных алгебраических уравнений методом вращений"

Оренбург 2011

Содержание

  • 1. Постановка задачи
  • 2. Краткие теоретические сведения
  • 3. Алгоритм
  • 4. Блок-схема
  • 5. Код программы
  • 6. Тестовый пример и проверка в MathCad

1. Постановка задачи

Найти корни системы линейных алгебраических уравнений, используя метод вращений.

2. Краткие теоретические сведения

Система линейных алгебраических уравнений (СЛАУ) имеет вид Ax=b, где

, ,

Приведение такой системы к треугольному виду прямым ходом метода Гаусса допускает рост элементов матрицы коэффициентов до 2n+1, где n - размерность матрицы. В связи с этим возникают большие погрешности.

Более устойчивым является метод вращения. Он не допускает большого роста элементов в процессе преобразований.

Умножим первое уравнение исходной системы на с1, второе на s1 и сложим их. Полученным уравнением заменим первое уравнение системы. Затем первое уравнение исходной системы умножаем на -s1 , второе на c1 и результатом их сложения заменим второе уравнение. Таким образом, первые два уравнения системы заменяются уравнениями

На параметры с1 и s1 наложим два условия:

1)

2)

Отсюда

.

В результате преобразований получим систему

где

Далее первое уравнение системы заменяется новым, полученным сложением результатов умножения первого и третьего уравнений соответственно на а третье-уравнением, полученное при сложении результатов умножения тех же уравнений соответственно на -s2 и c2. Получим систему

Выполнив преобразование n-1 раз, придем к системе

Вид полученной системы такой же, как после первого этапа преобразований методом Гаусса. Эта система обладает следующим свойством: длина любого вектора-столбца (эвклидова норма) расширенной матрицы остается такой же, как у исходной матрицы. Следовательно, при выполнении преобразований не наблюдается рост элементов.

Далее аналогично преобразуется подматрица

линейный алгебраический уравнение вращение

.

В результате n-1 этапов прямого хода система будет приведена к треугольному виду.

Обратный ход метода вращений не отличается от обратного хода метода Гаусса.

3. Алгоритм

0) А, b, i:=1, j=2.

1) Считаем К шагу 2.

2) Преобразуем i-тое и j-тое уравнения системы соответственно в

,

3) Если j<n, то j:=j+1, к шагу 1. Иначе - к шагу 4.

4) Если i<(n-1), то i:=i+1; j:=i, к шагу 1. Иначе - к шагу 5.

5) . i:=n-1. К шагу 6.

6). Если i>1, то i:=i-1, в начало шага 6. Иначе - на конец алгоритма.

4. Блок-схема

5. Код программы

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, XPMan, Grids, ComCtrls;

type

TForm1 = class(TForm)

Edit1: TEdit;

Label1: TLabel;

UpDown1: TUpDown;

StringGrid1: TStringGrid;

Label2: TLabel;

StringGrid2: TStringGrid;

Edit2: TEdit;

Label3: TLabel;

XPManifest1: TXPManifest;

Button1: TButton;

procedure Edit1Change(Sender: TObject);

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var a: array [0..4, 0..4] of real; //a1-промежуточный массив

b,xsolved: array [0..4] of real; //xsolved - вектор-решение СЛАУ

c,s:Real; //Промежуточная переменная

i,j,n,k: integer; //changed - номер столбца, который мы поменяли местами с первым.

Form1: TForm1;

implementation

{$R *.dfm}

//Сделать проверку на ненулевые главные миноры!1111

Procedure cscount(numn, num:integer);

begin

c:=a[numn,numn]/sqrt(a[numn,numn]*a[numn,numn]+a[num,numn]*a[num,numn]);

s:=a[num,numn]/sqrt(a[numn,numn]*a[numn,numn]+a[num,numn]*a[num,numn]);

end;

procedure vrash(numn, num:integer); //numn - все уравнения до уравнения номер (numn+1) уже не трогаем

var j:integer;

a1: array [0..4, 0..4] of Real;

b1: array [0..4] of real;

begin

for j:=numn to (n-1) do begin

a1[numn,j]:=(c*a[numn,j]+s*a[num,j]);

a1[num,j]:=(c*a[num,j]-s*a[numn,j]);

end;

b1[numn]:=c*b[numn]+s*b[num];

b1[num]:=c*b[num]-s*b[numn];

for j:=numn to (n-1) do begin

a[numn,j]:=a1[numn,j];

a[num,j]:=a1[num,j];

b[numn]:=b1[numn];

b[num]:=b1[num];

end;

end;

procedure solving;

var zz:Real;

begin

xsolved[n-1]:=b[n-1]/a[n-1, n-1];

for i:=(n-2) downto 0 do begin

zz:=0;

for j:=i to (n-1) do

zz:=zz+a[i,j]*xsolved[j];

xsolved[i]:=(b[i]-zz)/a[i,i];

end;

end;

procedure TForm1.Edit1Change(Sender: TObject);

begin

n:=StrToInt(Edit1.Text);

StringGrid1.ColCount:=n;

StringGrid1.RowCount:=n;

StringGrid2.RowCount:=n;

end;

procedure TForm1.Button1Click(Sender: TObject);

var i,j:integer;

begin

Edit2.Text:='';

for i:=0 to (n-1) do begin

for j:=0 to (n-1) do

a[i,j]:=StrToFloat(StringGrid1.Cells[j,i]);

b[i]:=StrToFloat(StringGrid2.Cells[0,i]);

end;

for i:=0 to (n-2) do

for j:=(i+1) to (n-1) do begin

cscount(i,j);

vrash(i,j);

end;

solving;

for i:=0 to (n-1) do Edit2.Text:=Edit2.Text+'x'+IntTostr(i+1)+'='+FloatTostr(xsolved[i])+'; ';

end;

end.

6. Тестовый пример и проверка в MathCad

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.