Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Численный метод поиска extr целевой функции на Builder С++ 6.0

23K
18 декабря 2006 года
KLINED
1 / / 18.12.2006
Есть целевая функция F(x1, x2)=2*(x1-4)^2+(x2-7)^2, необходимо найти минимум используя «Метод простой случайной оптимизации». Используя при этом С++.
Суть метода: см. pic. Сам метод осуществляется в двумерном пространстве x1, x2. Сама функция в этом пространстве представлена линиями уровня. Что важно, условием достижения минимума(остановка метода), является выражение |(F(xk)-F(x(k+1)|<e, где "e" число стремящееся к 0. Я выбрал 0.0001.

Мною уже был реализован данный метод в среде Builder C++ 6.0, Вот код.
Код:
#include <vcl.h>
#include <math.h>
#include <conio.h>
#include <iostream.h>
#include <stdlib.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
        return 0;
}
//---------------------------------------------------------------------------
double func(double x1, double x2){    
 return 2.0*pow(x1-4.0,2.0)+pow(x2-7.0,2.0);
 }
double func_k(double xk1, double xk2){  
 return 2.0*pow(xk1-4.0,2.0)+pow(xk2-7.0,2.0);
 }
double XX1(double xk1, double FI_rad, double H){
 return xk1+H*cos(FI_rad);
}
double XX2(double xk2, double FI_rad, double H){
 return xk2+H*sin(FI_rad);
 }
//---------------------------------------------------------------------------
double gen(){                          
 double FI_grad;
 double FI_rad;
 randomize();
 FI_grad=random(361);
 FI_rad=FI_grad*0.0174;
 return FI_rad;
 }
//---------------------------------------------------------------------------
void method(){                      
double H=1.2;
double FI_rad;
double xk1=-2.0;
double xk2=6.0;

for ( ;; ){

while (fk>=f) gen();


double x1 = XX1(xk1, gen(), H);
xk1=x1;

double x2 = XX2(xk2, gen(), H);
xk2=x2;

double f = func(x1, x2);
double fk = func_k(xk1, xk2);

cout<<x1;
cout<<x2;

if(sqrt(pow(fk-f,2.0)<0.0001)) break;  

 }
}
//---------------------------------------------------------------------------

Увы, программа не работает. (При этом выдаться ещё две ошибки компилятором. Он не распознает в инструкции while переменные fk и f).
Помогите, отладить программу и устранить ошибки. Если есть возможность, подскажите, как лучше реализовать метод. Возможно использую неверный подход.:confused:

Заранее благодарю, за любую помощь.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог