Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.05.2007, 22:35   #1
mEka
 
Регистрация: 16.12.2006
Сообщений: 5
По умолчанию Метод Гаусса

Нужна помощь в следущем деле: нашел реализацию метода Гаусса. Но вот нужна помощь как его переделать с помощью динамических структур для разряженых матриц. Для уточнения : хранятся только ненулевые коэффициенты. В процессе решения матрица может увеличиваться, уменьшаться. Как сделать динамическую структуру, пригодную для хранения матрицы? Вообщем, может кто что подскажет (примерный код какой-нить)? Очень нужна помощь в этом деле, иначе будет баня )). Заранее ВЕСЬМА благодарен.
mEka вне форума Ответить с цитированием
Старый 16.05.2007, 10:58   #2
Mickle
Пользователь
 
Регистрация: 27.03.2007
Сообщений: 37
По умолчанию Вот готовый код

Вот готовый код решения пользуйся на здоровье
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Spin, Grids, Buttons;

type
  TForm1 = class(TForm)
    SpinEdit1: TSpinEdit;
    StringGrid1: TStringGrid;
    StringGrid2: TStringGrid;
    Memo1: TMemo;
    Label1: TLabel;
    SpeedButton1: TSpeedButton;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    procedure SpinEdit1Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
const
 max = 10;//максимальное количество уравнений

 {определение матриц a и b}
type
 vec = array[1..max] of real;
 mat = array[1..max,1..max] of real;

var
  Form1: TForm1;

implementation

procedure Gaus(a: mat; var b: vec; n: byte);
var
 i,j,k,l : word;
 s,t : real;
begin
 if (n > max) then n := max;
{ Каждое уравнение делится на наибольший
элемент соответствующей строки матрицы a.}
 for i := 1 to n do
  begin
   s := abs(a[i,1]);
   for k := 2 to n do
    begin
     t := abs(a[i,k]);
     if ( t > s) then s := t;
    end;
   for k := 1 to n do a[i,k] := a[i,k]/s;
   b[i] := b[i]/s;
  end;
{ ПРЯМОЙ ХОД.}
 for k := 1 to n do
  begin
{ Поиск j-ого уравнения, имеющего наибольший a[j,j].}
   j := k;
   s := abs(a[k,k]);
   for i := (k+1) to n do
    begin
     t := abs(a[i,k]);
     if ( t > s) then
      begin
       s := t;
       j := i;
      end
    end;
{ найденное уравнение меняется местами с текущим -- k-ым}
   if ( j <> k) then
    begin
     for l := k to n do
      begin
       s := a[j,l];
       a[j,l] := a[k,l];
       a[k,l] := s;
      end;
     s := b[j];
     b[j] := b[k];
     b[k] := s;
    end;
{ делим k-ое уравнение на a[k,k].}
   s := a[k,k];
   a[k,k] := 1.0;
   for l := (k+1) to n do a[k,l] := a[k,l]/s;
   b[k] := b[k]/s;
{ в этом цикле -- исключение столбца ниже диагонали.}
   for i := (k+1) to n do
    begin
     s := a[i,k];
     a[i,k] := 0.0;
     for l := (k+1) to n do a[i,l] := a[i,l] - a[k,l]*s;
     b[i] := b[i] - b[k]*s
    end;
  end;
{ ОБРАТНЫЙ ХОД. Записываем полученное решение в матрицу b}
for i := (n-1) downto 1 do
   begin
    s := b[i];
    for k := (i+1) to n do s := s - a[i,k]*b[k];
    b[i] := s
   end;
end;

{$R *.dfm}

procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
  StringGrid1.ColCount:=StrToInt(SpinEdit1.Text);
  StringGrid1.RowCount:=StrToInt(SpinEdit1.Text);
  StringGrid2.RowCount:=StrToInt(SpinEdit1.Text);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.ColCount:=2;
StringGrid1.RowCount:=2;
StringGrid2.RowCount:=2;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
a: mat;
b: vec;
i, j : integer;
begin
{Заполнение матрицы a данными}
for i := 0 to StringGrid1.ColCount-1 do
 begin
  for j :=0 to StringGrid1.RowCount-1 do
   begin
    if StringGrid1.Cells[i, j] = '' then
     begin
      ShowMessage('Матрица не может содержат пустых элементов');
      Exit;
     end;
    a[j+1, i+1] := StrToFloat(StringGrid1.Cells[i, j]);
   end;
 end;
{Заполнение матрицы b данными}
for i := 0 to StringGrid2.RowCount-1 do
 begin
  if StringGrid2.Cells[0, i] = '' then
   begin
    ShowMessage('Матрица не может содержат пустых элементов');
    Exit;
   end;
  b[i+1] := StrToFloat(StringGrid2.Cells[0, i]);
 end;

{вызов процедуры Gaus}
Gaus(a, b, StringGrid1.RowCount);

{Вывод ответа на экран}
Memo1.Clear;
for i := 0 to StringGrid2.RowCount-1 do
 begin
  Memo1.Lines.Add('A' + IntToStr(i+1) + ' = ' + FloatToStr(b[i+1]));
 end;

end;

end.
Mickle вне форума Ответить с цитированием
Старый 16.05.2007, 19:17   #3
mEka
 
Регистрация: 16.12.2006
Сообщений: 5
По умолчанию

Оно то конечно хорошо. Ч конечно благодарен за помощь. Но я же писал что нашел реализацию метода Гаусса. Но вот главное проблема в том, что нужна помощь в реализации этого метода для разреженных матриц с помощью !!!динамических!!! структур.

Для уточнения : хранятся только ненулевые коэффициенты. В процессе решения матрица может увеличиваться, уменьшаться. Как сделать динамическую структуру, пригодную для хранения матрицы?

http://alglib.sources.ru/sparse/sparse.php - вот тут про разреженные матрицы

Мне говорили что мона так : при хранении разреженных матриц, хранят их не в виде массива двумерного, а в виде списка. Сначала в списке идёт главная диагональ, потом, скажем, диагональ над ней, под ней и т д (структура в зависимости от алгоритма).

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

Помогите, пожалуйста, переделать метод Гаусса под эту всю ерунду.

Заранее весьма благодарен.
mEka вне форума Ответить с цитированием
Старый 18.05.2007, 22:14   #4
Klyacksa
 
Регистрация: 04.05.2007
Сообщений: 7
По умолчанию

Mickle, это случаем не "метод прогонkи" называется?..
Klyacksa вне форума Ответить с цитированием
Старый 09.01.2008, 16:16   #5
lutdan
Пользователь
 
Регистрация: 08.01.2008
Сообщений: 47
По умолчанию

А где можно узнать как форма выгледит...чёт просто не могу понять для чего второй StringGrid2
lutdan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Help!!! Метод Гаусса Надя Microsoft Office Excel 7 07.05.2008 00:45
Метод Гаусса IgorKr Помощь студентам 10 03.02.2008 11:28