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

Задача по методам оптимизации - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Закон Менделеева-Клайперона http://www.cyberforum.ru/cpp-beginners/thread815302.html
Программа для Закона Менделеева-Клайперона, определяющую один из параметров давление, занимаемый объем, температура, газа при изохорном, изобарном и изотермических процессах.
C++ Разработать программу «Мгновенная скорость тела», вычисляющую мгновенную скорость движущегося тела, с учётом вида движения физического тела 1)Разработать программу «Мгновенная скорость тела», вычисляющую мгновенную скорость движущегося тела, с учётом вида движения физического тела;1) Название темы должно отражать ее суть, а не что-то... http://www.cyberforum.ru/cpp-beginners/thread815293.html
C++ Разработать программу «Успеваемость», позволяющую рассчитать значение среднего балла студента, группы, потока
Разработать программу «Успеваемость», позволяющую рассчитать значение среднего бала студента, группы, потока
Введите три числа. По условию выведите их в порядке возрастания и вычислите площадь полученного треугольника C++
Введите три числа.Если они могут быть длинами сторон разностороннего тупоугольного треугольника,выведите их в порядке возрастания и вычислите площадь полученного треугольника. Помогите плиз на С++
C++ GET и POST методы CGI скрипта на C++ http://www.cyberforum.ru/cpp-beginners/thread815264.html
Разработать единый CGI-скрипт для обработки запросов, приходящих при заполнении форм по методам GET и POST, возвращающий пользователю ответы в кодировке Win или KOI-8 в виде: - текстового...
C++ Указатели, функции (сумма и произведение значений элементов, умножение элементов произвольного столбца) если что, вот такое задание P7. Ввести двумерный массив размерностью 5х6. Рассчитать в одной функции сумму и произведение значений элементов произвольной строки двухмерного массива. Написать... подробнее

Показать сообщение отдельно
kdk96
0 / 0 / 0
Регистрация: 10.12.2014
Сообщений: 1
16.11.2015, 17:33
IrineK, Вы не могли бы скинуть текст программы, моя программа высчитывает приблизительно но почему то не так точно и всего за 4 итерации а не как у вас . Хотя писал код по методичке

Добавлено через 3 минуты
IrineK, вот мой код
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
#include "stdafx.h"
#include <cmath>
 
bool sravn(double x[], double y[], double eps, int n)
{
    int i;
    int k = 0;
    bool s = true;
    for (i = 0; i<n; i++)
        if (fabs(x[i] - y[i]) <= eps)
        {
            k++;
        }
    if (k == n) s = false;
    return s;
}
 
double pr(double (*f) (double*) , double eps, double *x, int i, int n)
{
    double f1 = 0, f2 = 0;
    double *x1 = new double[n];
    double *x2 = new double[n];
    for (int j = 0; j < n; j++)
    {
        x1[j] = x2[j] = x[j];
    }
    double dx = 0.1;
    x1[i] += dx;
    x2[i] -= dx;
    f1 = (f(x1) - f(x2)) / (2 * dx);
    dx = dx / 10;
    for (int j = 0; j < n; j++)
    {
        x1[j] = x2[j] = x[j];
    }
    x1[i] += dx;
    x2[i] -= dx;
    f2 = (f(x1) - f(x2)) / (2 * dx);
    while (fabs(f2 - f1) > eps)
    {
        f1 = f2;
        dx /= 10;
        for (int j = 0; j < n; j++)
        {
            x1[j] = x2[j] = x[j];
        }
        x1[i] += dx;
        x2[i] -= dx;
 
        f2 = (f(x1) - f(x2)) / (2 * dx);
        if (f2 == 0)
            break;
    }
    return f1;
}
 
//double *proizv(double *x, int n, double eps, double(*fu) (double*))
//{
//  double *f = new double[n];
//  for (int i = 0; i < n; i++)
//  {
//      f[i] = pr(fu, eps, x, i, n);
//  }
//  return f;
//}
 
double rosenbr(double *x)
{
    return (1 - x[0])*(1 - x[0]) + 100 * (x[1] - x[0] * x[0])*(x[1] - x[0] * x[0]);
}
 
double fo(double *x)
{
    return pow(x[0], 3) + 2 * pow(x[1], 2) - 3 * x[0] - 4 * x[1];
}
double fo1(double *x)
{
    return x[0] * x[0]-4;
}
double fo2(double *x)
{
    return 3 * x[0] * x[0] + x[0] * x[1] + 2 * x[1] * x[1] - x[0] - 4 * x[1];
}
double fo3(double *x)
{
    return -x[0] * x[0] - 5 * x[1] * x[1] - 3 * x[2] * x[2] + x[0] * x[1] - 2 * x[0] * x[2] + 2 * x[1] * x[2] + 11 * x[0] + 2 * x[1] + 18 * x[2] + 10;
}
 
double pr11(double x)
{
    return 3 * x*x - 3;
}
 
double pr22(double x)
{
    return 4 * x - 4;
}
int main()
{
    double(*f) (double*);
    f = &fo;
    double ff;
    double eps = 0.00000001;
    int n=2;
    int k=0, p=0, iter=0;
    double a=0.5, b=0.2;
    double *T = new double[n];
    double *x0 = new double[n];
    for (int i = 0; i < n; i++)
    {
        scanf("%lf", &x0[i]);
    }
    double *x1 = new double[n];
    for (int i = 0; i < n; i++)
    {
        scanf("%lf", &x1[i]);
    }
    double *x = new double[n];
    double f0, f1;
    f0 = f(x0);
    f1 = f(x1);
    //printf("%lf %lf", f0, f1);
    if (f1 > f0)
    {
        T = x0;
        x0 = x1;
        x1 = T;
    }
 
    do
    {
        if (k == 1)
        {
            x0 = x1;
            x1 = x;
        }
        k = 0;
        iter++;
        for (int i = 0; i < n; i++)
        {
            x[i] = x1[i] - a*pr(f, 0.000001, x1, i, n)+b*(x1[i]-x0[i]);
        }
        //x[0]=x1[0]-a*pr11(x1[0])+b*(x1[0] - x0[0]);
        //x[1] = x1[1] - a*pr11(x1[1]) + b*(x1[1] - x0[1]);
        ff = f(x);
        if (ff > f1 && p == 0 && b > 0.1)
            b -= 0.1;
        else
        {
            if (b <= 0.1) p = 1;
            if (ff > f1 && p == 1 && a >= eps) a /= 2;
            if (ff<f1) k = 1;
        }
    } while (sravn(x1,x,eps,n) && a>eps);
    printf("%lf %lf ", x[0], x[1]);
    printf("%lf   iter %d  a %lf  b %lf", f(x), iter, a ,b);
 
 
 
 
    system("pause");
    return 0;
}
Заранее спасибо!
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru