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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.05.2011, 11:13   #1
Mesken
 
Регистрация: 22.04.2011
Сообщений: 7
По умолчанию Слау методом простых итерации. Не решаемое??

Здравствуйте все!

Есть задание:
Решить систему линейных алгебраических уравнений методом простых итерации с точностью e=0,001.
x1+5*x2-x3=7
x1-x2+5*x3=7
8*x1+x2+x3=26

Вот мое решение:
Код:
uses crt;
const n=3;
      eps=0.001;
      a:array[1..n,1..n] of shortint=(( 1,5,-1),(1,-1,5),( 8,1,1));
      b:array[1..n] of shortint=(7,7,26);
 
var x:array[1..n,1..n] of real;
    i,j,p,k:byte;
    x1,x2,x3,tmp1,tmp2,tmp3:real;
begin
     clrscr;
     writeln('система уравнений:');
     for i:=1 to n do
         begin
              for j:=1 to n do write(a[i,j]:3);
              writeln(b[i]:3);
         end;
     {проверка диоганалей}
     for i:=1 to n do
         begin
              p:=0;
              for j:=1 to n do
                  if i<>j then p:=p+a[i,j];
              if a[i,i]<p then break;
         end;
     {перестановка строк}
     for i:=n downto 2 do
         begin
              for j:=1 to n do
                  begin
                       p:=a[i,j];
                       a[i,j]:=a[i-1,j];
                       a[i-1,j]:=p;
                  end;
              p:=b[i];
              b[i]:=b[i-1];
              b[i-1]:=p
         end;
     for i:=1 to n do
         begin
              for j:=1 to n do write(a[i,j]:3);
              writeln(b[i]:3);
         end;
     writeln;
     {искл. диагоналей}
     for i:=1 to n do
         begin
              j:=1;k:=0;
              while (k<=n) and (j<=n) do
                    if j<>i then
                       begin
                            inc(k);
                            x[i,k]:=a[i,j]/-a[i,i];
                            inc(j);
                       end
                       else inc(j);
              x[i,n]:=b[i]/a[i,i];
         end;
     for i:=1 to n do
         begin
              for j:=1 to n do write(x[i,j]:7:3);
              writeln;
         end;
     x1:=0;x2:=0;x3:=0;k:=1;
     repeat
           tmp1:=x[k,1]*x2+x[k,2]*x3+x[k,3];
           inc(k);
           tmp2:=x[k,1]*x1+x[k,2]*x3+x[k,3];
           inc(k);
           tmp3:=x[k,1]*x1+x[k,2]*x2+x[k,3];
           k:=1;
           x1:=tmp1;x2:=tmp2;x3:=tmp3;
           writeln('x1=',x1:6:3,' x2=',x2:6:3,' x3=',x3:6:3);
     until (x1<=eps)or(x2<=eps)or(x3<=eps);
     readln;
end.
Проблема заключается в том что последний цикл не решается, т.е. сам пример. Решил проверить в ручную и тоже самое.
Неужели это система не решаемое? или я что-то на путал? Объясните пожалуйста.

П.С. если уж она не решается, подскажите ка закончить программу для сдачи преподу.

Последний раз редактировалось Mesken; 11.05.2011 в 11:15.
Mesken вне форума Ответить с цитированием
Старый 11.05.2011, 14:26   #2
KobolD
Форумчанин
 
Регистрация: 10.06.2010
Сообщений: 239
По умолчанию

Ну вообще-то система решается, как минимум методом гаусса, а значит метод простых итераций должен дать ответ.
Ты в условии until (x1<=eps)or(x2<=eps)or(x3<=eps); сравниваешь расчетное значение свободных членов с точностью, с тем же успехом можно сравнивать сантиметры с килограммами.
Попробуй так until (abs(x1-b[1])<=eps)and(abs(x2-b[2])<=eps)and(abs(x3-b[3])<=eps);
Чтобы слова не расходились с делом, нужно молчать и ничего не делать.

Последний раз редактировалось KobolD; 11.05.2011 в 14:34.
KobolD вне форума Ответить с цитированием
Старый 11.05.2011, 23:46   #3
Mesken
 
Регистрация: 22.04.2011
Сообщений: 7
По умолчанию

KobolD спасибо, что не поленился заглянуть сюда и дать ответ.
А то бывает создаешь тему с вопросом и никто не отвечает.
Цитата:
Ты в условии until (x1<=eps)or(x2<=eps)or(x3<=eps); сравниваешь расчетное значение свободных членов с точностью, с тем же успехом можно сравнивать сантиметры с килограммами.
Попробуй так until (abs(x1-b[1])<=eps)and(abs(x2-b[2])<=eps)and(abs(x3-b[3])<=eps);
Да, мне примерно тоже самое сказали в другом форуме.

Еще раз спасибо.
Mesken вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решение СЛАУ методом итерации (Pascal) mambr Помощь студентам 9 08.02.2011 21:29
Решение нелинейных уравнений методом хорд и методом простой итерации(С++) Foralberg Помощь студентам 9 31.01.2011 01:33
Решение СЛАУ. Метод простой итерации Alexander886 Помощь студентам 5 24.03.2010 18:43
Pascal. Слау методом простых итераций. Shiza321 Помощь студентам 4 22.03.2010 21:08
Решение СЛАУ методом простой итерации (Delphi) giga_person Помощь студентам 8 06.03.2010 21:11