Решение системы линейных алгебраических уравнений методом вращений
Далее первое уравнение системы заменяется новым, полученным сложением результатов умножения первого и третьего уравнений соответственно на, а третье-уравнением, полученное при сложении результатов умножения тех же уравнений соответственно наs2 и c2. Получим систему. Приведение такой системы к треугольному виду прямым ходом метода Гаусса допускает рост элементов матрицы коэффициентов до 2n+1, где… Читать ещё >
Решение системы линейных алгебраических уравнений методом вращений (реферат, курсовая, диплом, контрольная)
Министерство образования и науки Российской Федерации Государственное образовательное учреждение Высшего профессионального образования
" ОРЕНБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ"
Факультет экономики и управления Кафедра математических методов и моделей в экономике Лабораторная работа по теме «Решение системы линейных алгебраических уравнений методом вращений»
Оренбург 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
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