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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2015, 08:36   #1
FrostGeaR
Новичок
Джуниор
 
Регистрация: 27.09.2015
Сообщений: 4
По умолчанию Решение СЛАУ методом Гаусса (Delphi 7)

Создал рабочий шаблон решения СЛАУ методом Гаусса. Опирался на ниже приведенный код (мой код сюда не влезет из-за кучи Label и Memo, созданных для наглядности на всех этапах решения), вся "математика" практически ничем не отличается, да и понять будет проще.
Вопрос остался только один - нужно менять местами строки, что бы не возникало проблем с DivByZero. как это сделать?

Код:
procedure TForm1.Button1Click(Sender: TObject);
var i,j,k:byte;
    a,a1:array[1..n,1..n] of real;
    b,b1,x,y,m:array[1..n] of real;
    h,g:real;
begin
//исходная матрица коэффициентов
a[1,1]:=2.34;a[1,2]:=-4.21;a[1,3]:=-11.61;
a[2,1]:=8.04;a[2,2]:=5.22;a[2,3]:=0.27;
a[3,1]:=3.92;a[3,2]:=-7.99;a[3,3]:=8.37;
a1:=a; //запомним ее для проверки, первуая изменится
//то же свободные члены
b[1]:=14.41;b[2]:=-6.44;b[3]:=55.56;
b1:=b;
for i:=1 to n do
for j:=1 to n do
StringGrid1.Cells[j-1,i-1]:=FloattostrF(a[i,j],ffFixed,0,2);
for i:=0 to n-1 do
 begin
  StringGrid2.Cells[0,i]:='X'+inttostr(i+1)+'=';
  StringGrid1.Cells[n,i]:=FloattostrF(b[i+1],ffFixed,0,2);
 end;
{приведение матрицы к треугольному виду}
for k:=1 to n do
 begin
  for j:=k+1 to n do
   begin
    h:=a[j,k]/a[k,k];
    for i:=k to n do
    a[j,i]:=a[j,i]-h*a[k,i];
    b[j]:=b[j]-h*b[k];
   end;
 end;
{вычисление корней}
for k:=n downto 1 do
 begin
  h:=0;
  for j:=k+1 to n do
   begin
    g:=a[k,j]*x[j];
    h:=h+g;
   end;
  x[k]:=(b[k]-h)/a[k,k];
 end;
 
for i:=1 to n do
StringGrid2.Cells[1,i-1]:=FloattostrF(x[i],ffFixed,0,2);
//проверка
for i:=1 to n do
 begin
  y[i]:=0;
  for j:=1 to n do
  y[i]:=y[i]+a1[i,j]* x[j];
 end;
for i:=1 to n do
m[i]:=abs(b1[i]-y[i]); //невязка, у меня все по нолям
for i:=1 to n do
StringGrid3.Cells[0,i-1]:=FloattostrF(m[i],ffFixed,0,6);
end;
FrostGeaR вне форума Ответить с цитированием
Старый 27.09.2015, 08:51   #2
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от FrostGeaR Посмотреть сообщение
Вопрос остался только один - нужно менять местами строки, что бы не возникало проблем с DivByZero. как это сделать?
А, Ктулкх его знает? По участку кода, я ещё могу сказать. Копаться в том, что не имеет отношеня к делу? Ну, ооочень лениво.
Наверное у вас отладчика нет? Сочувствую. Дебаггер не работает? Гал ку в настройках, Ктулху запретил поставить или просто лень?
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 27.09.2015, 09:02   #3
FrostGeaR
Новичок
Джуниор
 
Регистрация: 27.09.2015
Сообщений: 4
По умолчанию

Меня интересует принцип. Мне не нужно, что бы писали новый код или перелопатили этот.
К примеру, поставить блок безопасности и в обработчике ошибки сделать замену строк. Тут возникает вопрос - а как же я поменяю предыдущие шаги цикла, которые уже выведены в Memo?
Мне нужен совет. Ну если лень отпустит, то можно тут продемонстрировать скилл
FrostGeaR вне форума Ответить с цитированием
Старый 27.09.2015, 09:06   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
for j:=1 to n do begin
  r:=a[x,j];
  a[x,j]:=a[y,j];
  a[y,j]:=r;
end;

Цитата:
К примеру, поставить блок безопасности и в обработчике ошибки сделать замену строк.
Принцип: НЕ ДОПУСКАТЬ ошибок.
сначала проверить, а потом принять решение (или выполнять деление/ или менять строки).

Принцип: Если не удалось сделать ИСПРАВЛЯЕМ так чтобы при повторной работе такого не случилось и делаем все заново.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 27.09.2015 в 09:14.
evg_m вне форума Ответить с цитированием
Старый 27.09.2015, 09:14   #5
FrostGeaR
Новичок
Джуниор
 
Регистрация: 27.09.2015
Сообщений: 4
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
for j:=1 to n do begin
  r:=a[x,j];
  a[x,j]:=a[y,j];
  a[y,j]:=r;
end;
Дядь, спасибо. Вопрос как раз в том, куда и как это запихать получше)

Вобщем - нашел значение 0 там, где его быть не должно (до деления). Вышел из кнопки, сделал замену, вошел в кнопку с новыми значениями. Как-то так?

Последний раз редактировалось FrostGeaR; 27.09.2015 в 09:17.
FrostGeaR вне форума Ответить с цитированием
Старый 27.09.2015, 09:24   #6
FrostGeaR
Новичок
Джуниор
 
Регистрация: 27.09.2015
Сообщений: 4
По умолчанию

Еще маленький вопросик в том же шаблончике Гаусса.
Нормально так писать, или я осминог? Есть варианты лучше, как обходить, к примеру, подобные ошибки? Я только учусь
Код:
try
  n:=StrToInt(Edit1.Text);
  if(n=0)
  then
    begin
    MessageDlg('Введен ноль. Неверная размерность',mtWarning,[mbOK],0);
    exit
    end;
  if(n<0)
  then
    begin
    MessageDlg('Введено отрицательное число. Неверная размерность',mtWarning,[mbOK],0);
    exit
    end;
  except
  on EConvertError do
    begin
    MessageDlg('Размерность задана вещественным числом или введены символы',mtWarning,[mbOK],0);
    exit
    end
  end;
То есть, что-то я обошел, а ошибку конвертирования технически допустил. правильно я понимаю?
FrostGeaR вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решение СЛАУ методом Гаусса Stacy McKritsky Помощь студентам 1 08.06.2015 19:24
решение СЛАУ методом гаусса al172 Помощь студентам 0 12.11.2013 17:08
Решение СЛАУ методом Гаусса и методом Крамера. R1k1 Помощь студентам 0 24.03.2012 19:17
Решение СЛАУ методом Гаусса Денис999 Помощь студентам 2 27.11.2011 18:31
Решение СЛАУ методом Гаусса Medvedko0116 Помощь студентам 0 27.06.2011 11:15