Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> почему зависает программа? 
:(
    Опции темы
Solut
Дата 29.4.2005, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 29.4.2005

Репутация: нет
Всего: нет



Подскажите, что неправильно сделала я в функции MinF, что после её вызова Dos-овское окошко становится мёртвым

double h=0.000001;

//Присваивание одному вектору значений другогo
void ravno (double* p1, double* p2, int n)
{
for (int i=0;i<n;i++)
p1[i]=p2[i];
}

//Вычисление значения целевой функции
double f_cel (double** a, double* b, double c, int n, double* x)
{
double s=0;
double* t=new double[n];
for (int i=0; i<n; i++){
s=0;
for (int j=0; j<n; j++)
s+=x[j]*a[i][j];
t[i]=s;
}
s=0;
for (i=0; i<n; i++)
s+=t[i]*x[i]+b[i]*x[i];
s+=c;
delete t;
return s;
}

//вычисление значения функции дельта (штрафа)
double* shtraf_f (double*** ogr_a, double** ogr_b, double* ogr_c, double* x, int m, int n)
{
double* mas=new double [m];
double* temp=new double [m];
for (int i=0;i<m;i++)
{
temp[i]=f_cel(ogr_a[i], ogr_b[i], ogr_c[i], n, x);
if (temp[i]>0)
mas[i]=1;
}
delete temp;
return mas;
}

//Вычисление градинта целевой функции
double* grad_cel (double**a, double* b, int n, double* x)
{
double* grad=new double [n];
double v=0;
double* temp=new double [n];
for (int i=0;i<n;i++)
{
v=0;
for (int j=0;j<n;j++)
v=v+x[j]*a[i][j];
temp[i]=2*v;
grad[i]=temp[i]+b[i];
}
delete temp;
return grad;
}

//Расстояние
double distance( double* x1, double* x2, int n)
{
double s=0;
for (int i=0; i<n; i++) s+=(x1[i]-x2[i])*(x1[i]-x2[i]);
return sqrt(s);
}

double skal (double* x1, double* x2, int n)
{
double s=0;
for (int i=0; i<n; i++) s+=x1[i]*x2[i];
return s;
}



double* MinF (double* p, double* x, double**a, double* b, double c, double*** ogr_a, double** ogr_b, double* ogr_c, int n, int m, double mu)
{
double* men=new double [n];
double* kon=new double [n];
double* be=new double [n];
double* y1=new double [n];
double* p0=new double [n];
double* p1=new double [n];
double* p2=new double [n];
double* p3=new double [n];
int flag=1;
int i,j;
ravno(men, x, n);
while (flag==1)
{
//переменные, отвечающие за проверку возрастания(убывания) функции
//0-положительный, 1-отрицательный
int k1=0;
int k2=0;
double zn=0;
double* metki=new double [m];
ravno (metki, shtraf_f(ogr_a, ogr_b, ogr_c, men, m, n), n);
//проверка - возрастает или убывает целевая функция в заданной точке
ravno(p1, grad_cel(a, b, n, men), n);
for (i=0;i<m;i++)
if (metki[i]!=0)
for (j=0;j<n;j++)
{
ravno(be, grad_cel(ogr_a[i], ogr_b[i], n, men), n);
zn=f_cel(ogr_a[i], ogr_b[i], ogr_c[i], n, men);
p2[j]+=2*mu*zn*be[j];
}
for (j=0;j<n;j++)
p0[j]=p1[j]+p2[j];
if(skal(p0, p, n)>0)
k1=0;
if (skal(p0, p, n)<0)
k1=1;
//новая точка
for (i=0;i<n;i++)
y1[i]=men[i]+h*p[i];
//подсчёт значения в новой точке
ravno (p1, grad_cel(a, b, n, y1), n);
for (i=0;i<m;i++)
if (metki[i]!=0)
for (j=0;j<n;j++)
{
ravno (be, grad_cel(ogr_a[i], ogr_b[i], n, y1), n);
zn=f_cel(ogr_a[i], ogr_b[i], ogr_c[i], n, y1);
p2[j]+=2*mu*zn*be[j];
}
for (j=0;j<n;j++)
p0[j]=p1[j]+p2[j];
if(skal(p0, p, n)>0)
k2=0;
else if (skal(p0, p, n)<0)
k2=1;
//не изменилось направление
if (k1==0&&k2==0||k1==1&&k2==1)
{
h+=2;
ravno(men, x, n);
//return MinF (p, x, a, b, c, ogr_a, ogr_b, ogr_c, n, m, mu);
continue;
}
//направление изменилось
else if (k1==1&&k2==0||k1==0&&k2==1)
if (distance(x, y1, n)<shag)
for (i=0;i<n;i++)
{
kon[i]=(x[i]+y1[i])/2;
flag=0;
continue;
//return kon;
}
else {

for (i=0;i<n;i++)
{
double u=(h-1);
double e=(h-4);
p3[i]=x[i]+u*e*p[i];
}
ravno(men, p3, n);
continue;
}
}//конец while
return kon;
delete kon;
delete be;
delete y1;
delete p0;
delete p1;
delete p2;
delete p3;

}

PM MAIL   Вверх
bel_nikita
Дата 30.4.2005, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Solut
отредактируйте пожалуйста приведенный пост(используйте тэги), а то очень нечитабельно



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Solut
  Дата 30.4.2005, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 29.4.2005

Репутация: нет
Всего: нет




Код


double h=0.000001;

//Присваивание одному вектору значений другогo
void ravno (double* p1, double* p2, int n)
{
    for (int i=0;i<n;i++)
           p1[i]=p2[i];
}

//Вычисление значения целевой функции
double f_cel (double** a, double* b, double c, int n, double* x)
{
    double s=0;
    double* t=new double[n];
    for (int i=0; i<n; i++){
           s=0;
           for (int j=0; j<n; j++)
                  s+=x[j]*a[i][j];
           t[i]=s;
     }
    s=0;
    for (i=0; i<n; i++)
             s+=t[i]*x[i]+b[i]*x[i];
     s+=c;
    delete t;
    return s;
}

//вычисление значения функции дельта (штрафа)
double* shtraf_f (double*** ogr_a, double** ogr_b, double* ogr_c, double* x, int m, int n)
{
    double* mas=new double [m]; 
    double* temp=new double [m]; 
    for (int i=0;i<m;i++)
   {
        temp[i]=f_cel(ogr_a[i], ogr_b[i], ogr_c[i], n, x);
        if (temp[i]>0)
             mas[i]=1;
  }
  delete temp;
  return mas;
}

//Вычисление градинта целевой функции
double* grad_cel (double**a, double* b, int n, double* x)
{
    double* grad=new double [n];
    double v=0;
    double* temp=new double [n];
    for (int i=0;i<n;i++)
   {
        v=0;
        for (int j=0;j<n;j++)
              v=v+x[j]*a[i][j];
        temp[i]=2*v;
        grad[i]=temp[i]+b[i];
  }
delete temp;
return grad;
}

//Расстояние
double distance( double* x1, double* x2, int n)
{
       double s=0;
        for (int i=0; i<n; i++) s+=(x1[i]-x2[i])*(x1[i]-x2[i]);
       return sqrt(s);
}

double skal (double* x1, double* x2, int n)
{
    double s=0;
    for (int i=0; i<n; i++) s+=x1[i]*x2[i];
    return s;
}



double* MinF (double* p, double* x, double**a, double* b, double c, double*** ogr_a, double** ogr_b, double* ogr_c, int n, int m, double mu)
{
double* men=new double [n];
double* kon=new double [n];
double* be=new double [n];
double* y1=new double [n];
double* p0=new double [n];
double* p1=new double [n];
double* p2=new double [n];
double* p3=new double [n];
int flag=1;
int i,j;
ravno(men, x, n);
while (flag==1)
{
        //переменные, отвечающие за проверку возрастания(убывания) функции
       //0-положительный, 1-отрицательный
       int k1=0;
       int k2=0;
       double zn=0; 
       double* metki=new double [m];
        ravno (metki, shtraf_f(ogr_a, ogr_b, ogr_c, men, m, n), n);
      //проверка - возрастает или убывает целевая функция в заданной точке
       ravno(p1, grad_cel(a, b, n, men), n);
       for (i=0;i<m;i++)
              if (metki[i]!=0)
                   for (j=0;j<n;j++)
                   {
                         ravno(be, grad_cel(ogr_a[i], ogr_b[i], n, men), n);
                         zn=f_cel(ogr_a[i], ogr_b[i], ogr_c[i], n, men);
                         p2[j]+=2*mu*zn*be[j];
                   }
       for (j=0;j<n;j++)
            p0[j]=p1[j]+p2[j];
       if(skal(p0, p, n)>0)
                 k1=0;
       if (skal(p0, p, n)<0)
                 k1=1;
//новая точка
      for (i=0;i<n;i++)
            y1[i]=men[i]+h*p[i];
//подсчёт значения в новой точке
      ravno (p1, grad_cel(a, b, n, y1), n);
       for (i=0;i<m;i++)
            if (metki[i]!=0)
                 for (j=0;j<n;j++)
                    {
                        ravno (be, grad_cel(ogr_a[i], ogr_b[i], n, y1), n);
                        zn=f_cel(ogr_a[i], ogr_b[i], ogr_c[i], n, y1);
                        p2[j]+=2*mu*zn*be[j];
                    }
     for (j=0;j<n;j++)
          p0[j]=p1[j]+p2[j];
     if(skal(p0, p, n)>0)
             k2=0;
     else if (skal(p0, p, n)<0)
              k2=1;
//не изменилось направление
     if (k1==0&&k2==0||k1==1&&k2==1)
   {
           h+=2;
           ravno(men, x, n);
//return MinF (p, x, a, b, c, ogr_a, ogr_b, ogr_c, n, m, mu);
          continue;
}
//направление изменилось
     else if (k1==1&&k2==0||k1==0&&k2==1)
               if (distance(x, y1, n)<shag)
                         for (i=0;i<n;i++)
                            {
                               kon[i]=(x[i]+y1[i])/2;
                                flag=0;
                                continue;
//return kon;
                             }
     else {

               for (i=0;i<n;i++)
               {
                    double u=(h-1); 
                    p3[i]=x[i]+u*p[i];
                }
               ravno(men, p3, n);
               continue;
             }
}//конец while
return kon;
delete kon;
delete be;
delete y1;
delete p0;
delete p1;
delete p2;
delete p3;

}




PM MAIL   Вверх
AISIN
Дата 30.4.2005, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 27.1.2005
Где: Пушкино

Репутация: нет
Всего: 1



что то тут не совсем ясно
Код

if(k1==0&&k2==0||k1==1&&k2==1)
получается так если (k1=0 и k2=0) или k1=1и обязательно k2=1  
не зависимо от или (кажется)
может ты что то другое имел в виду например
if((k1==0&&k2==0)||(k1==1&&k2==1))
 или
if(k1==0&&(k2==0 || k1==1)&&k2==1)

И еще у тебя там n вызывается в каждой функции сделой ее const.
--------------------
Внимание!!! Внимание!!!Запущена программа по завоеванию мира!!!Выполненно 0,000000000000000000000000000000000000000000000000000002%
PM MAIL   Вверх
Solut
Дата 30.4.2005, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 29.4.2005

Репутация: нет
Всего: нет



"И еще у тебя там n вызывается в каждой функции сделой ее const"

А поподробнее можно?
Чтобы обратиться из любой функции к n, насколько я знаю, нужно её иницилизировать как глобальную.
А что насчёт const?

PM MAIL   Вверх
AISIN
Дата 30.4.2005, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 27.1.2005
Где: Пушкино

Репутация: нет
Всего: 1



Solut n у тебя вроде не меняется значит нужно делать ее константой если какаянибудь функция её случайно изменит то компилятор тебе скажет в какой строке. Честно говоря я
не люблю разбираться в чужих указателях.
Лючше бы ты подготовил еще и тестовую функцию.
которая вызывает все эти функции.
Если начать читать с этой функции
Код

double* MinF (double* p, double* x, double**a, double* b, 
double c, double*** ogr_a, double** ogr_b, double* ogr_c,
 int n, int m, double mu)

то при вызове
Код

double* grad_cel (double**a, double* b, int n, double* x)
{
    double* grad=new double [n];
    double v=0;
    double* temp=new double [n];
    for (int i=0;i<n;i++)
   {
        v=0;
        for (int j=0;j<n;j++)
              v=v+x[j]*a[i][j];
        temp[i]=2*v;
        grad[i]=temp[i]+b[i];
  }

a[i][j] размерность должна быть n*n
b[i] размерность n
x[i] размерность n
а вот из этого кода
Код

double* shtraf_f (double*** ogr_a, double** ogr_b, double* ogr_c, double* x, int m, int n)
{
    double* mas=new double [m]; 
    double* temp=new double [m]; 
    for (int i=0;i<m;i++)
   {
        temp[i]=f_cel(ogr_a[i], ogr_b[i], ogr_c[i], n, x);
        if (temp[i]>0)
             mas[i]=1;
  }
  delete temp;
  return mas;
}

ogr_a[i],ogr_b[i],ogr_c[i] имеют размерность m
Из твоего кода нельзя определить какая реальная
размерность a[i][j]. Проверь!
А еще запусти лучше отладку и посмотри из какой
строки вылетает программа.(Start Debug)
--------------------
Внимание!!! Внимание!!!Запущена программа по завоеванию мира!!!Выполненно 0,000000000000000000000000000000000000000000000000000002%
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0499 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.