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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 103, средняя оценка - 4.96
Raze
Сообщений: n/a
#1

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

02.06.2008, 20:13. Просмотров 14423. Ответов 11
Метки нет (Все метки)

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

СЛАУ. Метод обратной матрицы, метод Гаусса, метод Крамера, метод Зейделя - C++
Помогите ребят. Не могу построить алгоритмы для этих методов Язык C++

Метод итераций и метод Зейделя - C++
Здравсвуйте программисты! Спасибо всем за помощь в предыдущих темах, осталась последняя лаба, которую нужно решить по предмету "Численные...

Метод Зейделя: - C++
Здравствуйте, у меня получается на данный момент X1 := -8.32587e+307 X2 := -inf X3 := inf я скопировал сам метод зейделя с...

Метод Зейделя - C++
Я написал прогу по методу Зейделя, так вот при матрице 3х3 выдает после 7 итерации правильный ответ) а при матрице 4х4 уже на второй...

Метод Зейделя - C++
Ребята, каждый из вас уже делал лабы по матрицам. Если у кого-то есть готовая лаба по методу Зейделя, прошу, напишите ее тут и желательно с...

Метод Зейделя - C++
решить систему нелинейных уравнений Методом зейделя:

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Raze
Сообщений: n/a
03.06.2008, 10:27 #2
Ребят метод Зейделя для матриц именно вот...
Lord_Voodoo
Супер-модератор
8589 / 2189 / 61
Регистрация: 07.03.2007
Сообщений: 10,890
Завершенные тесты: 1
03.06.2008, 10:34 #3
ты напиши теорию, попробую написать прогу...
0
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
Супер-модератор
8589 / 2189 / 61
Регистрация: 07.03.2007
Сообщений: 10,890
Завершенные тесты: 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.
0
Raze
Сообщений: n/a
04.06.2008, 10:04 #7
Wodoo thx большое только блин ну я в с++ еще мб понимаю а в паскале ваще 0,не мог бы ты перевести в с++?Оч прошу)
Lord_Voodoo
Супер-модератор
8589 / 2189 / 61
Регистрация: 07.03.2007
Сообщений: 10,890
Завершенные тесты: 1
04.06.2008, 10:11 #8
неужели на весь поток нет ни одного знающего с++... просто завал на работе... sorry...
0
Raze
Сообщений: n/a
04.06.2008, 15:48 #9
Серьезна нету))Мы физики все таки, а програмирование у нас так второстепенное.+преподы нифига не объясняют,сами кое как разбираемся по книгам, но ето не то)Вообще в ближайшее время попробуй плз не обязательно щас)Заранее благодарю
Lord_Voodoo
Супер-модератор
8589 / 2189 / 61
Регистрация: 07.03.2007
Сообщений: 10,890
Завершенные тесты: 1
09.06.2008, 18:42 #10
вроде бы этот код тебе подойдет, глянь ... http://cc.msnscache.com/cache.aspx?q...e0fe&FORM=CVRE
0
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();
}
0
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 минуты
в паскале
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.04.2013, 19:01
Привет! Вот еще темы с ответами:

Метод Зейделя - C++
ошибка найдена. тема закрыта

метод Зейделя. c++ - C++
В цикле do while есть ошибка, из-за неё программа не правильно считает Xold и Xnew. Помогите, пожалуйста, найти ошибку... #pragma once ...

Метод Зейделя в С++ - C++
всем доброго времени суток... у меня такая проблема, есть программа по решению систем линейных уравнений методом Зейделя написали мне...

Метод Гаусса-Зейделя - C++
Здравствуйте. Задание дали нормальное такое) Вообще не понимаю что хотят. Объясните пожалуйста языком для домохозяек или же есть у кого...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru