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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2011, 01:04   #1
Yulian@
Новичок
Джуниор
 
Аватар для Yulian@
 
Регистрация: 30.03.2011
Сообщений: 6
Восклицание Метод скорейшего спуска решение СЛУ

подскажите пожалуйста почему программа работает не доконца?

#include <stdlib.h>
#include <iostream.h>
void put( double **x, size_t n, size_t m )
{size_t i, j;
for( i = 0; i < n; i++ )
{for( j = 0; j < m; j++ )
cout << x[i][j] << "\t";
cout << endl;}}
double *mul( double **x, double *r, size_t n )
{size_t i, j;
double *ret = new double [n];
i = n; while ( i-- ) {
double p = .0;
j = n;
while ( j-- ) p += x[i][j] * r[j];
ret[i] = p;}
return ret; }
int main( int argv, char *argc[] ) {
cout << " ÌÅÒÎÄ ÍÀÉØÂÈÄØÎÃÎ ÑÏÓÑÊÓ ÄËß "<<endl;
cout << " ÐÎÇÂ'ßÇÀÍÍß ÑÈÑÒÅÌÈ Ë²Í²ÉÍÈÕ Ð²ÂÍßÍÜ "<<endl;
cout << "-------------------------------------------------------------------"<<endl;
cout << "ÂÂÅIJÒÜ ÐÎÇ̲РÌÀÒÐÈÖ²: ";
size_t n; cin >> n;
size_t i, k;
double **a = new double *[n];
i = n; while ( i-- ) a[i] = new double [n + 1];
double **x = new double *[2];
i = 2; while ( i-- ) x[i] = new double [n];
double *r = new double [n];
cout << "ÂÂÅIJÒÜ ÌÀÒÐÈÖÞ ÊÎÅÔ²Ö²ªÍÒ²Â:" << endl;
for( i = 0; i < n; i++ )
for( k = 0; k < n; k++ )
cin >> a[i][k];
cout << "--------------------------------------------------------------------------------";
cout << "ÂÂÅIJÒÜ Â²ËÜͲ ÅËÅÌÅÍÒÈ: ";
for( i = 0; i < n; i++ ) cin >> a[i][n];
cout << "ÂÂÅIJÒÜ ÏÎ×ÀÒÊÎÂÅ ÍÀÁËÈÆÅÍÍß: ";
for ( i = 0; i < n; i++ ) cin >> x[0][i];
cout << "ÂÂÅIJÒÜ ÒÎ×ͲÑÒÜ eps: ";
double eps; cin >> eps;
double mu;
do {
r = mul( a, x[0], n );
i = n; while ( i-- ) r[i] -= a[i][n];
double *v = mul( a, r, n );
double *g = mul( a, v, n );
double l = 0.;
double q = 0.;
for( i = 0; i < n; i++ )
{ l += r[i] + g[i];
q += g[i] * g[i]; }
mu = l / q;
for ( i = 0; i < n; i++ ) x[1][i] = x[0][i] - mu * v[i];
delete []g;
delete []v;
double r_max;
r_max = r[0];
if ( r_max < 0 ) r_max = -r_max;
for( k = 0; k < n; k++ )
{ if (r_max<r[k]) r_max=r[k];}
if ( r_max < eps ) break;
for( i = 0; i < n; i++ )
{ x[0][i] = x[1][i];
x[1][i] = 0; }
delete []r;
} while( 1 );
cout << "Mu: " << mu << endl;
cout << "r:" << endl;
for ( i = 0; i < n; i++ ) cout << "\t" << r[i] << endl;
cout << endl;
cout << "ÍÀÁËÈÆÅÍͲ ÊÎÐÅͲ ÑÈÑÒÅÌÈ:" << endl;
for ( i = 0; i < n; i++ ) cout << "\t" << x[0][i] << endl;
cout << endl;
delete []r;
i = 2; while ( i-- ) delete []x[i];
delete []x;
i = n; while ( i-- ) delete []a[i];
delete []a;
return EXIT_SUCCESS; }
Yulian@ вне форума Ответить с цитированием
Старый 30.03.2011, 01:33   #2
reynevan
Пользователь
 
Регистрация: 15.07.2010
Сообщений: 35
По умолчанию

подвисает? не на этом месте while( 1 );?
reynevan вне форума Ответить с цитированием
Старый 30.03.2011, 01:36   #3
Yulian@
Новичок
Джуниор
 
Аватар для Yulian@
 
Регистрация: 30.03.2011
Сообщений: 6
По умолчанию

да подвисает!!! а куда нужно поставить while(1) в этом случаи?
Yulian@ вне форума Ответить с цитированием
Старый 30.03.2011, 01:42   #4
reynevan
Пользователь
 
Регистрация: 15.07.2010
Сообщений: 35
По умолчанию

возможно, условие выхода из while никогда не срабатывает
reynevan вне форума Ответить с цитированием
Старый 30.03.2011, 01:52   #5
Yulian@
Новичок
Джуниор
 
Аватар для Yulian@
 
Регистрация: 30.03.2011
Сообщений: 6
По умолчанию

и как это исправить!?
Yulian@ вне форума Ответить с цитированием
Старый 30.03.2011, 09:00   #6
KobolD
Форумчанин
 
Регистрация: 10.06.2010
Сообщений: 239
По умолчанию

Ты бы код нормально оформил а то нечитабельно.
Код:
for( k = 0; k < n; k++ )
      { if (r_max<r[k]) r_max=r[k];}
if ( r_max < eps ) break;
Мне кажется ты вот тут напутал, судя по условию в цикле ты ищеш максимальный элемент, а для выхода из цикла нужно чтобы элемент был меньше eps тоесть если первый элемент r[0] ( строка r_max = r[0]; ) не удовлетворяет условию r[0] < eps то цикл никогда не прекратится.
Ну исправить это собственно можно поменяв условие на if (r_max>r[k]) r_max=r[k]; Но только я не уверен что тогда программа будет давать пральныйц ответ, т.к. я с самим алгоритмом не разбирался.
Чтобы слова не расходились с делом, нужно молчать и ничего не делать.

Последний раз редактировалось KobolD; 30.03.2011 в 09:03.
KobolD вне форума Ответить с цитированием
Старый 30.03.2011, 14:48   #7
Yulian@
Новичок
Джуниор
 
Аватар для Yulian@
 
Регистрация: 30.03.2011
Сообщений: 6
По умолчанию

а можна как то вот эту сходимость убрать, и место нее вставить количество итераций!?
Yulian@ вне форума Ответить с цитированием
Старый 30.03.2011, 15:16   #8
KobolD
Форумчанин
 
Регистрация: 10.06.2010
Сообщений: 239
По умолчанию

Ну если ты опишеш принцип работы алгоритма, то можно что нибудь придумать, а то ковыряться в твоей программе не хочется, темболее у тебя там ни отступов ни коментариев нет.
Чтобы слова не расходились с делом, нужно молчать и ничего не делать.
KobolD вне форума Ответить с цитированием
Старый 30.03.2011, 15:57   #9
Yulian@
Новичок
Джуниор
 
Аватар для Yulian@
 
Регистрация: 30.03.2011
Сообщений: 6
По умолчанию

1. Вводим размер матрицы n
2. Вводим матрицу A, Вводим столбец свободных элементов b
3. Вводим начальное приближение вектора x[0] и число итераций.
4. по формуле находим невязку r[i]=A*x[i]-b
5. находим мю[i]=(r[i], AAr[i])/(AAr[i], AAr[i]) где Ar[i]=A*r[i] отсюда AAr[i]=A*Ar[i]
6. и затем находим корни уравнения x[i+1]=x[i]-мю[i]*A*r[i]

ну что то вроде этого, но я могу сбросить лучше в электронке, там более понятно написано, да и пример есть!!!
Yulian@ вне форума Ответить с цитированием
Старый 30.03.2011, 20:37   #10
Yulian@
Новичок
Джуниор
 
Аватар для Yulian@
 
Регистрация: 30.03.2011
Сообщений: 6
По умолчанию

мне поможет кто то, плиззз!!!
Yulian@ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Конкурс для программистов - Решение целочисленной СЛУ Zealint Свободное общение 1 11.02.2011 17:17
Решение СЛАУ. Метод простой итерации Alexander886 Помощь студентам 5 24.03.2010 18:43
Решение СЛАУ (метод простых итераций) XeN0N Помощь студентам 2 15.02.2009 21:33
Метод градиентного спуска varvara16 Мультимедиа в Delphi 0 25.10.2008 19:38
Решение СЛУ методом Гаусса-Джордана Жизнь Помощь студентам 2 05.10.2008 16:23