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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2010, 21:49   #1
L_M
Форумчанин Подтвердите свой е-майл
 
Регистрация: 25.02.2008
Сообщений: 289
По умолчанию Метод Зейделя(-Гаусса) решеня систем

Здравствуйте. У меня возникла проблема с этим методом: дается неверный результат. Насколько я знаю, метод применим, когда есть диагональное преобладание и система неприводима. Вот система из четырех уравнений(последний столбец - свободные члены)
5 2 1 1 10
1 3 1 1 6
1 3 7 1 12
1 1 4 9 15
Ее корнями будут 4 единицы. Однако получается такой результат
0,993045897079277 0,972183588317107 1,1557719054242 0,934631432545202
при заданной точности 0.00001
Код:
    repeat
        big:=0;
        for i:=1 to n do begin
            sum:=0;
            if (i<>1) then begin
                for j:=1 to i-1 do
                    if (i<>j) then
                        sum:=sum+a[i,j]*x[j];
            end;
                if (j<>n-1) then begin
                    for j:=i+1 to n do
                        sum:=sum+a[i,j]*x[j];
                end;
                tmp:=(1/a[i,i])*(a[i,n+1]-sum);
                if (abs(tmp-x[i])>big) then
                    big:=abs(tmp-x[i]);
                x[i]:=tmp;
        end;
        iter:=iter+1;
    until (maxi<iter)or(eps>big);
Вот код самого метода. В выделенном куске вычисляется максимальное расхождение результатов соседних итераций. Но результат неверен(конечно близок, но расхождение в 0.16 при требуемой точности 0.00001 как-то нехорошо) и достигается всего за 8 итераций. Так как точность не увеличивается, то я могу предположить лишь что метод неверен. Однако я набрал этот код по блок-схеме из какой-то серьезной книги, а потом нагуглил и курсовую по этому методу с программой. Результат такой же.

ЗЫ Извиняюсь за ошибки(грамматические)
Упс...
L_M вне форума Ответить с цитированием
Старый 01.06.2010, 23:42   #2
Ника3009
Новичок
Джуниор
 
Регистрация: 31.05.2010
Сообщений: 1
По умолчанию

Код:
Uses CRT;

Const
     maxn = 10;

Type
    Data = Real;
    Matrix = Array[1..maxn, 1..maxn] of Data;
    Vector = Array[1..maxn] of Data;

{ Процедура ввода расширенной матрицы системы }
Procedure ReadSystem(n: Integer; var a: Matrix; var b: Vector);
Var
   i, j, r: Integer;
Begin
     r := WhereY;
     GotoXY(2, r);
     Write('A');
     For i := 1 to n do begin
         GotoXY(i * 6 + 2, r);
         Write(i);
         GotoXY(1, r + i + 1);
         Write(i:2);
     end;
     GotoXY((n + 1) * 6 + 2, r);
     Write('b');
     For i := 1 to n do begin
         For j := 1 to n do begin
             GotoXY(j * 6 + 2, r + i + 1);
             Read(a[i, j]);
         end;
         GotoXY((n + 1) * 6 + 2, r + i + 1);
         Read(b[i]);
     end;
End;

{ Процедура вывода результатов }
Procedure WriteX(n :Integer; x: Vector);
Var
   i: Integer;
Begin
     For i := 1 to n do
         Writeln('x', i, ' = ', x[i]);
End;


{ Функция, реализующая метод Зейделя }
Function Seidel(n: Integer; a: Matrix; b: Vector; var x: Vector; e: Data) :Boolean;
Var
   i, j: Integer;
   s1, s2, s, v, m: Data;
Begin

     { Исследуем сходимость }
     For i := 1 to n do begin

         s := 0;
         For j := 1 to n do
             If j <> i then
                s := s + Abs(a[i, j]);

         If s >= Abs(a[i, i]) then begin
            Seidel := false;
            Exit;
         end;

     end;

     Repeat

         m := 0;
         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];

             { Вычисляем новое приближение и погрешность }
             v := x[i];
             x[i] := x[i] - (1 / a[i, i]) * (s1 + s2 - b[i]);

             If Abs(v - x[i]) > m then
                m := Abs(v - x[i]);

         end;

     Until m < e;

     Seidel := true;
End;

Var
    n, i: Integer;
    a: Matrix;
    b, x: Vector;
    e: Data;
Begin
      ClrScr;
      Writeln('Программа решения систем линейных уравнений по методу Зейделя');
      Writeln;

      Writeln('Введите порядок матрицы системы (макс. 10)');
      Repeat
             Write('>');
             Read(n);
      Until (n > 0) and (n <= maxn);
      Writeln;

      Writeln('Введите точность вычислений');
      Repeat
             Write('>');
             Read(e);
      Until (e > 0) and (e < 1);
      Writeln;

      Writeln('Введите расширенную матрицу системы');
      ReadSystem(n, a, b);
      Writeln;


      { Предполагаем начальное приближение равным нулю }
      For i := 1 to n do
          x[i] := 0;

      If Seidel(n, a, b, x, e) then begin
         Writeln('Результат вычислений по методу Зейделя');
         WriteX(n, x);
      end
      else
          Writeln('Метод Зейделя не сходится для данной системы');
      Writeln;
End.
Программа решения систем линейных уравнений по методу Зейделя

Введите порядок матрицы системы (макс. 10)
>4

Введите точность вычислений
>.000001

Введите расширенную матрицу системы
A 1 2 3 4 b

1 4.1 0.1 0.2 0.2 21.14
2 0.3 5.3 0.9 -0.1 -17.82
3 0.2 0.3 3.2 0.2 9.02
4 0.1 0.1 0.2 -9.1 17.08

Результат вычислений по методу Зейделя
x1 = 5.2000000008E+00
x2 = -4.2000000028E+00
x3 = 3.0000000003E+00
x4 = -1.8000000000E+00

Последний раз редактировалось Stilet; 30.06.2010 в 13:24.
Ника3009 вне форума Ответить с цитированием
Старый 30.06.2010, 10:44   #3
rashsash
Новичок
Джуниор
 
Регистрация: 30.06.2010
Сообщений: 2
По умолчанию

Уважаемый L_M сумма 5+1+1+2 равна 9, а не 10
rashsash вне форума Ответить с цитированием
Старый 30.06.2010, 11:41   #4
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

для вашей точности, ответ очень даже хороший. Попробуйте увеличить точность до 0.000000001

Но вообще говоря я не понял что у вас за реализация этого метода. На сколько я помню, там нужно составлять матрицу Якоба , используя производные. Могу ошибаться конечно...

Последний раз редактировалось NiCola999; 30.06.2010 в 11:43.
NiCola999 вне форума Ответить с цитированием
Старый 30.06.2010, 13:09   #5
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

L_M, Корнями вашей системы никак не могут быть единицы. Так что результат правильный.
NiCola999, Дело совершенно не в точности, а в том, что описал rashsash. Плохо вы помните. Чтобы Гауссом защими систему нужна лишь сама система и ничего более. А матрица Якоби к этой задаче вообще никакого отношения не имеет. У вас в голове просто всплыли знакомые слова, которые якобы имеют отношение к методу Гаусса.
mMAg вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решения СЛАУ методом Гаусса и Зейделя [ICQ] Помощь студентам 0 04.05.2010 20:51
Безумно сложные задачки!!!! Метод Гаусса, итераций, метод половинного деления, задача Коши и т.д. Хомяк!!!!! Помощь студентам 4 08.07.2009 10:08
Метод итераций и метод Зейделя prikolist Общие вопросы C/C++ 40 18.06.2009 17:40