Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Решить систему линейных уравнений методом Зейделя (http://www.tehnari.ru/f41/t93997/)

Chelios_rus 23.01.2014 02:20

Решить систему линейных уравнений методом Зейделя
 
Вложений: 1
Помогите написать программу на языке Паскаль по приложенному файлу. Решение в Excel.

Vladimir_S 23.01.2014 14:55

Цитата:

Сообщение от Chelios_rus (Сообщение 995580)
Помогите написать программу на языке Паскаль по приложенному файлу. Решение в Excel.

Да... Стыдно, но я, похоже, пас. Сам по себе метод несложный, но вот найти предварительное преобразование системы к виду, удовлетворяющему критерию сходимости (т.н. "диагональное преобладание"), мне, увы, так и не удалось. Уж я и так, и сяк - и никак.
Сожалею.

Chelios_rus 23.01.2014 17:31

печально, но спасибо что попробовали

Vladimir_S 23.01.2014 19:05

Цитата:

Сообщение от Chelios_rus (Сообщение 995797)
печально, но спасибо что попробовали

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

Vladimir_S 24.01.2014 11:14

Вложений: 1
Цитата:

Сообщение от Vladimir_S (Сообщение 995843)
Впрочем, завтра, если будет время, попробую "в лоб" - подумал, что условие сходимости типа "диагональное преобладание" может быть и избыточным. Авось и так сойдется.

Ну вот - получилось-таки! Действительно, всё сошлось и программа не пошла вразнос. А могла бы: условие гарантированной сходимости здесь не выполняется. Но - повезло:
Код:

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

Const
 A:Matrix=(( 1.000000,  3.00000, -1.16667),
          ( 0.264706,  1.00000, -0.20588),
          (-0.333330, -0.66667,  1.00000));
 B:Vector=(-0.16667, 0.058824, 0.666667);
 Eps=0.0018;

Var
 X1,X2:Vector;
 i,j:byte;
 Nrm:real;

Function Dif(D1,D2:Vector):Vector;
var
 p:byte;
 DX:Vector;
begin
 for p:=1 to 3 do DX[p]:=D1[p]-D2[p];
 Dif:=DX;
end;

Function Norm_Vect(NV:Vector):Real;
var
 p:byte;
 Sum:Real;
begin
 Sum:=0;
 for p:=1 to 3 do Sum:=Sum+Sqr(NV[p]);
 Norm_Vect:=Sqrt(Sum);
end;

Begin
 for i:=1 to 3 do X1[i]:=0;
 X2:=X1;
 Repeat
  for i:=1 to 3 do
  begin
    X2[i]:=B[i];
    for j:=1 to 3 do
    if j<>i then X2[i]:=X2[i]-A[i,j]*X2[j];
  end;
  Nrm:=Norm_Vect(Dif(X1,X2));
  for i:=1 to 3 do write('  ',X2[i]:8:5);
  write('        ');
  for i:=1 to 3 do write('  ',X2[i]-X1[i]:8:5);
  writeln;
  X1:=X2;
 Until Nrm<=Eps;
 Writeln;
 Writeln('x1= ',X2[1]:8:5,'    x2= ',X2[2]:8:5,'    x3= ',X2[3]:8:5);
 Readln
End.


Chelios_rus 24.01.2014 19:04

ох спасибо большое! сильно выручили, прям благодарен еще раз спасибо)

Chelios_rus 27.01.2014 14:07

такое дело, теперь желательно что бы можно было с клавиатуры ввести любые числа и получить соответствующий результат, но тоже по этому же методу, если вас не затруднит

Vladimir_S 27.01.2014 16:07

Цитата:

Сообщение от Chelios_rus (Сообщение 997454)
такое дело, теперь желательно что бы можно было с клавиатуры ввести любые числа и получить соответствующий результат, но тоже по этому же методу, если вас не затруднит

Да не сказал бы, чтобы не затруднило.
То есть Вам нужна универсальная программа решения СЛАУ методом Гаусса-Зейделя? Большая работа. Ну вот смотрите: в Википедии приведена такая программа на Паскале, казалось бы, только добавить ввод коэффициентов и сумм, но, во-первых, там ставится жесткое условие выполнения "диагонального преобладания", и если оно не выполняется, то система объявляется несовместной, а это не всегда правильно - в частности, в Вашем примере это условие нарушено, а система решается, а вот что будет, если вставить произвольные числа, - Бог ведает, во-вторых, в программе из Вики не рассмотрен обход нулевых диагональных коэффициентов матрицы, а они, вообще говоря, недопустимы, поскольку на них идет деление.
Так что работы тут много, уж и не знаю - скорее всего, не возьмусь. Извините.
А попробуйте сами! Нет?


Часовой пояс GMT +4, время: 06:41.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.