2014 dxdy logo

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

Математика, Физика, Computer Science, 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 сообщение ] 

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



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

Сейчас этот форум просматривают: Romashka97


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

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