Блок-схема
Текст программы
unit Unit1;
interface.
uses.
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,.
Dialogs, StdCtrls;
type.
TForm1 = class (TForm).
edtB1: TEdit;
lbl2: TLabel;
edtE1: TEdit;
lbl3: TLabel;
edtD1: TEdit;
edtE2: TEdit;
lbl4: TLabel;
edtB2: TEdit;
lbl5: TLabel;
edtD2: TEdit;
edtC2: TEdit;
lbl6: TLabel;
lbl7: TLabel;
edtD3: TEdit;
lbl8: TLabel;
edtB3: TEdit;
lbl9: TLabel;
edtC3: TEdit;
btn1: TButton;
lbl1: TLabel;
lbx: TLabel;
lby: TLabel;
lbz: TLabel;
procedure btn1Click (Sender: TObject);
private.
{ Private declarations }.
public.
{ Public declarations }.
end;
var.
Form1: TForm1;
implementation.
{$R *.dfm}.
// нажатие на «вычислить» .
procedure TForm1.
btn1Click (Sender: TObject);
const.
n=3; // размерность массивов и матриц.
var.
C, D, E: array of Real; //матрица уравнений.
B: array of Real; // чему равны уравнения (первая часть).
Y: array of Real; // результат.
I, k: Integer; // для циклов, перебора.
ALF, BET: array of Real; // Alpha и Beta для предв. вычислений.
znam: Real;
begin.
{установим длины массивов}.
SetLength (C, n);
SetLength (D, n);
SetLength (E, n);
SetLength (B, n);
SetLength (Y, n);
SetLength (ALF, n);
SetLength (BET, n);
{заполним массивы}.
//главная диагональ (d):
d[0]: =strtofloat (edtD1.text);
d[1]: =strtofloat (edtD2.text);
d[2]: =strtofloat (edtD3.text);
//диагональ c (та что пониже d).
c[0]: =0;
c[1]: =strtofloat (edtC2.text);
c[2]: =strtofloat (edtC3.text);
//диагональ e (та что повыше d).
e[0]: =strtofloat (edtE1.text);
e[1]: =strtofloat (edtE2.text);
e[2]: =0;
//заполняем чему равны наши выражения.
b[0]: =strtofloat (edtB1.text);
b[1]: =strtofloat (edtB2.text);
b[2]: =strtofloat (edtB3.text);
//проверим, можно ли считать этим способом:
k:=0;
for i:=0 to n-1 do.
if Abs (d[i])>Abs (c[i])+abs (e[i]) then k:=k+1;
if k=0 then begin.
ShowMessage ('Данный способ не применим, т.к. условие диагонального преобладания матрицы не выполняется :(');
Exit;
end;
{вычисление вспомогательных величин}.
ALF[0]: = -(E[0]/D[0]);
BET[0]: = B[0]/D[0];
{прямой ход}.
for I:= 1 to n — 1 do.
begin.
znam := d[i] + c[i]*ALF[i-1];
ALF[i]: = -(e[i]/znam);
BET[i]: = (-c[i]*BET[i-1]+b[i])/znam;
end;
{обратный ход, нахождение корней}.
Y[n-1]: =(b[n-1]-c[n-1]*BET[n-2])/(d[n-1]+c[n-1]*ALF[n-2]);
for I:= n — 2 downto 0 do.
Y[i]: =Y[i+1]*ALF[i]+BET[i];
//вывод результата.
lbx.Caption:='X = ' + floattostr (Y[0]);
lby.Caption:='Y = ' + floattostr (Y[1]);
lbz.Caption:='Z = ' + floattostr (Y[2]);
end;
end.
Тестовый пример
В качестве тестового примера возьмем :
При ручном подсчете корни равны: x=-3 y=-7 z=-15.
Рисунок 1. Результат работы программы.
Решение задачи с помощью ЭВМ
При решении системы линейных алгебраических уравнений методом прогонки с помощью Delphi получаем:
Рисунок 2. Результат работы программы (метод прогонки).