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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2009, 22:38   #1
Tonik_A
Пользователь
 
Регистрация: 04.10.2009
Сообщений: 23
Вопрос Ищу ошибку в программе.

В программе решающей линейные уравнения методом Зейделя допустил ошибку. Когда программа запущена через компилятор Pascal ABS всё нормально, но когда просто через Pascal при введении точности (eps) выполнение прекращается. Подскажите, пожалуйста, как это исправить? И ещё как сделать так, что бы в создаваемый файл записывались три результата, как при выводе на экран, а не один?


program seidel;
Uses Crt;
var A: array [1..8,1..8] of real;
b,x,otv: array [1..8] of real;
i,j,n: byte;
eps,s1,s2: real;
pr: boolean;
m_file: text;
begin
assign(m_file,'rezultat raboti.txt');
write('razmer matrix n=');
readln(n);
if (n>=2) and (n<=8) then writeln('Dannie vvedini korrektno') else begin
writeln('Programma ne prednaznachena dly etih dannih');
exit;
end;
for i:=1 to n do
for j:=1 to n do {Ввод данных}
begin
write('A[',i,',',j,']=');
readln(A[i,j]);
end;
for i:=1 to n do
if a[i,i]=0 then begin
writeln('oshibka vvoda'); {Проверка на сходимость}
exit;
end;
for i:=1 to n do
begin
write('b[',i,']=');
readln(b[i]);
end;
for i:=1 to n do
begin
for j:=1 to n do
begin
if i=j then continue;
a[i,j]:=-a[i,j]/a[i,i]; {Выражение аргументов}
end;
b[i]:=b[i]/a[i,i];
a[i,i]:=0;
end;
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j]:4:2,' ');
writeln(b[i]:4:2);
end;
for i:=1 to n do
begin
x[i]:=b[i];
otv[i]:=b[i];
end;
write('tochnost=');
readln(eps);

repeat
for i:=1 to n do
begin
s1 := 0;
s2 := 0;
For j := 1 to i - 1 do
s1 := s1 + a[i, j] * x[j]; {алгоритм решения}
For j := i to n do
s2 := s2 + a[i, j] * x[j];
x[i]:=s1+s2+b[i];
end;
for i:=1 to n do
if abs(otv[i]-x[i])<eps then pr:=true
else begin
pr:=false;
break;
end;
for i:=1 to n do
otv[i]:=x[i];

until pr;
for i:=1 to n do
writeln(x[i]); {Вывод результата}
ReWrite(m_file);
writeln(m_file, x[i]);
Close(m_file);
end.


---------------------------------------
С уважением, Антон.
Tonik_A вне форума Ответить с цитированием
Старый 08.12.2009, 23:38   #2
Alex_FF
Удален
Форумчанин
 
Регистрация: 02.12.2009
Сообщений: 309
По умолчанию

вот я когда-то сдавал в универе такую работу на метод зейделя:
Код:
program lab6_2; { Метод Зейделя }

uses Crt;

const
  K1 = 1;
  K2 = 3;
  Alpha = 0.2 * K1;
  Beta = 0.2 * K2;
  Epsilon = 1e-4;
  N = 3;
  Matrix_A: Array[1..3, 1..3] of Real = (
            (24.21 + Alpha, 2.42, 3.85),
            (2.31, 31.49, 1.52        ),
            (3.49, 4.85, 28.72 + Alpha));
  Matrix_B: Array[1..3] of Real = (
            (30.24       ),
            (40.95 - Beta),
            (42.81       ));

var
  I, J, K: Integer;
  x, x1, absol: Array[1..3] of Real;
  max: Real;
  endid: Boolean;
begin
  ClrScr;

  endid := False;
  FillChar(x, SizeOf(x), 0);

  WriteLn('Исходная матрица: ');

  for I := 1 to n do
  begin
    WriteLn;
    for J := 1 to n do
      Write(Matrix_A[I][J]:8:2, ' ');
      Write('        ', Matrix_B[I]:8:2);
  end;

  repeat
    for I := 1 to n do
    begin
      x[I] := Matrix_B[I];
      for J := 1 to n do
      begin
        if J = I then Continue;
        x[I] := x[I] - Matrix_A[I][J] * x[J];
      end;
      x[I] := x[I] / Matrix_A[I][I];
    end;
    for K := 1 to n do
      absol[I] := Abs(x[I] - x1[I]);
    max := absol[1];
    for K := 1 to n do
      if absol[I] > max then max := absol[I];
    for I := 1 to n do
      x1[I] := x[I];
    if max < Epsilon then endid := True;
  until endid;

  WriteLn;
  WriteLn;
  WriteLn('Найденные корни');
  WriteLn;
  for I := 1 to n do
    WriteLn('x[', I, '] = ', x[I]:8:7);

  WriteLn;
  WriteLn('Нажмите любую клавишу для выхода');
  ReadKey;
end.
Alex_FF вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите найти ошибку в программе k1r1ch Общие вопросы Delphi 7 04.10.2009 09:36
Не могу найти ошибку в программе lioshenka Общие вопросы C/C++ 5 24.08.2009 11:38
Ищу ошибку в програме на prolog Komunizm Помощь студентам 4 15.08.2009 02:17
С++ Классы Не пойму ошибку в программе E.C. Помощь студентам 1 06.05.2009 14:58
НАЙДИТЕ ОШИБКУ В ПРОГРАММЕ svetah Помощь студентам 8 03.12.2008 15:19