Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Метод Гаусса.

64K
16 октября 2010 года
1yulia1
1 / / 14.10.2010
Ребят подмогите плиз.....

в общем требуется решить систему линейных уравнений методом гаусса, используя прямой ход метода гаусса найти LU разложения матр. системы, с помощью полученной матрицы найти определитель матрицы системы.

ПРоблема заключается в следующем: не получается сделать так, чтобы выводилось решение ввиде 2х матриц L и U и определителью.
вот собственно код(рабочий):



Код:
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.Cells[j, i], 0);
  //Правая часть уравнения
  for I := 0 to n - 1 do b[i + 1] := StrToFloatDef(StringGrid2.Cells[0, i], 0);
  //Прямой ход - исключение переменных
  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
    end;
    x[n]:=b[n]/a[n,n];
    //Обратный ход - нахождение корней
    for i:=n-1 downto 1 do
    begin
      h:=b;
      for j:=i+1 to n do h:=h-x[j]*a[i,j];
      x:=h/a[i,i]
    end;
    //Вывод результата
    for i:=1 to n do ListBox1.Items.Append('x(' + IntToStr(i) + ')=' + FloatToStr(x));
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.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог