Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2011.08.14;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.003 c
15-1303483359
mr.Ulugbek
2011-04-22 18:42
2011.08.14
Не работает INDY 8 SQUID Proxy.


15-1303504190
Юрий
2011-04-23 00:29
2011.08.14
С днем рождения ! 23 апреля 2011 суббота


1-1261468556
Neket
2009-12-22 10:55
2011.08.14
GEO- компанент


2-1304580406
samalex2504
2011-05-05 11:26
2011.08.14
Прокрутка (скроллинг) мышью в компоненте TScrollBox


15-1303510486
Иксик
2011-04-23 02:14
2011.08.14
Пол Гэллико





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский