Форум программистов, компьютерный форум CyberForum.ru

метод Зейделя - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 103, средняя оценка - 4.96
Raze
Сообщений: n/a
02.06.2008, 20:13     метод Зейделя #1
Ребят помогите пожалуйста, а то зачот простаивает)Нужна программка реализующая метод Зейделя(или Зейзеля препод так написал что непонятно).ПРоста в лекциях не давал, а на зачот дал((Оч прошу от всего курса благодарность будет))
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.06.2008, 20:13     метод Зейделя
Посмотрите здесь:

Метод Зейделя C++
C++ Метод итераций и метод Зейделя
метод зейделя C++
C++ Метод Зейделя
C++ Метод Зейделя в С++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Raze
Сообщений: n/a
03.06.2008, 10:27     метод Зейделя #2
Ребят метод Зейделя для матриц именно вот...
Lord_Voodoo
Супер-модератор
 Аватар для Lord_Voodoo
8501 / 2168 / 61
Регистрация: 07.03.2007
Сообщений: 10,836
Завершенные тесты: 1
03.06.2008, 10:34     метод Зейделя #3
ты напиши теорию, попробую написать прогу...
Raze
Сообщений: n/a
03.06.2008, 21:31     метод Зейделя #4
Метод Зейделя


1.2.1. Приведение системы к виду, удобному для итераций. Для того
чтобы применить метод Зейделя к решению системы линейных алгебраических
уравнений

Ax = b
с квадратной невырожденной матрицей A, необходимо предварительно
преобразовать эту систему к виду

x = Bx + c.

Здесь B – квадратная матрица с элементами bij (i, j = 1, 2, …, n), c –
вектор-столбец с элементами cij (i = 1, 2, …, n).
В развернутой форме записи система имеет следующий вид:

x1 = b11x1 + b12x2 + b13x3 + … + b1nxn + c1
x2 = b21x1 + b22x2 + b23x3 + … + b2nxn + c2
. . . . . . . . . . . . . . . . .
xn = bn1x1 + bn2x2 + bn3x3 + … + bnnxn + cn



Вообще говоря, операция приведения системы к виду, удобному для
итераций, не является простой и требует специальных знаний, а также
существенного использования специфики системы.
Самый простой способ приведения системы к виду, удобному для
итераций, состоит в следующем. Из первого уравнения системы выразим
неизвестное x1:

x1 = a11–1 (b1 – a12x2 – a13x3 – … – a1nxn),

из второго уравнения – неизвестное x2:

x2 = a21–1 (b2 – a22x2 – a23x3 – … – a2nxn),

и т. д. В результате получим систему

x1 = b12x2 + b13x3 + … + b1,n–1xn–1 + b1nxn+ c1 ,
x2 = b21x1 + b23x3 + … + b2,n–1xn–1 + b2nxn+
c2 ,
x3 = b31x1 + b32x2 + … + b3,n–1xn–1 + b3nxn+
c3 ,
. . . . . . . . . . . . . . . . . .
. . . . .
xn = bn1x1 + bn2x2 + bn3x3 + … + bn,n–1xn–1 +
cn ,

в которой на главной диагонали матрицы B находятся нулевые элементы.
Остальные элементы выражаются по формулам

bij = –aij / aii, ci = bi / aii (i, j = 1, 2, …, n, j ? i)

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

1.2.1. Описание метода. Введем нижнюю и верхнюю треугольные матрицы

0 0 0 … 0 0 b12 b13 … b1n
b21 0 0 … 0 0 0 b23 … b2n
B1 = b31 b32 0 … 0 , B2 = 0 0 0 …
b3n
. . . . . . . . . . . . . .
bn1 bn2 bn3 … 0 0 0 0 … 0

Заметим, что B = B1 + B2 и поэтому решение x исходной системы
удовлетворяет равенству

x = B1x + B2 x + c .

Выберем начальное приближение x(0) = [x1(0), x2(0), …, xn(0)]T.
Подставляя его в правую часть равенства при верхней треугольной матрице B2
и вычисляя полученное выражение, находим первое приближение

x(1) = B1x(0) + B2x(1)

Подставляя приближение x(1), получим

x(2) = B1x(1) + B2x(2)

Продолжая этот процесс далее, получим последовательность x(0), x(1), …,
x(n), … приближений к вычисляемых по формуле

x(k+1) = B1(k+1) + B2(k) + c

или в развернутой форме записи

x1(k+1) = b12x2(k) + b13x2(k) + … + b1nxn(k) + c1 ,
x2(k+1) = b21x1(k+1) + b23x3(k) + … + b2nxn(k) +
c2 ,
x3(k+1) = b31x1(k+1) + b32x2(k+1) + … + b3nxn(k) +
c3 ,
. . . . . . . . . . . . . . . . . .
. . . . . . . .
xn(k+1) = bn1x1(k+1) + bn2x2(k+1) + bn3x3(k+1) + … +
cn .

Объединив приведение системы к виду, удобному для итераций и метод
Зейделя в одну формулу, получим

xi(k+1) = xi(k) – aii–1(Sj=1i–1 aijxj(k+1) + Sj=1n aijxi(k) – bi).

Тогда достаточным условием сходимоти метода Зейделя будет

Sj=1, j?i n | aij | < | aii |

(условие доминированния диагонали).
Метод Зейделя иногда называют также методом Гаусса-Зейделя, процессом
Либмана, методом последовательных замещений.
Raze
Сообщений: n/a
03.06.2008, 21:33     метод Зейделя #5
Воть.Помогите кто знает плзз оч надо))
Lord_Voodoo
Супер-модератор
 Аватар для Lord_Voodoo
8501 / 2168 / 61
Регистрация: 07.03.2007
Сообщений: 10,836
Завершенные тесты: 1
04.06.2008, 09:28     метод Зейделя #6
вот тебе код на паскале, перевести на с++ несложно:
Код
2.1.4. Листинг программы и результаты работы
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 Gauss(n: Integer; a: Matrix; b: Vector; var x:Vector): Boolean;
Var
i, j, k, l: Integer;
q, m, t: Data;
Begin
For k := 1 to n - 1 do begin
{ Ищем строку l с максимальным элементом в k-ом столбце}
l := 0;
m := 0;
For i := k to n do
If Abs(a[i, k]) > m then begin
m := Abs(a[i, k]);
l := i;
end;
{ Если у всех строк от k до n элемент в k-м столбце нулевой,
то система не имеет однозначного решения }
If l = 0 then begin
Gauss := false;
Exit;
end;
{ Меняем местом l-ую строку с k-ой }
If l <> k then begin
For j := 1 to n do begin
t := a[k, j];
a[k, j] := a[l, j];
a[l, j] := t;
end;
t := b[k];
b[k] := b[l];
b[l] := t;
end;
{ Преобразуем матрицу }
For i := k + 1 to n do begin
q := a[i, k] / a[k, k];
For j := 1 to n do
If j = k then
a[i, j] := 0
else
a[i, j] := a[i, j] - q * a[k, j];
b[i] := b[i] - q * b[k];
end;
end;
{ Вычисляем решение }
x[n] := b[n] / a[n, n];
For i := n - 1 downto 1 do begin
t := 0;
For j := 1 to n-i do
t := t + a[i, i + j] * x[i + j];
x[i] := (1 / a[i, i]) * (b[i] - t);
end;
Gauss := true;
End;
Var
n, i: Integer;
a: Matrix ;
b, x: Vector;
Begin
ClrScr;
Writeln('Программа решения систем линейных уравнений по методу Гаусса');
Writeln;
Writeln('Введите порядок матрицы системы (макс. 10)');
Repeat
Write('>');
Read(n);
Until (n > 0) and (n <= maxn);
Writeln;
Writeln('Введите расширенную матрицу системы');
ReadSystem(n, a, b);
Writeln;
If Gauss(n, a, b, x) then begin
Writeln('Результат вычислений по методу Гаусса');
WriteX(n, x);
end
else
Writeln('Данную систему невозможно решить по методу Гаусса');
Writeln;
End.
Raze
Сообщений: n/a
04.06.2008, 10:04     метод Зейделя #7
Wodoo thx большое только блин ну я в с++ еще мб понимаю а в паскале ваще 0,не мог бы ты перевести в с++?Оч прошу)
Lord_Voodoo
Супер-модератор
 Аватар для Lord_Voodoo
8501 / 2168 / 61
Регистрация: 07.03.2007
Сообщений: 10,836
Завершенные тесты: 1
04.06.2008, 10:11     метод Зейделя #8
неужели на весь поток нет ни одного знающего с++... просто завал на работе... sorry...
Raze
Сообщений: n/a
04.06.2008, 15:48     метод Зейделя #9
Серьезна нету))Мы физики все таки, а програмирование у нас так второстепенное.+преподы нифига не объясняют,сами кое как разбираемся по книгам, но ето не то)Вообще в ближайшее время попробуй плз не обязательно щас)Заранее благодарю
Lord_Voodoo
Супер-модератор
 Аватар для Lord_Voodoo
8501 / 2168 / 61
Регистрация: 07.03.2007
Сообщений: 10,836
Завершенные тесты: 1
09.06.2008, 18:42     метод Зейделя #10
вроде бы этот код тебе подойдет, глянь ... http://cc.msnscache.com/cache.aspx?q...e0fe&FORM=CVRE
MsDos
 Аватар для MsDos
5 / 5 / 1
Регистрация: 13.05.2008
Сообщений: 91
17.06.2008, 22:10     метод Зейделя #11
если еще актуально
у меня как раз курсовая была така сейчас, есть написанная программа на досе и в билдере с использованием динамических массивов.
код для проги в досе:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#include <math.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <fstream.h>
#include <iostream.h>
int k, t, i;
 
 
int HMEV()
{
 i=0;
 int n;
 do{ if (i == 1) printf("The number you entered isn't belong the period [1;10], please, try again: ");
 cin>>n; i=1;
 }while ((n>10) || (n<1));
 return n;
}
 
double **DFND(double *(*pMas), int m, int n) { for(k=0; k<m; k++) pMas[k] = new double [n]; return pMas;}
 
