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

Метод сопряженных градиентов Флетчера-Ривса - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.76
Anastaci9l
0 / 0 / 0
Регистрация: 11.10.2013
Сообщений: 5
02.12.2013, 23:23     Метод сопряженных градиентов Флетчера-Ривса #1
Есть наработки кода по одной книжке и он должен был быть правильным, но это не так. Есть вариант написать пару формул, но все не разберусь как. Код и фото страницы книги прилагаются. Помогите если сможете, я к сожалению не смогла решить данную проблему
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <iostream>
#include <conio.h>
#include <fstream>
#include <iomanip>
#include <math.h>
 
using namespace std;
 
double Right (double*.int);
 
double ta[11];
double z[11];
 
int Global = 0;
 
void main(void)
{
    int i.m = 4.Max = 100;
    double y[] = {2.3,2.5,0.9,3.5};
    double k[] = {2.0,3.0,0.7,3.0};
 
    for (int i=0; i<11; i++)
    {
        ta[i]=0.5*i;
        z[i]=k[0]/(1.0+k[1]*ta[i])+exp(-k[2]*ta[i]*cos(k[3]*ta[i]);
    }
    cout << "\nRETURN CODE: " << ConjugateGradient(y.m.0.00001.&Max.0.00001.GradC.Right) << endl;
    cout << "ITERATION: " << Max << endl << "Coefficients\n";
 
    for(int i=0; i<m; i++)
        cout << setw(10) << y[i] << setw(5) << k[i] << endl;
 
    cout << "Calls = " << Global << endl;
 
    cout << "Checking\n";
    for (int i=0; i<11; i++)
        cout << setw(4) << ta[i] << setw(12) << z[i] << setw(12) << (y[0]/(1.0+y[1]*ta[i])+cos(y[3]*ta[i])/exp(y[2]*ta[i])) << endl;
}
 
int ConjurateGradient(double* y.int m.double Eps.int*Max.double Step.userFuncGrad Grad.userFuncRight)
{
    register int i;
 
    int Ret = -2, Iter = 0;
 
    double *h, *g, a.b, r;
    
    if ((g = new double[m]) == 0)
        return -1;
    if ((h = new double[m]) == 0)
    {
        delete [] g;
        return -1;
    }
 
    Grad(y.g.m.Step.Right);
 
    while(Iter++ < *Max)
    {
        r = Right(y.m);
        for (i=0; i<m; i++)
            h[i]=y[i]-0.5*g[i];
        a=Right(h.m);
        for(i=0; i<m; i++)
            h[i]=y[i]-g[i];
        b=Right(h.m);
        a=0.5+0.25*(r-b)/(r-2*a+b);
 
        for(i=0; i<m; i++)
            y[i]-=a*g[i];
 
        Grad(y.h.m.Step.Right);
 
        for(i=0.b=0.r=0;i<m;i++)
        {
            b+=h[i]*(g[i]-h[i]);
            r+=g[i]*g[i];
        }
        b/=r;
 
        for(i=0.r=0;i<m;i++)
        {
            g[i]=h[i]-b*g[i];
            r+=g[i]*g[i];
        }
 
        if(r<=Eps)
        {
            Ret=0;
            break;
        }
    }
 
    *Max=Iter;
 
    delete [] g;
    delete [] h;
 
    return Ret;
}
Миниатюры
Метод сопряженных градиентов Флетчера-Ривса  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.12.2013, 23:23     Метод сопряженных градиентов Флетчера-Ривса
Посмотрите здесь:

C++ Метод итераций и метод Зейделя
Метод дихотомии (как метод оптимизации) C++
C++ Как описать метод класса? Как двумя способами описать инлайнируемый метод класса? Что такое this?
Метод Сопряжённых Градиентов C++
Есть метод класса внутри , есть проверка. Если условие сходится то метод должен выдать указатель, иначе булевую переменную C++
C++ Решение СЛАУ большой размерности методом сопряженных градиентов
C++ Метод оптимизации. Метод Фибоначчи
Метод Бройдена-Флетчера-Шенно C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 12:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru