Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
Другие темы раздела
C++ Конструктор копирования Почему экземпляры класса копируются без конструктора копий ? и к тому же получили разные адреса ? =====array2.h.cpp======= …….. ===== array2.cpp======= ……… =====Main.cpp======= int main() { array2 m1(a,b); https://www.cyberforum.ru/ cpp-beginners/ thread2040572.html Передать значение переменной в параметры другой функции через указатель C++
Доброго времени суток. Уже учу ООП и каждый раз возвращаюсь к одной и той же проблеме, которую всегда обходил. На этот раз решил решить окончательно, но ответа найти не могу. Вопрос очень простой: есть простейшая функция класса в ней инициализирована переменная, мне нужно передать значение этой переменной в параметры другой функции.
C++ Подключение скачанных библиотек https://www.cyberforum.ru/ cpp-beginners/ thread2040553.html
Чтобы подключить те библиотеки которые скачал нужно их в папку с программой кинуть? (Вопрос достаточно глупый, но спросить было надо...)
C++ Что такое страница? http://mycpp.ru/cpp/scpp/cppf_setactivepage.htm Что такое страница? https://www.cyberforum.ru/ cpp-beginners/ thread2040552.html
C++ Написать функцию возведения в квадрат целого числа не использующую умножение
Можете пожалуйста объяснить по строкам, что делает каждая из них Задача была вот такой: Реализуйте функцию square(), не используя оператор умножения; иначе говоря, віполните умножение x*x с помощью повторяющегося сложения (начните с переменной, равной нулю, и х раз добавьте к ней число х). Затем выполните версию "первопрограммы", используя функцию square(). Изначально не понял что от меня хотят...
C++ Считывание цифр из файла, замена набора цифр соответствующей цифрой и вывод в другой файл https://www.cyberforum.ru/ cpp-beginners/ thread2040537.html
Нужно написать программу, что будет считывать из файла Imput.txt лишь первые 10 цифр для того, чтобы организовать перевод из двоичной системы счисления в восьмеричную путём отбора с конца по 3 цифры и заменой соответствующей. После чего выводила результат в файл Output.txt #include <fstream> #include <stdlib.h> #include <iostream> using namespace std; int main() // точка входа в программу {...
C++ Сортировка массива вставкой с выводом числа сравнений и числа перемещений https://www.cyberforum.ru/ cpp-beginners/ thread2040527.html
Написал прогу для сортировки массива вставкой. Нужно еще сделать подсчет числа сравнений и обменов. Помогите, плиз, а то мне уже в понедельник нужно лабораторку сдать. #include <iostream> #include <stdlib.h> #include <conio.h> using namespace std; int main() { setlocale(0,"rus"); int size;
C++ Не удается получить доступ к защищённому члену
Аллахвелик, парни! Решаю вот такое задание: Реализуйте абстрактный класс Expression с чисто виртуальными методами Expression* diff(); и void print(); и отнаследуйте от него классы Number, Variable, Add и Sub число, переменная, сумма двух выражений и разность двух выражений, для которых напишите реализацию этих двух методов; Пример: Expression* e = new Add(new Number(1), new Variable('x'));...
C++ Setw() манипулятор Проблема в том, что не могу разобраться как правильно отформатировать свою результат, хочу вывести значения, в виде таблицы. Вот код: #include <iostream> #include <iomanip> using namespace std; struct school { string last_name; string subject; https://www.cyberforum.ru/ cpp-beginners/ thread2040522.html C++ Метод половинного деления для нахождения коэффициента https://www.cyberforum.ru/ cpp-beginners/ thread2040521.html
Не понимаю как сделать,подскажите. Есть две формулы ∫〖1+〖(ax^2+c )^2〗'^2 dx〗=15 Интеграл от -5 до 5. ∫〖1+〖(k×(e^(x/k)+e^(-x/k))/2 )^2〗'^2 dx〗=15 Интеграл от -5 до 5. Как мне из них получить коэффициенты a и k? Вот, что я написал на С++
Дано натуральное число n, определяющее возраст человека в годах C++
Дано натуральное число n, определяющее возраст человека в годах. Дать для этого числа наименования "год", "года", "лет", например, 1 год, 23 года, 45 лет и т.д. Помогите)0
C++ Написать программу которая находит конец предложения в тексте и делает их один под другим(нажатие Enter) https://www.cyberforum.ru/ cpp-beginners/ thread2040491.html
Написать программу которая находит конец предложения в тексте и делает один под другим(нажатие Enter). Концом предложения считаются !,?,. Текст считывается из файла в строку и в конце записывается в другой файл. Не получается дописать функцию, которая переносила бы предложение вниз при нахождении определенного символа. #include "stdafx.h" #include <iostream> #include <windows.h> #include...
672 / 475 / 215
Регистрация: 06.09.2013
Сообщений: 1,306
17.09.2017, 11:34 0

Минимизация двумерным методом Ньютона Функции Химмельблау и Розенброка - C++ - Ответ 10757951

17.09.2017, 11:34. Показов 6191. Ответов 22
Метки (Все метки)

Ответ

Ты что-то непонятное написал какие-то циклы страшные, там один цикл - итерации методом Ньютона, матрица 2 на 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
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
#include <iostream>
#include <fstream>
#include <cmath>
 
struct Vector2 {
    double x1;
    double x2;
    Vector2() : x1(0.0), x2(0.0) {}
    Vector2(double _x1, double _x2): x1(_x1), x2(_x2) {}
    Vector2 & operator += (const Vector2 &other) {
        x1 += other.x1;
        x2 += other.x2;
        return *this;
    }
    Vector2 operator-() const {   return Vector2(-x1, -x2);  }    
};
 
std::ostream & operator<<(std::ostream & os, const Vector2 &x) { return os << x.x1 << " " << x.x2; }
 
class Matrix2x2 {
    double _items[2][2];
public:
    Matrix2x2() {}
    Matrix2x2(double m11, double m12, double m21, double m22) {
        _items[0][0] = m11; _items[0][1] = m12;
        _items[1][0] = m21; _items[1][1] = m22;
    }
    Vector2 operator*(const Vector2 &v) const {
        return Vector2(_items[0][0] * v.x1 + _items[0][1] * v.x2,
                       _items[1][0] * v.x1 + _items[1][1] * v.x2);
    }
    Matrix2x2 inverse() const {
        double det = _items[0][0] * _items[1][1] - _items[0][1] * _items[1][0];
        if(det == 0.0) throw std::exception();
        return Matrix2x2(_items[1][1] / det, -_items[0][1] / det,
                       -_items[1][0] / det, _items[0][0] / det);
    }
    double* operator[](size_t i) {return _items[i]; }
    const double* operator[](size_t i) const {return _items[i]; }
};
 
// Базовый класс для функции от 2-х переменных
class Func2 {
protected:
    double _value;
    Vector2 _gradient;
    Matrix2x2 _jacobian;
public:
    // Вычислить значение в данной точке
    virtual void evaluate(const Vector2 &x) = 0;
    // Значение функции
    double value() const {return _value;}
    // Градиент
    const Vector2 & gradient() const {return _gradient; }
    // Якобиан градиента
    const Matrix2x2 & jacobian() const { return _jacobian; }
 
};
 
// Функция Розенброка
class RozenbrokFunc : public Func2 {
    virtual void evaluate(const Vector2 &x);
};
 
void RozenbrokFunc::evaluate(const Vector2 &x) {
        double a = x.x1 - x.x2 * x.x2;
        double b = 1.0 - x.x2;
        _value = 100.0 * a * a + b * b;
        _gradient.x1 = 200.0 * a;
        _gradient.x2 = -800.0 * a * x.x2 - 2.0 * b;
 
        _jacobian[0][0] = 200.0;
        _jacobian[0][1] = -400.0 * x.x2;
        _jacobian[1][0] = -800.0 * x.x2;
        _jacobian[1][1] = -800.0 * (x.x1 - 3.0 * x.x2 * x.x2) + 2;
}
 
// Функция Химмельблау
class HimmelblauFunc : public Func2 {
    virtual void evaluate(const Vector2 &x);
};
 
void HimmelblauFunc::evaluate(const Vector2 &x) {
    double a = x.x1 * x.x1 + x.x2 - 11;
    double b = x.x1 + x.x2 * x.x2 - 7;
    _value = a * a + b * b;
 
    _gradient.x1 = 4.0 * a * x.x1 + 2.0 * b;
    _gradient.x2 = 2.0 * a + 4.0 * b * x.x2;
 
    _jacobian[0][0] = 2.0 + 4.0 * (2.0 * x.x1 * x.x1 + a);
    _jacobian[1][0] = _jacobian[0][1] = 4.0 * (x.x1 + x.x2);
    _jacobian[1][1] = 2.0 + 4.0 * (2.0 * x.x2 * x.x2 + b);
}
 
// Поиск экстремального значения методом Ньютона
bool newton_minimization(Func2 &f, Vector2 &x, size_t iteration_count, std::ostream & os) {
    double threshold = 0.1;
    for(size_t i = 0; i < iteration_count; i++) {
        f.evaluate(x);
        Matrix2x2 inv_j = f.jacobian().inverse();
        Vector2 xstep = - (inv_j * f.gradient());
        os << "Iteration: " << i << std::endl;
        os << "(x1,x2) = " << x << std::endl;
        os << "Functions value: " << f.value() << std::endl;
        os << "Gradient: " << f.gradient() << std::endl;
        os << "Step: " << xstep << std::endl;
        if(f.gradient().x1 <= threshold && f.gradient().x2 <= threshold) {
            os << "Solution founded" << std::endl;
            return true;
        }
        x += xstep;
        threshold *= 0.1;
        os << std::endl;
    }
    return false;
}
 
 
int main()
{
    Vector2 rx(10.0, 10.0); // Начальное значение
    size_t iteration_count = 15;
    RozenbrokFunc rfunc;
    std::ofstream os;
    os.open("rozenbrok.txt");
    newton_minimization(rfunc, rx,  iteration_count, os);
    os.close();
    os.open("himelblau.txt");
    HimmelblauFunc hfunc;
    Vector2 hx(10.0, 10.0);
    newton_minimization(hfunc, hx,  iteration_count, os);
    os.close();
}
Добавлено через 3 часа 37 минут
Поправил опечатку.

Вернуться к обсуждению:
Минимизация двумерным методом Ньютона Функции Химмельблау и Розенброка C++
0
Заказать работу у эксперта
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.09.2017, 11:34
Готовые ответы и решения:

Минимизация Методом Ньютона уравнения с двумя переменными
Всем добрый день... я тут новичок...очень нужна ваша помощь. Программу для уравнения где одна...

Нахождения максимума функции методом Ньютона
Мне надо на с++ написать код для нахождения максимума функции методом ньютона. Код бы я написать...

Как найти максимум функции методом Ньютона?
кто может помочь? Я написал программу для поиска корней а вот для поиска максимума на отрезке не...

Ошибка в программе интерполяция функции методом Ньютона
выдает ошибку, не пойму в чем проблема Unit1.cpp(12): E2313 Constant expression required ...

22
17.09.2017, 11:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.09.2017, 11:34
Помогаю со студенческими работами здесь

Интерполяция функции одной переменной методом Ньютона (Pascal -> C++)
program interpol; uses crt,graph; const MAXCOUNT=30; type

Минимизация функции методом ломаных
Доброго времени суток! Помогите, пожалуйста, с программой. Мне нужно реализовать метод ломаных....

Минимизация функции методом ломаных
Здравствуйте! Помогите, пожалуйста, реализовать метод ломаных нахождения минимума...

Минимизация функции методом золотого сечения
Здравствуйте, помогите с лабораторной. Нужно написать код, исходя из следующей блок схемы:...

0
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru