![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Solut |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 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; } |
|||
|
||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Solut
отредактируйте пожалуйста приведенный пост(используйте тэги), а то очень нечитабельно |
|||
|
||||
| Solut |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 29.4.2005 Репутация: нет Всего: нет |
|
|||
|
||||
| AISIN |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 27.1.2005 Где: Пушкино Репутация: нет Всего: 1 |
что то тут не совсем ясно
И еще у тебя там n вызывается в каждой функции сделой ее const. --------------------
Внимание!!! Внимание!!!Запущена программа по завоеванию мира!!!Выполненно 0,000000000000000000000000000000000000000000000000000002% |
|||
|
||||
| Solut |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 29.4.2005 Репутация: нет Всего: нет |
"И еще у тебя там n вызывается в каждой функции сделой ее const"
А поподробнее можно? Чтобы обратиться из любой функции к n, насколько я знаю, нужно её иницилизировать как глобальную. А что насчёт const? |
|||
|
||||
| AISIN |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 27.1.2005 Где: Пушкино Репутация: нет Всего: 1 |
Solut n у тебя вроде не меняется значит нужно делать ее константой если какаянибудь функция её случайно изменит то компилятор тебе скажет в какой строке. Честно говоря я
не люблю разбираться в чужих указателях. Лючше бы ты подготовил еще и тестовую функцию. которая вызывает все эти функции. Если начать читать с этой функции
то при вызове
a[i][j] размерность должна быть n*n b[i] размерность n x[i] размерность n а вот из этого кода
ogr_a[i],ogr_b[i],ogr_c[i] имеют размерность m Из твоего кода нельзя определить какая реальная размерность a[i][j]. Проверь! А еще запусти лучше отладку и посмотри из какой строки вылетает программа.(Start Debug) --------------------
Внимание!!! Внимание!!!Запущена программа по завоеванию мира!!!Выполненно 0,000000000000000000000000000000000000000000000000000002% |
||||||
|
|||||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |