2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки





Начать новую тему Ответить на тему
 
 Реализация метода наискорейшего спуска
Сообщение15.03.2017, 17:12 


15/03/17
1
Добрый день. Передо мной встала задача: реализовать поиск минимума функции градиентным методом наискорейшего спуска. Проблема вот в чем: если я беру функцию f(x)=20+pow(k0*k1-60, 2)+ pow(k0-3, 2)+pow(k1-20, 2)+k2*k2, то программа всё нормально считает, когда я добавляю еще слагаемое pow(k1*k2*k3, 2), то значения уже ненормальные получаются. Подскажите, в чем может быть проблема. Вот сам код и структурная схема для него:
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
<div class="codetitle"><b>Код:</b></div><div class="codecontent">#include <iostream>
#include <math.h>
#include <stdlib.h>

using namespace std;


long double calc_Q(long double k0, long double k1, long double k2)
{
long double result=20+pow(k1*k2,2)+pow(k0*k1-60, 2)+ pow(k0-3, 2)+pow(k1-20, 2)+k2*k2;
return result;
}


int main()
{
int L;
long double k0, k1, k2, epsilon, H, u1[3], u0[3];
long double Q0, Q1, dQ[3], delta_x=pow(10, -5);
cout<<"Start"<<endl;

epsilon=pow(10, -3);
u0[0]=150;
u0[1]=110;
u0[2]=100;

H=20;
k0=u0[0];
k1=u0[1];
k2=u0[2];
Q0=calc_Q(k0, k1, k2);
cout<<"Q0="<<Q0<<endl;

flag_1:
k0=u0[0];
k1=u0[1];
k2=u0[2];

dQ[0]=calc_Q (k0+delta_x, k1, k2) - Q0;
dQ[1]=calc_Q (k0, k1+delta_x, k2) - Q0;
dQ[2]=calc_Q (k0, k1, k2+delta_x) - Q0;

L=0;
flag_2:


for (int i=0; i<3; i++)
{
u1[i]=u0[i]-H*dQ[i];
}


k0=u1[0];
k1=u1[1];
k2=u1[2];

Q1=calc_Q(k0, k1, k2);


if (Q0>Q1)
{

L=L+1;
if (L>3)
H*=2;
Q0=Q1;
for (int ii=0; ii<3; ii++)
u0[ii]=u1[ii];
k0=u0[0];
k1=u0[1];
k2=u0[2];
goto flag_2;
}

else
{
for (int ii=0; ii<3; ii++)
u1[ii]=u0[ii];
k0=u1[0];
k1=u1[1];
k2=u1[2];
Q1=Q0;

if (L!=0) goto flag_1;
else H=H/3;
}
if(H>epsilon) goto flag_2;

cout<<endl<<"Q1="<<Q1<<endl;
cout<<"Koef k0="<<k0<<" "<<endl;
cout<<"Koef k1="<<k1<<" "<<endl;
cout<<"Koef k2="<<k2<<" "<<endl;


system ("pause");
return 0;
}</div>
 


Изображение

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Модераторы: maxal, Karan, Toucan, PAV, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group