Форум: "Основная";
Текущий архив: 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