Решение системы линейных алгебраических уравнений методом вращений
Министерство
образования и науки Российской Федерации
Государственное
образовательное учреждение
Высшего
профессионального образования
"ОРЕНБУРГСКИЙ
ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ"
Факультет
экономики и управления
Кафедра
математических методов и моделей в экономике
Лабораторная
работа
по теме
"Решение системы линейных алгебраических уравнений методом вращений"
Оренбург 2011
Содержание
1. Постановка задачи
. Краткие теоретические сведения
. Алгоритм
. Блок-схема
. Код программы
. Тестовый пример и проверка в MathCad
1. Постановка задачи
Найти корни системы линейных алгебраических уравнений, используя метод
вращений.
2. Краткие теоретические сведения
Система линейных алгебраических уравнений (СЛАУ) имеет вид Ax=b, где
, ,
Приведение такой системы к треугольному виду прямым ходом метода Гаусса
допускает рост элементов матрицы коэффициентов до 2n+1, где n - размерность матрицы. В связи с этим возникают большие
погрешности.
Умножим первое уравнение исходной системы на с1, второе на s1
и сложим их. Полученным уравнением заменим первое уравнение системы. Затем
первое уравнение исходной системы умножаем на -s1 , второе на c1 и результатом их сложения заменим второе уравнение.
Таким образом, первые два уравнения системы заменяются уравнениями
На параметры с1 и s1 наложим
два условия:
1)
)
Отсюда
.
В результате преобразований получим систему
где
Далее первое уравнение системы заменяется новым, полученным сложением
результатов умножения первого и третьего уравнений соответственно на а третье-уравнением, полученное при
сложении результатов умножения тех же уравнений соответственно на -s2 и c2. Получим систему
Выполнив преобразование n-1
раз, придем к системе
Вид полученной системы такой же, как после первого этапа преобразований
методом Гаусса. Эта система обладает следующим свойством: длина любого
вектора-столбца (эвклидова норма) расширенной матрицы остается такой же, как у
исходной матрицы. Следовательно, при выполнении преобразований не наблюдается
рост элементов.
Далее аналогично преобразуется подматрица
линейный алгебраический уравнение вращение
.
В результате n-1 этапов прямого хода система будет приведена к
треугольному виду.
Обратный ход метода вращений не отличается от обратного хода метода
Гаусса.
3. Алгоритм
0) А, b, i:=1, j=2.
1) Считаем К шагу 2.
) Преобразуем i-тое и j-тое уравнения системы соответственно
в
,
3) Если j<n, то j:=j+1, к шагу 1. Иначе - к шагу 4.
) Если i<(n-1), то i:=i+1; j:=i, к шагу 1. Иначе
- к шагу 5.
) . i:=n-1. К шагу 6.
). Если i>1, то i:=i-1, в начало шага 6. Иначе - на конец
алгоритма.
4. Блок-схема
5. Код программы
Unit1;, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms,, StdCtrls, XPMan, Grids, ComCtrls;= class(TForm): TEdit;:
TLabel;: TUpDown;: TStringGrid;: TLabel;: TStringGrid;: TEdit;: TLabel;:
TXPManifest;: TButton;Edit1Change(Sender: TObject);Button1Click(Sender:
TObject);
{ Private declarations }
{ Public declarations };a: array [0..4, 0..4] of real; //a1-промежуточный массив,xsolved: array [0..4] of real; //xsolved - вектор-решение
СЛАУ
c,s:Real; //Промежуточная переменная,j,n,k: integer; //changed - номер
столбца, который мы поменяли местами с первым.
{$R *.dfm}
//Сделать проверку на ненулевые главные миноры!1111
Procedure cscount(numn, num:integer);:=a[numn,numn]/sqrt(a[numn,numn]*a[numn,numn]+a[num,numn]*a[num,numn]);:=a[num,numn]/sqrt(a[numn,numn]*a[numn,numn]+a[num,numn]*a[num,numn]);;vrash(numn,
num:integer); //numn - все уравнения до уравнения номер (numn+1) уже не трогаемj:integer;: array [0..4, 0..4] of
Real;: array [0..4] of real;j:=numn to (n-1) do
begin[numn,j]:=(c*a[numn,j]+s*a[num,j]);[num,j]:=(c*a[num,j]-s*a[numn,j]);;[numn]:=c*b[numn]+s*b[num];[num]:=c*b[num]-s*b[numn];j:=numn
to (n-1) do
begin[numn,j]:=a1[numn,j];[num,j]:=a1[num,j];[numn]:=b1[numn];[num]:=b1[num];;;solving;zz:Real;[n-1]:=b[n-1]/a[n-1,
n-1];i:=(n-2) downto 0 do begin:=0;j:=i to (n-1)
do:=zz+a[i,j]*xsolved[j];[i]:=(b[i]-zz)/a[i,i];;;TForm1.Edit1Change(Sender:
TObject);:=StrToInt(Edit1.Text);.ColCount:=n;.RowCount:=n;
StringGrid2.RowCount:=n;;
procedure TForm1.Button1Click(Sender:
TObject);i,j:integer;.Text:='';i:=0 to (n-1) do beginj:=0 to (n-1)
do[i,j]:=StrToFloat(StringGrid1.Cells[j,i]);[i]:=StrToFloat(StringGrid2.Cells[0,i]);;i:=0
to (n-2) doj:=(i+1) to (n-1) do begin(i,j);(i,j);;;i:=0 to (n-1) do
Edit2.Text:=Edit2.Text+'x'+IntTostr(i+1)+'='+FloatTostr(xsolved[i])+'; ';
end;.
6. Тестовый пример и проверка в MathCad