double **CORD(double *(*pMas), int m, int n, char *file)
{
 i = 0; ifstream SMas(file);
 while ((!SMas.eof())&&(i!=m*n))
 {
  for(k=0; k<m; k++) for(t=0; t<n; t++) { SMas>>pMas[k][t]; i++; }
 }
 SMas.close();
 return  pMas;
}
 
void COUT(double *(*pMas), int m, int n)
{
 for (k=0; k<m; k++) { for (t=0; t<n; t++)
 { if (t != n-1) {cout<<pMas[k][t]<<", ";} else {cout<<pMas[k][t]<<";\n";} }}
}
 
//--------------------------------------------------
 
double **FOCH(double *(*a), double *(*A), double *(*B), int m, int n)
{
 for (k=0; k<m; k++) for (t=0; t<n; t++) if (k!=t) a[k][t]=A[k][t]/B[k][k]; else a[k][t]=0;
 return a;
}
 
int EXTZ (double *(*a), int n)
{
 i=0; double S=0;
 for (k=0; k<n; k++) for (t=0; t<n; t++) S+=a[k][t]*a[k][t];
 if (sqrt(S) < 1) i=1;
 return i;
}
 
 
 
double **CTXi(double *(*a), double *(*b), double *(*X), int n, int i)
{
 double Q = b[i][0];
 for (t=0; t<n; t++) Q += a[i][t]*X[0][t];
 X[0][i] = Q;
 return X;
}
 
double **CONT(double *(*a), double *(*b), double *(*X), double e, int n)
{
 double E1 = 0, E2 = 0;
 do {
  for (i=0; i < n; i++)
  {
   double S = X[0][i];   
   CTXi(a, b, X, n, i);
   E1 += (X[0][i] - S)*(X[0][i] - S);
   E2 += (X[0][i])*(X[0][i]);
  }
 }while (sqrt(E1/E2) > e);
 return X;
}
 
//--------------------------------------------------
 
void DELT(double *(*pMas), int n)
{
 for (k=0; k<n; k++) delete pMas[k];
 delete []pMas;
}
 
 
//==================================================
void main ()
{  int key=0;
do{
 clrscr();
 char *FA = "A.TXT", *FB = "B.TXT", *FX = "X.TXT", *Fe = "e.TXT";
 printf("This programm is solving the SLAE by iteration method named Ze'del. The start values its keeps from files, but you can choose the size of the sistem. It can be betwin 1*1 to 10*10 size.\n\n");
 printf("Well, enter the number of equils and variables, please: ");
 const int n = HMEV();
 const double e = 0.001;
 cout<<"\nEpselon = "<<e<<"\n";
 
 double **A = new double *[n];
 double **a = new double *[n];
 double **B = new double *[n];
 double **b = new double *[n];
 double **X = new double *[1];
 
 DFND(A, n, n);
 DFND(a, n, n);
 DFND(B, n, 1);
 DFND(b, n, 1);
 DFND(X, 1, n);
//-----------------------------------------
 
 CORD(A, n, n, FA);
 CORD(B, n, 1, FB);
 CORD(X, 1, n, FX);
 
 printf("\nThe matrix of coefficients:\n");
 COUT(A, n, n);
 printf("\nThe matrix of free parts:\n");
 COUT(B, n, 1);
 printf("\nStart values of variables:\n");
 COUT(X, 1, n);
 printf("\nThe values loaded from files.\nCalculations may take some time, so please, be patiant: we're in work.\n");
 
 
 FOCH(a, A, A, n, n);
 FOCH(b, B, A, n, 1);
 for (k=0; k<n; k++) for (t=0; t<n; t++) a[k][t]*=-1;
 
 if (EXTZ(a, n) == 1)
 {
  CONT(a, b, X, e, n);
  printf("\n----------------------\nThe solve of the sistem:\n");
  COUT(X, 1, n);
 }
 else printf("\n\n----------------------\nThis sistem has not the solve because its norma is higher or equil 1.\n");
 
//-----------------------------------------
 DELT(A, n);
 DELT(a, n);
 DELT(B, n);
 DELT(b, 1);
 DELT(X, 1);
 
//-----------------------------------------
 printf("\nWould like to again? (y/n) ");
 key=getch();
}while ((key!=110)&&(key!=27));
// getch();
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.04.2013, 19:01     метод Зейделя
Еще ссылки по теме:

Метод Зейделя C++
C++ метод Зейделя. c++
C++ Метод Зейделя

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
marazmatik
0 / 0 / 0
Регистрация: 20.11.2012
Сообщений: 2
28.04.2013, 19:01     метод Зейделя #12
Цитата Сообщение от Lord_Voodoo Посмотреть сообщение
вроде бы этот код тебе подойдет, глянь ... http://cc.msnscache.com/cache.aspx?q...e0fe&FORM=CVRE
а как заставить вводить данные с файла, а то я не получаетсо никак?

Добавлено через 42 минуты
в паскале
Yandex
Объявления
28.04.2013, 19:01     метод Зейделя
Ответ Создать тему
Опции темы

Текущее время: 02:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru