Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: паскаль, слау, гаус, отсутствие погрешности - беда)  (Прочитано 1263 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн justed

  • Автор темы
  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
чуть чуть не в тему, но разъясните кому не трудно  ???
рабочая программа решающая систему уравнений методом гауса:
Program bI_2_var_10;

const
n = 4;
m = 5;

var
a,o: array [1..n, 1..m] of real;
x, s: array [1..m-1] of real;
i, j, curr_i, c: integer;

begin
   a[1, 1]:= 7.5;       a[1, 2]:= 2.6;    a[1, 3]:= 1.3;    a[1, 4]:= -8.1;   a[1, 5]:= 5.7;
   a[2, 1]:= 6.4;       a[2, 2]:= 3.3;    a[2, 3]:= -2.4;   a[2, 4]:= 1.7;    a[2, 5]:= -2.1;
   a[3, 1]:= 0.1;       a[3, 2]:= -2.3;   a[3, 3]:= 0.8;    a[3, 4]:= -5.7;   a[3, 5]:= 4.6;
   a[4, 1]:= 8.2;       a[4, 2]:= 0.1;    a[4, 3]:= -5.3;   a[4, 4]:= -7.6;   a[4, 5]:= 5.1;

   o:= a;
   for curr_i:=1 to 3 do
   begin
      for j:=m downto 1 do a[curr_i, j]:= a[curr_i, j]/a[curr_i,curr_i];
      for i:=curr_i + 1 to n do
         for j:=m downto curr_i do a[i, j]:= a[i, j] - a[i, curr_i] * a[curr_i, j];
   end;
   
   c:= m-1;
   x[n]:= a[n,m]/a[n,n];

   for i:= n-1 downto 1 do
   begin
      x[i]:= a[i,m];
      for j:= m-1 downto c do x[i]:= x[i] - (x[j] * a[i,j]);
      c:= c-1;
   end;

   for i:= 1 to n do writeln('x[', i, ']= ', x[i]);

   writeln('Подстановка');
   
   a[1,1]:= x[1] * o[1,1] + x[2] * o[1, 2] + x[3] * o[1, 3] + x[4] * o[1, 4];
   a[2,1]:= x[1] * o[2,1] + x[2] * o[2, 2] + x[3] * o[2, 3] + x[4] * o[2, 4];
   a[3,1]:= x[1] * o[3,1] + x[2] * o[3, 2] + x[3] * o[3, 3] + x[4] * o[3, 4];
   a[4,1]:= x[1] * o[4,1] + x[2] * o[4, 2] + x[3] * o[4, 3] + x[4] * o[4, 4];
   writeln( a[1,1]:0 :10, ' = ', o[1,5]);
   writeln( a[2,1]:0 :10, ' = ', o[2,5]);
   writeln( a[3,1]:0 :10, ' = ', o[3,5]);
   writeln( a[4,1]:0 :10, ' = ', o[4,5]);
end.

первый цикл приводит матрицу к треугольному виду, второй кусок обратным ходом находит иксы.
Во время вычислений постоянно появляются иррациональные числа, т.е. корни должны быть приближенными, но при подстановки все сходится хоть до 10 знаков после запятой:
5.7000000000 = 5.7
-2.1000000000 = -2.1
4.6000000000 = 4.6
5.1000000000 = 5.1
так вот, почему нет погрешности?)

Оффлайн Lion-Simba

  • Старожил
  • *
  • Сообщений: 1126
    • Просмотр профиля
Метод гаусса даёт точный результат без погрешности. То есть погрешность метода равна нулю.

При вычислении на компьютере существует погрешность выполнения операций с плавающей запятой и погрешность округления вещественных чисел. Тип REAL в Паскале, судя по http://www.5byte.ru/tp7pub/0007.php, обеспечивает до 11-12 значащих цифр. А ваши числа (и ответы) содержат по 2 значащие цифры, так что вы просто не упёрлись в это ограничение.
Оказываю индивидуальную платную техподдержку широкого профиля. Обращаться в ЛС или Jabber.

Оффлайн justed

  • Автор темы
  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
забыл написать, сами корни вида:
x[1]= -0.0887549632446205
x[2]= -0.0322587536014393
x[3]= 0.0338048026317546
x[4]= -0.79081342472557
и как бы маловероятным кажется получить точное равенство. но сейчас пересчитал на калькуляторе и все сходится, видимо тип real еле еле но вмещает, и как то правильным образом округляет, то что вместить не может.

просто мне сказали... что если погрешности нет, то программа работает неправильно    ???

Оффлайн Lion-Simba

  • Старожил
  • *
  • Сообщений: 1126
    • Просмотр профиля
просто мне сказали... что если погрешности нет, то программа работает неправильно    ???
Расскажи им про библиотеку GMP. ;)
Оказываю индивидуальную платную техподдержку широкого профиля. Обращаться в ЛС или Jabber.

 

Страница сгенерирована за 7.964 секунд. Запросов: 26.