5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583

Как соединить оба метода?

11.02.2019, 23:51. Показов 2755. Ответов 64
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
помогите пожалуйста под мой метод Gold и функцию function_optimiz написать метод descent_method ?

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
double function_optimiz(double alpha) {
    double y[N];
    y[0] = 10e-10, y[1] = 0.0, y[2] = 0.0, y[3] = 0.0;
    double t0 = 0.0, max_t = 5.73e-08, h = 1e-10;
    double t = t0;
    double sum = 0;
 
    for(t = t0; t <= max_t; t += h) {
 
        rosenbrock(y, t0, max_t, h, alpha);
        std::cout << t << "\t" << std::setprecision(5) << y[0] << "\t" << y[1] << "\t" << y[2] << "\t" << y[3] << std::endl;
 
        sum += (j_0(y) - j_1(y))*(j_0(y) - j_1(y));
        cout << "sum: " << sum << "\n";
 
    }
    return sum;
}
void Gold(double a, double b, double e, double alpha) {
    long nIter = 1;
 
    double t = (std::sqrt(5) - 1)*0.5;
    double x1 = b - t * (b - a);
    double x2 = a + t * (b - a);
 
    double h1, h2;
 
    while (e <= fabs(b - a)) {
        std::cout << "\t**\t Iteration: " << (nIter++) << " \t **" << std::endl;
        std::cout << std::setprecision(4) << "[ a ; b ]: [ " << a << " ; " << b << " ]\t" << " ALPHA_1: " << x1 << "\tALPHA_2: " << x2 << std::endl;
        h2 = function_optimiz(x2);
        h1 = function_optimiz(x1);
        if (h2 < h1) a = x1;
        else b = x2;
 
        x1 = b - t * (b - a);
        x2 = a + t * (b - a);
 
    }
 
    std::cout << "\t**\t Iteration: " << (nIter++) << " \t **" << std::endl;
    std::cout << std::setprecision(4) << "[ a ; b ]: [ " << a << " ; " << b << " ]\t" << " ALPHA_1: " << x1 << "\tALPHA_2: " << x2 << std::endl;
 
    std::cout << "\n\t**\t Result \t **";
    std::cout << "\nALPHA_min =  " << (alpha = (a + b) / 2);
 
}
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
void descent_method(func_ptr f, double* vars, double eps, int max_steps_count)
{
double B = f(vars), A = 0; // значение целевой функции на текущей и пердидущей итерациях
bool was_counted = false; // был ли определен минимум за максимально допустимое количество итераций
int stpes_ellapsed = 0; // количество итераций, затраченных на поиск минимума (статистическая информация)
double delta = 0.0; // полученная погрешность (статистическая информация)
for(int i = 0; i < max_steps_count; i++){
A = B; // предыдущее значение целевой функции
 
for(int var_index = 0; var_index < var_count; var_index++) // проходим по каждому аргументу целевой функции
vars[var_index] = golden_section(f, vars, var_index, eps, -5000, 5000, max_steps_count); // и находим минимум одномерной функции по этой пе
 
B = f(vars); // текущее значение целевой функции
 
delta = fabs(A - B);
 
if(delta <= eps)
{
stpes_ellapsed = i + 1;
was_counted = true;
break;
}
}
 
std::cout << "Результат поиска минимума функции " << "<тут пишем функцию>" << std::endl;
 
if(!was_counted)
std::cout << "За максимально указанное количество шагов ( " << max_steps_count << " ) минимум не был посчитан." << std::endl;
else {
std::cout << "Количество итераций: " << stpes_ellapsed << std::endl;
std::cout << "Погрешность: " << delta << std::endl;
}
 
std::cout << "Точка: X(";
for(int i = 0; i < var_count; i++){
std::cout << vars[i] << ", ";
 
}
 
std::cout << "\b\b" << ")" << std::endl;
std::cout << "Значение функции f(X): " << std::setprecision(10) << f(vars) << std::endl;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.02.2019, 23:51
Ответы с готовыми решениями:

Как соединить диски,чтобы система видела оба диска
У соседа такая ситуация:750 гб САТА диск стал невидимым для системы и он открутил и положил в полку.Потом покупал другой диск,туда...

Если оба числа четные, то оба возвестив квадрат
Даны 2 вещественных числа, если они оба четные то оба возвестив квадрат, если нет то к каждому из них прибавить 3. uses crt; var...

Как сделать чтоб аргументы метода пользователь вводил с консоли а не в скобках метода во внешнем коде?
доброго времени суток!!! Помогите плиз!!! как сделать чтоб аргументы метода пользователь вводил с консоли а не в скобках метода во...

64
 Аватар для Михаиллллллл
66 / 57 / 13
Регистрация: 16.03.2017
Сообщений: 426
13.02.2019, 19:24
Студворк — интернет-сервис помощи студентам
что вы имеете ввиду под "сравнить значение функции предыдущее и текущее."?
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
13.02.2019, 19:25  [ТС]
Михаиллллллл, значение функции при текущем альфа и предыдущем
0
 Аватар для Михаиллллллл
66 / 57 / 13
Регистрация: 16.03.2017
Сообщений: 426
13.02.2019, 19:53
этот кусок кода заполняет vars.
вы можете вызвать эту функцию в любом месте, где у вас определенны все переменные func_ptr f, double* vars, double eps, int max_steps_count
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
13.02.2019, 20:00  [ТС]
Михаиллллллл, да, он заполняет vars, а в моем варианте пока только одно значение альфа.
у меня вместо vars идут у[N], eps задается тоже, отдельно я еще задам max_steps_count, но вот как я передам в функцию переменную func_ptr f, если она является функцией
C++
1
2
typedef double (*func_ptr)(double*);
double function(double* variables);
а у меня идет обычная функция. и в примере функция зависит от vars, а у меня от альфа
0
 Аватар для Михаиллллллл
66 / 57 / 13
Регистрация: 16.03.2017
Сообщений: 426
13.02.2019, 20:07
просто запишите название функции, так же, как и с другими переменными. но совсем не обязательно func_ptr f вносить в функцию , приведенную вами для сравнения, если func_ptr f есть в том же файле. ее можно просто вызывать внутри метода
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
13.02.2019, 20:19  [ТС]
Михаиллллллл, у меня такой функции нет

Добавлено через 2 минуты
Михаиллллллл, хорошо, я запишу со своими переменными, но что делать, если в примере заполняется в цикле vars, а мне нужно значение альфа ?
0
 Аватар для Михаиллллллл
66 / 57 / 13
Регистрация: 16.03.2017
Сообщений: 426
13.02.2019, 20:32
во можете таким образом заполнять любой вектор, и назвать можете как хотите
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
13.02.2019, 21:01  [ТС]
Михаиллллллл, а вариант только вектором делать ?
0
 Аватар для Михаиллллллл
66 / 57 / 13
Регистрация: 16.03.2017
Сообщений: 426
13.02.2019, 21:14
если брать ту функцию, то да
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
14.02.2019, 02:09  [ТС]
Михаиллллллл, так, я же не буду знать размер этого вектора

Добавлено через 1 час 43 минуты
Михаиллллллл, это получается, что и в методе голд нужно будет задавать вектор для альфа?

Добавлено через 3 часа 9 минут
Михаиллллллл, и еще такой вопрос. В методе спуска у меня вызывается функция, зависящая от альфа, но я же не могу передать в сам метод это значение, оно у меня неизвестно. Как тогда вызывать B=function(??alpha??) ?
0
261 / 111 / 53
Регистрация: 22.01.2017
Сообщений: 448
14.02.2019, 08:46
Цитата Сообщение от ElKros Посмотреть сообщение
у меня работает, если я задаю промежуток и ищу на нем альфа методом Gold
Вот откуда такие утверждения?
C++
1
2
3
4
double function_optimiz(double alpha) {
    double y[N];
    // Что за N? Где инициализация
}
У вас функция Gold в теле вызывает функцию function_optimiz. Раз есть проблема в функции function_optimiz значит функция Gold не рабочая.
Скажу так - выложите весь код, который при запуске что-то выводит на экран.
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
14.02.2019, 09:51  [ТС]
n1b1ru, у меня N - это константы, заданная через define

Добавлено через 46 секунд
n1b1ru, N - количество переменных в функцит

Добавлено через 2 минуты
n1b1ru, вот весь код
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
#include <iostream>
#include <iomanip>
#include <fstream>
#include <functional>
#include <vector>
#include <boost/multiprecision/cpp_bin_float.hpp>
 
using namespace boost::multiprecision;
using namespace std;
 
typedef number<cpp_bin_float<200>> cpp_dec_float_unlim;
 
#define double cpp_dec_float_unlim
#define N 4
 
// система уравнений
void dydt(double y[N], double f[N], double t, double alpha) {
    f[0] = 8.85*10e6 - y[2] * y[0] * (0.2 - y[0]) / (1. - y[1]) + y[0] / 10e-8;
    f[1] = y[0] * y[2];
    f[2] = y[0] * y[3];
    f[3] = 10e30*(sqrt(y[0]))*exp((-alpha)/ y[0]);
}
 
// Функция для получания кофактора A[p][q] в temp[][]. n текущее 
// измерение A[][] 
void getCofactor(double A[N][N], double temp[N][N], int p, int q, int n)
{
    int i = 0, j = 0;
    // Циклы для каждого элемента матрицы
    for (int row = 0; row < n; row++)
    {
        for (int col = 0; col < n; col++)
        {
            //  Копирование во временную матрицу только тех элементов, 
            // которых нет в данной строке и столбце
            if (row != p && col != q)
            {
                temp[i][j++] = A[row][col];
                // Строка заполнена, поэтому увеличьте индекс строки и 
                // сбросьте индекс col
                if (j == n - 1)
                {
                    j = 0;
                    i++;
                }
            }
        }
    }
}
 
/* Рекурсивная функция для нахождения определителя матрицы.
   n текущее измерение A[][]. */
double determinant(double A[N][N], int n)
{
    double D = 0; // Initialize result 
    //  Base case : if matrix contains single element 
    if (n == 1)
        return A[0][0];
    double temp[N][N]; // To store cofactors 
    int sign = 1;  // To store sign multiplier 
     // Iterate for each element of first row 
    for (int f = 0; f < n; f++)
    {
        // Getting Cofactor of A[0][f] 
        getCofactor(A, temp, 0, f, n);
        D += sign * A[0][f] * determinant(temp, n - 1);
 
        // terms are to be added with alternate sign 
        sign = -sign;
    }
    return D;
}
 
// Function to get adjoint of A[N][N] in adj[N][N]. 
void adjoint(double A[N][N], double adj[N][N])
{   
    if (N == 1)
    {
        adj[0][0] = 1;
        return;
    }
 
    // temp is used to store cofactors of A[][] 
 
    int sign = 1;
    double temp[N][N];
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            // Get cofactor of A[i][j] 
            getCofactor(A, temp, i, j, N);
 
            // sign of adj[j][i] positive if sum of row 
            // and column indexes is even. 
            sign = ((i + j) % 2 == 0) ? 1 : -1;
 
            // Interchanging rows and columns to get the 
            // transpose of the cofactor matrix 
            adj[j][i] = (sign)*(determinant(temp, N - 1));
        }
    }
}
 
// Function to calculate and store inverse, returns false if 
// matrix is singular 
bool inverse(double A[N][N], double inverse[N][N])
{
    // Find determinant of A[][] 
    double det = determinant(A, N);
    if (det == 0)
    {
        cout << "Singular matrix, can't find its inverse";
        return false;
    }
 
 
    // Find adjoint 
    double adj[N][N];
 
    adjoint(A, adj);
 
    // Find Inverse using formula "inverse(A) = adj(A)/det(A)" 
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            inverse[i][j] = adj[i][j] / double(det);
    return true;
}
 
// Функция вывода матрицы
void PrintMatr(double mas[N][N], int n) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++)
            std::cout << mas[i][j] << " ";
        std::cout << endl;
    }
}
 
//Умножение матрицы на вектор
void mul_1(double matr[N][N], double v[N], double result[N]) {
    for (int i = 0; i < N; ++i) {
        result[i] = 0;
        for (int j = 0; j < N; ++j) {
            result[i] += matr[i][j] * v[j];
        }
    }
}
 
//Умножение вектора на число
void mul_2(double v[N], double h, double result[N]) {
    for (int i = 0; i < N; i++) {
        result[i] = v[i] * h;
    }
}
 
//Сложение векторов
void add(double v1[N], double v2[N], double result[N]) {
    for (int i = 0; i < N; i++) {
        result[i] = v1[i] + v2[i];
    }
}
 
//Якобиан системы
void SetJackobian(double y[N], double jac[N][N], double alpha) {
    jac[0][0] = (2. * (y[2] * (y[0] - 0.1))) / (1.0 - y[1]) + 10e8;
    jac[0][1] = ((y[0] - 0.2)*y[0] * y[2]) / pow((1.0 - y[1]), 2.);
    jac[0][2] = ((y[0] - 0.2)*y[0]) / (1.0 - y[1]);
    jac[0][3] = 0.;
    jac[1][0] = y[2];
    jac[1][1] = 0.;
    jac[1][2] = y[0];
    jac[1][3] = 0.;
    jac[2][0] = y[3];
    jac[2][1] = 0.;
    jac[2][2] = 0.;
    jac[2][3] = y[0];
    jac[3][0] = 5.e29*(exp(-alpha / y[0]))*(0.5 + y[0]) / pow(y[0], 3. / 2.);
    jac[3][1] = 0.;
    jac[3][2] = 0.;
    jac[3][3] = 0.;
}
 
//Одностадийный метод Розенброка
void rosenbrock(double y[N], double t0, double max_t, double h, double alpha) {
    double t = t0;
    double ynew[N];
    double f[N];
    double jac[N][N];
    double adj[N][N];  // To adjoint of A[][] 
    double inv[N][N]; // To store inverse of A[][] 
    double a[N][N];
    
    //единичная матрица
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            if (i == j) a[i][j] = 1;
            else a[i][j] = 0;
        }
    }
 
    SetJackobian(y, jac, alpha);
 
    //умножение матрицы на число
    double umn[N][N];
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            jac[i][j] *= (h / 2);
            umn[i][j] = jac[i][j];
        }
    }
 
    // вычитание матрицы
    double temp[N][N];
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            temp[i][j] = a[i][j] - umn[i][j];
        }
    }
 
    adjoint(temp, adj);
 
    inverse(temp, inv);
 
    dydt(y, f, t, alpha);
    mul_1(inv, f, ynew);
    mul_2(ynew, h, ynew);
    add(ynew, y, y);
 
}
 
double j_0(double y[N]) {
    return -(2 * 3 * 10e-2*((8.85*10e6) - (y[0] / 10e-8) - y[2])*(1 - y[1])) / (0.2 - y[0]);
}
 
double j_1(double y[N]) {
    return j_0(y)*0.1;
}
 
double function_optimiz(double alpha) {
    double y[N];
    y[0] = 10e-10, y[1] = 0.0, y[2] = 0.0, y[3] = 0.0;
    double t0 = 0.0, max_t = 5.73e-08, h = 1e-10;
    double t = t0;
    double sum = 0;
 
    for(t = t0; t <= max_t; t += h) {
 
        rosenbrock(y, t0, max_t, h, alpha);
        std::cout << t << "\t" << std::setprecision(5) << y[0] << "\t" << y[1] << "\t" << y[2] << "\t" << y[3] << std::endl;
 
        sum += (j_0(y) - j_1(y))*(j_0(y) - j_1(y));
        cout << "sum: " << sum << "\n";
 
    }
    return sum;
}
 
double Gold(double a, double b, double e, int max_steps_count) {
    long nIter = 1; // переменная для показа номера итерации
    double res = 0.0; // результат, возвращаемый функцией
    double t = (std::sqrt(5) - 1)/2;// магический коэффициент золотого сечения
    double x1 = b - t * (b - a), x2 = a + t * (b - a); // предполагаемая точка экстремума и точка симметричная ей на отрезке [a, b]
 
    int step = 0; // текущий шаг 
    double h1, h2;
 
    while (e <= fabs(b - a)) {  // повторяем цикл до тех пор, пока разность концов отрезков не будет меньше заданной погрешности
        std::cout << "\t**\t Iteration: " << (nIter++) << " \t **" << std::endl;
        std::cout << std::setprecision(4) << "[ a ; b ]: [ " << a << " ; " << b << " ]\t" << " ALPHA_1: " << x1 << "\tALPHA_2: " << x2 << std::endl;
        h2 = function_optimiz(x2);  // считаем значение функции в точке симетричной точке экстремума
        h1 = function_optimiz(x1); // считаем значение функции в точке экстремума
        // сужаем интервал неопределенности
        if (h2 < h1) a = x1;
        else b = x2;
 
        x1 = b - t * (b - a); // пересчитываем предполагаемую точку экстремума
        x2 = a + t * (b - a); // пересчитываем предполагаемую точку симетричную экстремуму
 
        step++; 
        if (step > max_steps_count) break;
    }
 
    std::cout << "\t**\t Iteration: " << (nIter++) << " \t **" << std::endl;
    std::cout << std::setprecision(4) << "[ a ; b ]: [ " << a << " ; " << b << " ]\t" << " ALPHA_1: " << x1 << "\tALPHA_2: " << x2 << std::endl;
 
    std::cout << "\n\t**\t Result \t **";
    res = (a + b) / 2;
    std::cout << "\n res = " << res; 
 
    return res;
}
 
 
void descent_method(double a, double b,  double eps, int max_steps_count)
{
    double alpha = ;
    double B = function_optimiz(alpha), A = 0;
    bool was_counted = false;
    int stpes_ellapsed = 0;
    double delta = 0.0;
 
 
    for (int i = 0; i < max_steps_count; i++) {
        A = B;
        alpha = Gold(a, b, eps, max_steps_count);
 
        B = function_optimiz(alpha);
 
        if (fabs(A - B) <= eps)
        {
            stpes_ellapsed = i + 1;
            was_counted = true;
            break;
        }
    }
}
 
// Driver program 
 
int main()
{
    double a, b, e;
    cout << "Input a: "; cin >> a;   // 8e-2
    cout << "Input b: "; cin >> b;   // 5e-1
    cout << "Input eps: "; cin >> e; // 1e-3
 
    int max_steps_count;
    cout << "Input max steps count: "; cin >> max_steps_count; // 20
 
    cout << "Gold method: " << endl;
    Gold(a, b, e, max_steps_count);
 
    cout << endl;
 
    system("pause");
 
    return 0;
}
0
261 / 111 / 53
Регистрация: 22.01.2017
Сообщений: 448
14.02.2019, 11:05
ElKros, и так. Функция Gold не находит все alpha, она возвращает одно значение res. Остальное это всего лишь вывод. Если его убрать:
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
double Gold(double a, double b, double e, int max_steps_count) {
    double res = 0.0; // результат, возвращаемый функцией
    double t = (std::sqrt(5) - 1)/2;// магический коэффициент золотого сечения
    double x1 = b - t * (b - a), x2 = a + t * (b - a); // предполагаемая точка экстремума и точка симметричная ей на отрезке [a, b]
 
    int step = 0; // текущий шаг
    double h1, h2;
 
    while (e <= fabs(b - a)) {  // повторяем цикл до тех пор, пока разность концов отрезков не будет меньше заданной погрешности
        h2 = function_optimiz(x2);  // считаем значение функции в точке симетричной точке экстремума
        h1 = function_optimiz(x1); // считаем значение функции в точке экстремума
        // сужаем интервал неопределенности
        if (h2 < h1) a = x1;
        else b = x2;
 
        x1 = b - t * (b - a); // пересчитываем предполагаемую точку экстремума
        x2 = a + t * (b - a); // пересчитываем предполагаемую точку симетричную экстремуму
 
        step++;
        if (step > max_steps_count) break;
    }
 
    res = (a + b) / 2;
    return res;
}
res единственное значение.
Если функция Gold возвращает alpha, то в чем проблема в функции descent_method?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void descent_method(double a, double b,  double eps, int max_steps_count)
{
    double alpha = Gold(a, b, eps, max_steps_count);
    double B = function_optimiz(alpha), A = 0;
    bool was_counted = false;
    int stpes_ellapsed = 0;
 
    for (int i = 0; i < max_steps_count; i++) {
        A = B;
        alpha = Gold(a, b, eps, max_steps_count);
 
        B = function_optimiz(alpha);
 
        if (fabs(A - B) <= eps)
        {
            stpes_ellapsed = i + 1;
            was_counted = true;
            break;
        }
    }
}
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
14.02.2019, 11:11  [ТС]
n1b1ru, да, Gold вернет только одно значение, которое будет миримальным.

Я сомневаюсь в правильности того, что я переделала..

Добавлено через 44 секунды
n1b1ru, и мне кажется, что в переделанном случае будет альфа всегда одно и тоже
0
261 / 111 / 53
Регистрация: 22.01.2017
Сообщений: 448
14.02.2019, 11:53
Цитата Сообщение от ElKros Посмотреть сообщение
и мне кажется, что в переделанном случае будет альфа всегда одно и тоже
Есть такое, функции оперируют с копиями аргументов, нужно по значению:
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
double Gold(double &a, double &b, double e, int max_steps_count) {
    double res = 0.0; // результат, возвращаемый функцией
    double t = (std::sqrt(5) - 1)/2;// магический коэффициент золотого сечения
    double x1 = b - t * (b - a), x2 = a + t * (b - a); // предполагаемая точка экстремума и точка симметричная ей на отрезке [a, b]
 
    int step = 0; // текущий шаг
    double h1, h2;
 
    while (e <= fabs(b - a)) {  // повторяем цикл до тех пор, пока разность концов отрезков не будет меньше заданной погрешности
        h2 = function_optimiz(x2);  // считаем значение функции в точке симетричной точке экстремума
        h1 = function_optimiz(x1); // считаем значение функции в точке экстремума
        // сужаем интервал неопределенности
        if (h2 < h1) a = x1;
        else b = x2;
 
        x1 = b - t * (b - a); // пересчитываем предполагаемую точку экстремума
        x2 = a + t * (b - a); // пересчитываем предполагаемую точку симетричную экстремуму
 
        step++;
        if (step > max_steps_count) break;
    }
 
    res = (a + b) / 2;
    return res;
}
 
void descent_method(double &a, double &b,  double eps, int max_steps_count)
{
    double alpha = Gold(a, b, eps, max_steps_count);
    double B = function_optimiz(alpha), A = 0;
    bool was_counted = false;
    int stpes_ellapsed = 0;
 
    for (int i = 0; i < max_steps_count; i++) {
        A = B;
        alpha = Gold(a, b, eps, max_steps_count);
 
        B = function_optimiz(alpha);
 
        if (fabs(A - B) <= eps)
        {
            stpes_ellapsed = i + 1;
            was_counted = true;
            break;
        }
    }
}
Но в любом случае я опираюсь на правильность вашего решения
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
14.02.2019, 12:14  [ТС]
n1b1ru, просто отдельно метод Голд работает. Можно ли считать, что Спуск тоже сделан верно ?

Добавлено через 2 минуты
n1b1ru, если в Голд я нахожу уже минимальное значение, а при его вызове будет будет постоянно одно и тоже, даже если и передавать через &
0
261 / 111 / 53
Регистрация: 22.01.2017
Сообщений: 448
14.02.2019, 12:20
ElKros, вроде как правильно
Цитата Сообщение от ElKros Посмотреть сообщение
если в Голд я нахожу уже минимальное значение, а при его вызове будет будет постоянно одно и тоже, даже если и передавать через &
Не совсем, значения меняются:
C++
1
2
3
// сужаем интервал неопределенности
if (h2 < h1) a = x1;
else b = x2;
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
14.02.2019, 12:27  [ТС]
n1b1ru, там меняются до тех пор, пока не найдется минимальное значение. А как тогда найдется минимальное в спуске, если оно уже найдено в Голд?
0
261 / 111 / 53
Регистрация: 22.01.2017
Сообщений: 448
14.02.2019, 16:25
ElKros, да, так и есть. А функция function_optimiz точно правильно работает? Все значения должны быть фиксированными?
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
14.02.2019, 16:38  [ТС]
n1b1ru, функция function_optimiz - это сумма квадрат разницы. Ее я и находила. Вроде, верно. У меня в этой функции меняются на каждой итерации решения системы, которые я нахожу одностадийный методом розкнюрока, а затем считается квадрат разницы между функциями j0 и j1
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.02.2019, 16:38

Передача метода в метод, метода как параметр
Здравствуйте друзья. Есть значит некоторый фрейм: public class Window extends JFrame implements ActionListener { ... (1) ......

Заданы два целых числа. Определить являются ли они оба четными или оба нечетными или какое из них четное, а какое нечетное.
помогите пожалуйста составить программу и блок-схему в Pascal. Заданы два целых числа. Определить являются ли они оба четными или оба...

Полиморфизм: вызов метода базового класса, переопределенного метода и нового метода
В базовом классе метод помечен как virtual. Насколько я понял из книги: override означает, что метод не утрачивает связи с базовым...

как при наведении на 1 из 2х элементов менялись оба (как объединить классы в css)
Есть 2 элемента, нужно чтобы при наведении на любой из них менялись оба код &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; ...

Как удалить дубликаты (оба)
Добрый день! Прошу подсказать, как удалить дублирующиеся электронные адреса в Exel. Суть в том, что они должны удаляться оба,...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Опции темы

Новые блоги и статьи
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru