Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.08.14;
Скачать: CL | DM;

Вниз

Проблема с методом Гаусса   Найти похожие ветки 

 
Naivety   (2009-12-26 22:57) [0]

Вопрос связан с программированием на Borland Delphi!
Мне нужно решить систему уравнений методом Гаусса (приведением к треугольному виду). Но если решаю матрицу
9 3 1 | 18
9 3 1 | 18
9 3 1 | 18
То получается коллизия... Матрица вначале приводится к виду
1 0,33 0,11 | 2
9  3    1   | 18
9  3    1   | 18
Потом, когда нужно из второй строчки первую, умноженную на 9 и получить везде ноль, я почему-то получаю.
в той строчке 0 1,665 5,55.
Я уже даже в отдельном месте на форме вывожу элементы, из которых вычитаем и элемент, который надо вычесть (3 для второго столба) и их разницу. Сами элементы выводятся 3, а разница выводится 1,55.
Что может быть не так? О_О
Дальше код того, как привожу к треугольному виду и как выводится...
Может проблема в сборке Delphi?
[Code]
// систма приводитсяк треугольному виду
for j:=0 to 0 do//n-2 do    // поочередно для каждой строчки! вначале j-я строка - это первая
begin
 if (x[j,j]=0) then // если первый элемент строки (j-й элемент для j-й строки) равен нулю
 begin              // то ищем в других строках такой элемент, не равный нулю
   temp_n:=j;  // временная переменная для проверки, нашлась ли подходящая строка
   for i:=1 to n-1 do
     if (x[i,j]<>0) then  //если нашлась подходящая строка
     begin
       temp_n:=i;           // присваиваем временной переменной ее номер
       break;             // и завершаем поиск
     end;
   if (temp_n<>j) then      // если нашлась строка (проверяем по временной переменной)
   begin                  // меняем строки местами
     for i:=0 to n-1 do
     begin
       temp:=x[j,i];
       x[j,i]:=x[temp_n,i];
       x[temp_n,i]:=temp;
     end;
     temp:=b[j];          // также меняем местами и остаточные члены
     b[j]:=b[temp_n];
     b[temp_n]:=temp;
   end
   else      // если не нашлась строчка с ненулевым j-м элементом
   begin
     showmessage ("Система не сходится!");         // выводим сообщение
     Goto no;                                      // и заканчиваем программу
   end;
 end;
                                  // дальнейшие действия выполняются, если строки поменяли или не надо было их менять
 temp:=x[j,j];
 for i:=j to n-1 do               // делим кэфициенты j-го уравнения на j-й коэфициэнт
   x[j,i]:=x[j,i]/temp;                    // и j-й коэфициент станет едиицей
 b[j]:=b[j]/temp;                 // и остаточный член этого уравнения делим на то же число
 for i:=j+1 to n-1 do             // производим действия, чтобы во всех последующих уравнениях j-е коэфициенты стали равны нулю
 begin
   temp:=x[i,j]/x[j,j]; // для этого вычисляем для каждой строки число, на которое нужно умножать

   for k:=j to n-1 do   // вычитаем из каждой строки j-ю, умноженную на это число
     begin

    //   stringgrid4.Cells[0,0]:=floattostr(temp);
 stringgrid4.Cells[0,1]:=floattostr(x[j,k]*temp);
 stringgrid4.Cells[1,0]:=floattostr(x[i,k]);
 stringgrid4.Cells[1,1]:=floattostr(x[j,k]*temp - x[i,k]);

     x[i,k]:=x[i,k]-x[j,k]*temp;
     end;
   b[i]:=b[i]-b[j]*temp;// то же с остаточным членом
 end;

end;
[/Code]

Помогите...
ЗЫ Что примечательно, если брать матрицу, в которой нету чисел, делящихся на три, но также повторяющиеся строчки, все вроде бы нормально - выдает ошибку, что не может посчитать... А тут какой-то прикол...


 
Naivety   (2009-12-26 23:34) [1]

Все, решил проблему.
Ввел две переменные:
одной присваивал x[i,k], а другой x[j,k]*temp. А потом x[i,k] присвоил разность этих переменных и нормально считать стало...
Хотя все же не понятно, в чем была проблема...


 
Германн ©   (2009-12-26 23:44) [2]


> Хотя все же не понятно, в чем была проблема...

Какой тип у переменных x и temp?


 
Naivety   (2009-12-27 02:04) [3]

x: array of array of real;
temp: real;


 
Германн ©   (2009-12-27 02:21) [4]


> Naivety   (27.12.09 02:04) [3]


> real

Вот это корень твоей проблемы.
Содрал пример из И-нета?
А пример n-летней давности, когда основным типом для переменных действительного типа был real. Но сейчас основной тип это то ли Extended, то ли Double. (Путаюсь я в них).
Так вот в выражении  
> x[i,k]:=x[i,k]-x[j,k]*temp

все переменные сначала преобразуются из real в "основной" тип, потом производится вычисление результата, который после этого преобразуется в тип real. А вот если
> Ввел две переменные:
> одной присваивал x[i,k], а другой x[j,k]*temp

, то в вычитании используются переменные типа real.


 
Naivety   (2009-12-27 03:00) [5]

Нет, не содрал - сам все писал! Я вообще обычно на с++ кодю - меня просто попросили знакомые написать на Делфи, а я делфи не сильно шарю... Спасибо - буду знать про double.


 
Anatoly Podgoretsky ©   (2009-12-27 11:01) [6]

> Германн  (27.12.2009 02:21:04)  [4]

Ничего не преобразовывается, real это generic тип



Страницы: 1 вся ветка

Текущий архив: 2011.08.14;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.009 c
1-1261613044
Fosgen
2009-12-24 03:04
2011.08.14
array [] of procedure() of object


1-1261483261
StriderMan
2009-12-22 15:01
2011.08.14
SetBounds у Child ов TScrollBox а


6-1240473036
MultIfleX
2009-04-23 11:50
2011.08.14
win pcap


15-1303303521
Дмитрий Тимохов
2011-04-20 16:45
2011.08.14
Delphi &amp; Excel 2007


15-1303381182
xayam
2011-04-21 14:19
2011.08.14
AdSense или Sape ?