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

Найти минимум функции методом кубической параболы - C++

Восстановить пароль Регистрация
 
imran
0 / 0 / 0
Регистрация: 18.05.2014
Сообщений: 7
18.05.2014, 00:47     Найти минимум функции методом кубической параболы #1
Добрый вечер. Делаю лабораторную работу по c++ (нахождение минимума функции методом кубической параболы) и не знаю как реализовать последний пункт в алгоритме (шаг 7). Подкиньте идейку. Сам никак не придумаю как это сделать.
Миниатюры
Найти минимум функции методом кубической параболы  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2014, 00:47     Найти минимум функции методом кубической параболы
Посмотрите здесь:

Найти минимум функции методом золотого сечения. C++
C++ Создать титульный лист и построить график кубической параболы
Как задать криволинейный замкнутый контур по точкам методом кубической интерполяции? C++
найти методом золотого сечения минимум C++
C++ Найти приближенно, с точностью до 0.01, минимум функции на отрезке
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
destroymol
6 / 6 / 3
Регистрация: 02.06.2013
Сообщений: 46
18.05.2014, 01:04     Найти минимум функции методом кубической параболы #2
А в чем проблема? Оба эпсилона ты знаешь, x1, и х с чертой знаешь, функцию вычислить можешь. Я не понял вопроса. Скинь то, до чего ты уже дорешался.
imran
0 / 0 / 0
Регистрация: 18.05.2014
Сообщений: 7
18.05.2014, 11:50  [ТС]     Найти минимум функции методом кубической параболы #3
Я не понимаю как в с++ реализовать 7 шаг (поменять значения переменных и вернутся в шаг 5).
destroymol
6 / 6 / 3
Регистрация: 02.06.2013
Сообщений: 46
18.05.2014, 15:19     Найти минимум функции методом кубической параболы #4
Скинь код, который уже есть.
imran
0 / 0 / 0
Регистрация: 18.05.2014
Сообщений: 7
19.05.2014, 20:58  [ТС]     Найти минимум функции методом кубической параболы #5
Недоделанный код (не объявлял переменные, не проверял на ошибки):
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
#include <iostream>
#include <math.h>
#include <stdlib.h>
 
using namespace std;
 
double  a=1,  h=1, eps1 = 0.01, eps2 = 0.03, xl;
 
double f(double);
double fp(double);
double kit(double);
 
 
int main()
{
    
 
    xl = mp3();
    cout << "Minimum = " << xl << endl;
    system("pause");
    return 0;
}
 
double f(double x)
{
    return x*cos(x)-x;
}
 
double fp(double x)
{
    return (-x)*sin(x)+cos(x)-1;
}
double kip(double x1, double x2) // кубический интерполяционный полином
{
    double w, z, nu;
    z = (3 * (f(x1) - f(x2))) / x2 - x1 + fp(x1) + fp(x2);
 
 
    if (x1 < x2)
        w = pow((pow(z, 2) - fp(x1)*fp(x2)), 1 / 2.);
    else w = -pow((pow(z, 2) - fp(x1)*fp(x2)), 1 / 2.);
 
    nu = (fp(x2) + w - z) / (fp(x2) - fp(x2) + 2 * w);
 
    if (nu < 0) xl = x2;
    if (nu >= 0 && nu <= 1) xl = x2 - nu*(x2 - x1);
    if (nu>1) xl = 1;
 
    if (f(xl) >= f(x1)) xl = xl - 1 / 2.*(xl - x1);
    do {
        xl = xl - 1 / 2.*(xl - x1);
    } while (f(xl) <= f(x1));
    return xl;
}
double x1( double h)
{
    double x0, x, x1, x2, xk_p_1, xm, xm_m_1;
    int k = 0, m = 0;
    x0 = a;
    x = x0 + 1;
    if (fp(x0)<0)
    do {
        xk_p_1 = pow(x, k + 1);
        xk_p_1 = pow(x, k) + pow(2, k)*h;
 
        k++;
        m++;
        xm = pow(x, m);
        xm_m_1 = pow(x, m + 1);
    } while (fp(xm_m_1)*fp(xm)<=0);
    else
    do {
        xk_p_1 = pow(x, k + 1);
        xk_p_1 = pow(x, k) - pow(2, k)*h;
    
        k++;
        m++;
        xm = pow(x, m);
        xm_m_1 = pow(x, m + 1);
 
 
    } while (fp(xm_m_1)*fp(xm)<=0);
    x1 = pow(x, m - 1);
    return x1;
}
double x2(double h)
{
    double x0, x, x1, x2, xk_p_1, xm, xm_m_1;
    int k = 0, m = 0;
    x0 = a;
    x = x0 + 1;
    if (fp(x0)<0)
    do {
        xk_p_1 = pow(x, k + 1);
        xk_p_1 = pow(x, k) + pow(2, k)*h;
 
        k++;
        m++;
        xm = pow(x, m);
        xm_m_1 = pow(x, m + 1);
    } while (fp(xm_m_1)*fp(xm) <= 0);
    else
    do {
        xk_p_1 = pow(x, k + 1);
        xk_p_1 = pow(x, k) - pow(2, k)*h;
 
        k++;
        m++;
        xm = pow(x, m);
        xm_m_1 = pow(x, m + 1);
 
 
    } while (fp(xm_m_1)*fp(xm) <= 0);
    x2 = pow(x, m);
    return x2;
}
Есть две идеи:
1. х1 и х2 объединить в одну функцию и возвращать от туда структуру.
2. Менять значение иксов в этой структуре и отправлять в функцию, где считается полином.

Добавлено через 5 часов 42 минуты
Помогите пожалуйста, совсем не понимаю как это сделать

Добавлено через 1 час 53 минуты
А можно ли менять значение x1 и x2, например в меине (xl=x1, x1=x2 и тд) и отправлять их в функцию kip?

Добавлено через 21 час 49 минут
Никто не может помочь? :'(
Yandex
Объявления
19.05.2014, 20:58     Найти минимум функции методом кубической параболы
Ответ Создать тему
Опции темы

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