Форум программистов, компьютерный форум CyberForum.ru

Метод Сопряжённых Градиентов - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Сортировка двух массивов http://www.cyberforum.ru/cpp-beginners/thread567211.html
В точности задание звучит следующим образом: Для двух одинаковых по размеру одномерных массивов определить какой из них требует больше действий для сортировки по уменьшению. Вывести название метода сортировки и критерий его оценки. Если я правильно понял, то мне необходимо сначала отсортировать два массива любым способом, узнать сколько действий необходимо было для сортировки одного и...
C++ Статические методы (сложение полиномов) Всем доброго дня! Собственно, хочу попросить помощи.. написал код, статический метод для сложения 2х полиномов. Полиномы представляются как массив, в котором хранятся коэфициенты. Т.е. у меня массив: 1,2,3,4 , и это = 1*x^0 + 2*x^1 + 3* x^2 + 4*x^3 , вот как-то так) Ну и метод должен складывать 2 полинома... static polinom summ(polinom obj1,polinom obj2) { http://www.cyberforum.ru/cpp-beginners/thread567205.html
C++ не могу разобраться з задачкой
ребята помогите с програмкой .дан определитель a,b,c . Опеределить www.cyberforum.ru/attachment.php?attachmentid=147923&stc=1&thumb=1&d=1335969258
C++ Кириллица в консоли
Здравствуйте. Произошла вот такая проблема. Надеюсь, поможете. Написал легкую программу на C++, написал редактором Dev-C++ и скомпилировал тоже им, а когда открываю программу, в командной строке вместо русских букв какие-то иероглифы. Если открыть просто командную строку, то всё пишет нормально. Пересмотрел, уже все темы ничего не помогает. Скрины могу предоставить только в очень плохом...
C++ Создать программу, которая находит минимум функции у=х*х+3*х-2 на отрезке [а,b]. http://www.cyberforum.ru/cpp-beginners/thread567147.html
Создать программу, которая находит минимум функции у=х*х+3*х-2 на отрезке . Расчет виражения у сделать с помощью следующей функции - double y(double x).
C++ Видео поток в форме. Нужно сделать программку на C# которая открывает форму, а в ней видео с моей WEB-камеры. подскажите как мне это сделать? подробнее

Показать сообщение отдельно
LEQADA
Мастер кустарных методов
 Аватар для LEQADA
227 / 222 / 9
Регистрация: 09.11.2010
Сообщений: 680
06.05.2012, 18:04     Метод Сопряжённых Градиентов
main.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <cstdlib>  
#include <cmath>
#include "sol.h"
using namespace std;
 
// Вывод результата на экран
void PrintSolution(double *x, double val, int numIter) 
{
    cout << "-----------------------" << endl;
    cout << "Number of iterations: " << numIter << endl;
    cout<<"Computed solution: "<<endl<<"["<<x[0]<<","<<x[1]<<"]"<<endl;
    cout<<"Function value: "<<val<<endl<<endl;
}
 
// Вычисление скалярного произведения
double inner_prod(double *x, double *y) {return x[1]*y[1] + x[0]*y[0];}
 
int main()
{
    cout.precision(9);
    FletcherRievesMethod();
    return 0;
}


frm.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <cstdlib>  
#include <cmath>
#include "sol.h"
using namespace std;
 
double FletcherRievesMethod()
{
    double eps = 1e-3;
    const double EPS = 1e-5;
    //Начальное приближение
    double x[2]={0,0};
    double curVal = F1(x);
    double prevVal = curVal;
    double p[2] ;
    p[0]= - GradF1(x);
    p[1]= - GradF2(x);
    
    double gradSquare = inner_prod(p, p);
 
    int numIter = 0;
    do
    {
        numIter++;
        double alpha, beta, newGradSquare;
        double newGrad[2];
 
 
        //Ищем минимум F1(x + alpha * p) с помощью метода одномерной оптимизации
        alpha = FindMin(x, p);
        x[0] = x[0] + alpha * p[0];
        x[1] = x[1] + alpha * p[1];
        newGrad [0] = - GradF1(x);
        newGrad [1] = - GradF2(x);
        
        newGradSquare = inner_prod(newGrad, newGrad);
        
        if (numIter % (10) == 0) beta = 0; //Обновление
        else 
        beta = newGradSquare / gradSquare; //Используем метод Флетчера - Ривса
        p[0] = newGrad[0] + beta * p[0];
        p[1] = newGrad[1] + beta * p[1];
 
        prevVal = curVal;
        curVal = F1(x);
 
        gradSquare = newGradSquare;
    }
    while (gradSquare > eps);
 
    cout << "Fletcher-Rieves Method: " << endl; 
    PrintSolution(x, F1(x), numIter);
    return 0;
 
}


func.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <cmath>
// Сама функция
double F1(double *x)
{
    double a=0.1, eps=0.00001,res=0;
    while (fabs(a-1)>eps) {res = res + ((exp(-a*x[0]) - exp(-a*x[1])) - (exp(-a) - exp(-10*a)))*((exp(-a*x[0]) - exp(-a*x[1])) - (exp(-a) - exp(-10*a))); a=a+0.1;}
    return res;
}
// Производная по первой переменной
double GradF1(double *x)
{
    double a=0.1, eps=0.00001,res=0;
    while (fabs(a-1)>eps) {res = res - 2*a*exp(-a*x[0]) * ((exp(-a*x[0]) - exp(-a*x[1])) - (exp(-a) - exp(-10*a)))*((exp(-a*x[0]) - exp(-a*x[1])) - (exp(-a) - exp(-10*a))); a=a+0.1;}
    return res;
}
// Производная по второй переменной
double GradF2(double *x)
{
    double a=0.1, eps=0.00001,res=0;
    while (fabs(a-1)>eps) {res = res + 2*a*exp(-a*x[0]) * ((exp(-a*x[0]) - exp(-a*x[1])) - (exp(-a) - exp(-10*a)))*((exp(-a*x[0]) - exp(-a*x[1])) - (exp(-a) - exp(-10*a))); a=a+0.1;}
    return res;
}


golden.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <cstdlib>  
#include <cmath>
#include "sol.h"
 
//Одномерная оптимизация - применим метод золотого сечения
double FindMin(double *s, double *p)
{
    const double eps = 1e-8;
    const double tay = 1.618;
    double a = 0;
    double b = 1e5;
    double x0, x1, xf1, xf2;
    x0 = b - (b - a) / tay; // Расчитываем точки деления
    x1 = a + (b - a) / tay;         //
P:
    double t1[2],t2[2];
    t1[0] = s[0] + x0 * p[0];
    t1[1] = s[1] + x0 * p[1];
    t2[0] = s[0] + x1 * p[0];
    t2[1] = s[1] + x1 * p[1];
    xf1 = F1(t1); // Расчитываем в точках деления значение целевой функции
    xf2 = F1(t2); //
    if(xf1 >= xf2) 
    {
        a = x0;
        x0 = x1;
        t2[0] = s[0] + x1 * p[0];
        t2[1] = s[1] + x1 * p[1];
        xf1 = F1(t2);
        t2[0] = s[0] + x1 * p[0];
        t2[1] = s[1] + x1 * p[1];
        x1 = a + (b - a) / tay;
        xf2 = F1(t2);
    }
    else
    {
        b = x1;
        x1 = x0;
        xf2 = xf1;
        x0 = b - (b - a) / tay;
        t1[0] = s[0] + x0 * p[0];
        t1[1] = s[1] + x0 * p[1];
        xf1 = F1(t1);
    }
    if(fabs(b - a) < eps) 
    {
        return (a + b) / 2;
    }
    else
    goto P;
}


sol.h
C++
1
2
3
4
5
6
7
8
double F1(double *x);
double GradF1(double *x);
double GradF2(double *x);
double GradFQuad(double *x);
double FindMin(double *s, double *p);
void PrintSolution(double *x, double val, int numIter);
double FletcherRievesMethod();
double inner_prod(double *x, double *y);


Код метода золотого сечения стырил отсюда Решение по вычислительной математике
Для обычных функций всё работает. Обычная функция - это http://www.cyberforum.ru/cgi-bin/latex.cgi?{x^2} + {y^2}. А вот приведённая в func.cpp (Она взята из Б.Банди "Методы оптимизации. Вводный курс" страница 36)
http://www.cyberforum.ru/cgi-bin/latex.cgi?f(x,y) = \sum\limits_a {{{\left( {\left( {{e^{ - ax}} - {e^{ - ay}}} \right) - \left( {{e^{ - a}} - {e^{ - 10a}}} \right)} \right)}^2}}
сумма по всем а от 0.1 до 1 с шагом 0.1.
выдаёт:
Код
Fletcher-Rieves Method:
-----------------------
Number of iterations: 1
Computed solution:
[255288.425,-255288.425]
Function value: inf
У Банди написано :
Любая серьёзная оптимизационная процедура должна эффективно решать эту и другие тестовые задачи
Компилятор GCC. Если есть вопросы по коду, задавайте, я отвечу.

Помогите пожалуйста исправить ошибку или хотя бы как-то объяснить происходящее.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 11:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru