Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583

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

11.02.2019, 23:51. Показов 2688. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Сезонность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru