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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.05.2013, 00:35   #1
Bilymo
Пользователь
 
Регистрация: 25.09.2009
Сообщений: 15
По умолчанию Корректность сходимости в методе Зейделя и простых итераций

Здраствуйте! Просьба оценить данную программу, и обратить внимание на сходимость простых итераций и зейделя, а именно интересует число шагов между этими методами решения СЛАУ. Для определения погрешности использовал Евклидову норму.

Код:
Program Gauss;

Const n1=7;  
eps=0.00001;

Var x,temp: real;
  h,s,s1,s2: real;
  
A:array[1..n1,1..n1] of real;
  
A1:array[1..n1,1..n1] of real;
  
xn:array[0..n1] of real;
  
x0:array[1..n1] of real;
  
x1:array[1..n1] of real;
  
x2:array[1..n1] of real;

lx1:array[0..40] of real;
  
lx2:array[0..40] of real;
  
b:array[1..n1] of real;
  
b1:array[1..n1] of real;

cj:array[0..n1] of real;

  i,j,m,k,u1,m1,l,k1,nmax,flag: integer;
  
func0,sum,p,q, p1, q1,max: real;

begin




l:=4;

for i:=1 to n1 do begin

for j:=1 to n1 do begin

if(i<>j) then begin

a[i,j]:=(l+1)*0.01

end

else begin

a[i,j]:=i+l;

end;


end;

b[i]:=i+l;

end;


for i:=1 to n1 do begin

{l:=i-1+l;}

for j:=1 to n1 do begin

if(i<>j) then begin

a[i,j]:=(i+l)*0.01

end

else begin

a[i,j]:=i+l;
end;

end;end;


for i:=1 to n1 do begin

for j:=1 to n1 do begin

b1[i]:=b1[i]+a[i,j]*b[j];
end;
end;


writeln('              ///|   ishod matrix    |\\\       ');
writeln('_______________________________________________________________');

for i:=1 to n1 do begin

for j:=1 to n1 do begin

write(A[i,j]:2:2 , '  ' );
end;

write('| ', b1[i]:2:2,  '  ');

writeln;
end;


writeln('         ///|   Простой итерации    |\\\       ');

writeln('_______________________________________________________________');


repeat

cj[0]:=0;
lx1[0]:=0;

k:=k+1;
for i:=1 to n1 do begin

x0[i]:=xn[i];

end;

writeln('Vector x easy ',k);

for i:=1 to n1 do begin

for j:=1 to n1 do begin

if (i<>j) then
lx1[j]:=lx1[j-1]-a[i,j]*x0[j]
else
lx1[j]:=lx1[j-1];
end;

xn[i]:=(b1[i]+lx1[j])/a[i,i];

{write('| ', xn[i]:2:2,  '  ');}

write('   x',i,'= ', xn[i]);

write;

end;
{

for i:=1 to n1 do begin

p:=x0[i];
q:=xn[i];
x0[i]:=q;
xn[i]:=p;

end;}
sum:=0;

{s:=xn[i];}

write;
for i:=1 to n1 do begin

cj[i]:=cj[i-1]+sqr(x0[i]-xn[i]);
end;
writeln;

writeln('Погреш. ', cj[n1],  '  ');
writeln('steps ', k,  '  ');

writeln('__________________________________________________________');

until sqrt(cj[n1])<eps;


writeln;

for i:=1 to n1 do begin

x1[i]:=x0[i];
lx1[i]:=0;
x0[i]:=0;
xn[i]:=0;
end;

writeln('            ///|   Зейдель    |\\\       ');

writeln('_______________________________________________________________');

repeat

cj[0]:=0;
lx1[0]:=0;
lx2[0]:=0;
for i:=1 to n1 do begin

x0[i]:=xn[i];

end;
k1:=k1+1;

writeln('Vector x ',k1);

for i:=1 to n1 do begin

for j:=1 to i-1 do begin

lx1[j]:=lx1[j-1]-a[i,j]*xn[j];
end;
for m:=i+1 to n1 do begin

lx2[m]:=lx2[m-1]-a[i,m]*x0[m];
end;
xn[i]:=(b1[i]+lx1[j]+lx2[m])/a[i,i];

{write('| ', xn[i]:2:2,  '  ');}

write(' x',i,'= ', xn[i]:2:4);
end;
{
for i:=1 to n1 do begin

p:=x0[i];
q:=xn[i];
x0[i]:=q;
xn[i]:=p;
end;
}
sum:=0;
for i:=1 to n1 do begin

cj[i]:=(cj[i-1]+(x0[i]-xn[i])*(x0[i]-xn[i]));

end;
writeln;
writeln('sum 1', sqrt(cj[i]),  '  ');


writeln('steps ', k1,  '  ');

writeln('__________________________________________________________');
{writeln;}
until sqrt(cj[n1])<eps;

for i:=1 to n1 do begin
x2[i]:=x0[i];
end;

writeln;
writeln;
writeln('            ///|   Вывод    |\\\       ');

writeln('_______________________________________________________________');
writeln;

for i:=1 to n1 do begin

for j:=1 to n1 do begin

write(A[i,j]:2:2 , '  ' );
end;
write('| ', b1[i]:2:2,  '  ');
writeln;
end;
writeln;

writeln('            Простой итерации');

writeln('_______________________________________________________________');
writeln;

for i:=1 to n1 do begin

writeln(' x',i,'= ', x1[i]:2:4);
end;
writeln;

write('       steps ' , k);
writeln;


writeln('                 Зейдель');

writeln('_______________________________________________________________');
writeln;

for i:=1 to n1 do begin

writeln(' x',i,'= ', x2[i]:2:4);
end;
writeln;
write('       steps ' , k1);
writeln;
readln;
end.
Bilymo вне форума Ответить с цитированием
Старый 11.05.2013, 22:08   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Просьба оценить данную программу
Оценил, садись, пятерка.

Цитата:
обратить внимание на сходимость простых итераций и зейделя
обратил - традиционно сходимость зейделя быстрее, так как на каждой итерации юзается не прошлоитерационный икс, а нынешний. Ничего нового, что привлекало бы внимание. В чем вопрос-то?

Цитата:
интересует число шагов между этими методами решения СЛАУ
Это уже совсем непонятно. Вас интересует разница в числе шагов в этих методах или что? Уж точно между никаких шагов быть не может
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 11.05.2013, 22:27   #3
Bilymo
Пользователь
 
Регистрация: 25.09.2009
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
Оценил, садись, пятерка.



обратил - традиционно сходимость зейделя быстрее, так как на каждой итерации юзается не прошлоитерационный икс, а нынешний. Ничего нового, что привлекало бы внимание. В чем вопрос-то?



Это уже совсем непонятно. Вас интересует разница в числе шагов в этих методах или что? Уж точно между никаких шагов быть не может
Да разница в числе шагов этих методов и интересует есть ли ясное обьяснение (мат формулировка) почему результаты в зейделе не сходяться как в простой итерации? Хотя программа верная выходит...
Bilymo вне форума Ответить с цитированием
Старый 11.05.2013, 22:33   #4
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Хотя программа верная выходит...
Вы это как проверяли?

Цитата:
почему результаты в зейделе не сходяться как в простой итерации?
Во-первых, это зависит от исходной матрицы. Во-вторых... ну вот тут хотя бы почитайте:

http://mathhelpplanet.com/static.php...resheniya-slau

там же и метод простых итераций. Сравните условия применения и условия сходимости обоих методов.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 11.05.2013, 23:58   #5
Bilymo
Пользователь
 
Регистрация: 25.09.2009
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
Вы это как проверяли?



Во-первых, это зависит от исходной матрицы. Во-вторых... ну вот тут хотя бы почитайте:

http://mathhelpplanet.com/static.php...resheniya-slau

там же и метод простых итераций. Сравните условия применения и условия сходимости обоих методов.
Хотябы что, исходя из данных условиях, выдает результат, как в диаганальных элементах, но отыскание погрешности в программе верно?

Последний раз редактировалось Bilymo; 12.05.2013 в 00:12.
Bilymo вне форума Ответить с цитированием
Старый 12.05.2013, 01:20   #6
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
но отыскание погрешности в программе верно?
Да, это Евклидова норма.

А для проверки правильности работы программы добавьте небольшой код умножения исходной матрицы на полученный вектор - сразу увидите, совпадает результат с исходным значением вектора правой части СЛАУ или нет (естественно с учетом заданной точности).
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 12.05.2013, 04:43   #7
Bilymo
Пользователь
 
Регистрация: 25.09.2009
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
Да, это Евклидова норма.

А для проверки правильности работы программы добавьте небольшой код умножения исходной матрицы на полученный вектор - сразу увидите, совпадает результат с исходным значением вектора правой части СЛАУ или нет (естественно с учетом заданной точности).
Я осуществил проверку, умножив полученные x иксы на расширенную матрицу, как ожидалось в итерациях решения совпадают с правой частью исходной, а в Зейделе... отклонения от исходного свободного столбца хуже, совпадает точно только последнее решение.
Bilymo вне форума Ответить с цитированием
Старый 12.05.2013, 09:34   #8
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
умножив полученные x иксы на расширенную матрицу
А почему на расширенную? Надо ж на исходную умножать...

Цитата:
совпадает точно только последнее решение.
на самом деле как раз это-то и есть редкость. Методы же для приближенных вычислений корня.

В любом случае если отклонение иксов в обоих методах и отклонение проверки от исходного вектора сильно большие, то проверяйте метод Зейделя, видимо - где-то ошибка. Как минимум, иксы в обоих методах не должны сильно отличаться.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 12.05.2013, 11:48   #9
Bilymo
Пользователь
 
Регистрация: 25.09.2009
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение


на самом деле как раз это-то и есть редкость. Методы же для приближенных вычислений корня
У меня результат умножения рещений на матрицу/матрицу со свободным(исходный) вектор тот же выходит.
В чем эта редкость заключается? И если есть ошибка, то где может быть зарыт фазан?

Последний раз редактировалось Bilymo; 12.05.2013 в 11:50.
Bilymo вне форума Ответить с цитированием
Старый 12.05.2013, 15:02   #10
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
У меня результат умножения рещений на матрицу/матрицу со свободным(исходный) вектор тот же выходит.
ничего не понял, если честно.

Цитата:
В чем эта редкость заключается?
Я неточно выразился - на самом деле все зависит от заданной точности вычислений.
Суть в том, что корень, вычисленный точно (например, методом Гаусса) будет отличаться от корня, вычисленного приближенно. Так же будут отличаться корни, приближенно вычисленные разными итерационными методами.

Цитата:
И если есть ошибка, то где может быть зарыт фазан?
Я таки склоняюсь к мнению, что ошибки нет, просто попробуйте повысить точность в методе Зейделя.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
решить систему нелинейных уравнений методом зейделя или простых итераций malishka_ Помощь студентам 1 02.12.2012 12:43
метод простых итераций, с++ kaljan775 Помощь студентам 0 08.03.2011 16:55
Метод простых итераций bloodargus Общие вопросы C/C++ 0 24.11.2010 19:20
Метод простых итераций bloodargus Общие вопросы C/C++ 1 20.11.2010 12:48