Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 30.05.2017
Сообщений: 17

Ошибка в программе С++

14.07.2019, 21:22. Показов 1066. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, форумчане!

Требуется ваша супер-помощь. Нашел интересную реализацию метода квадратичной интерполяции Пауэлла в книге Данилина.
Никак не могу запустить её, к слову, не особо хорошо разбираюсь в visual studio.

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
#include "pch.h"
#include <iostream>
#include <math.h> 
 
using namespace std;
 
 
template <class Value>
int Sign(Value Val) {
    if (Val == 0.) return 0;
    if (Val > 0.) return 1;
    else return -1;
}
 
int main() 
{
double Powell(double a, double b);
    return 0;
}
double Powell(double *a, double *b)
{
    setlocale(LC_CTYPE, "Russian");
    // Программа поиска минимума на интервале [a, b] 
    // методом квадратичной аппроксимации Пауэлла. 
    // Значение функции f(x) вычисляется в подпрограмме Fx(x)
    // В результате интервал неопределённости уменьшается и 
    // его границы доступны в вызывающей программе. 
    // Также «наверх» передаётся минимальное значение функции. 
 
    extern double Fx(double);
 
    double  dx, x[4], f[4], xt, ft, dn, nm, tolerance = 0.001;
    int j, k, s1, s2, s3;
    dx = 0.05; // Шаг  
   
               // Начать процесс с первых трёх точек 
    x[0] = *a;
    f[0] = Fx(x[0]); x[1] = *a + dx;
    f[1] = Fx(x[1]); 
 
    if (f[0] < f[1])
        x[2] = *a - dx;
    else 
        x[2] = *a + 2.0*dx;
 
    f[2] = Fx(x[2]);
 
    //Первый интерполированный минимум 
    dn = (x[1]-x[2])*f[0]; 
    dn += (x[2] - x[0])*f[1] + (x[0] - x[1])*f[2];
    nm = (x[1] * x[1] - x[2] * x[2])*f[0];
    nm += (x[2] * x[2] - x[0] * x[0])*f[1];
    nm += (x[0] * x[0] - x[1] * x[1])*f[2];
 
    x[3] = nm / (2.0*dn); f[3] = Fx(x[3]);
 
    while (1) {                 //Бесконечный цикл интерполяции
        for (j = 0; j < 3; j++)     
            for (k = 0;k < 4; k++)
            { 
                if (f[j] > f[k])
                {               //Упорядочить x и f            
                    xt = x[j]; x[j] = x[k]; x[k] = xt;            
                    ft = f[j]; f[j] = f[k]; f[k] = ft;         
                }               //Конец оператора if(  ) 
            }                   //Конец циклов по j и k 
 
            if (fabs(x[0] - x[1]) < tolerance) {
                // Точность по величине интервала достигнута. 
                // Выход из цикла интерполяции.    
                goto EXIT_; 
            }
        // Точность по интервалу не достигнута, 
        // создаём новую точку 
        s1 = Sign(x[1] - x[0]); //sng() =  1,  если скобки > 0
        s2 = Sign(x[2] - x[0]); //sng() =  0,  если скобки = 0 
        s3 = Sign(x[3] - x[0]); //sng() = -1, если скобки < 0
        if (s1 == s2 && s1 == (-s3))
        {
            x[2] = x[3];
            f[2] = f[3]; 
        }
        // Делаем вторую интерполяцию и  // переходим на упорядочивание 
        dn = (x[1] - x[2])*f[0] + (x[2] - x[0])*f[1] + (x[0] - x[1])*f[2];
        ft = (f[0] - f[1]) / (2.0*dn); 
        ft *= (x[1] - x[2])*(x[2] - x[0]);
        x[3] = (x[0] + x[1]) / 2.0 + ft;
        f[3] = Fx(x[3]);
 
    }//Конец бесконечного цикла интерполяции 
 
EXIT_:
*a = x[0];
*b = x[1]; 
return (f[0]);
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.07.2019, 21:22
Ответы с готовыми решениями:

Ошибка в программе
Не могу понять где ошибка, вроде все правильно. uses crt; const gg = #64; n = 15; m = 20; var pole: array of char; ...

Ошибка в программе
Здравствуйте! Я делаю тест в Delphi. У меня программа ругается на такую строку: const...

Ошибка в программе
Помогите, пожалуйста, разобраться в чем ошибка! program pr; uses crt; var y: word; z,n: byte; begin clrscr; writeln ('vv...

9
611 / 416 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
14.07.2019, 21:43
Стесняюсь спросить... А что делают определения функций внутри функции main?
0
9 / 7 / 3
Регистрация: 03.02.2017
Сообщений: 124
14.07.2019, 21:48
410w, не можете запустить? А что пишет? Что выводит?
0
45 / 33 / 15
Регистрация: 29.04.2014
Сообщений: 225
14.07.2019, 22:09
pch.h - содержание предварительно откомпилированных заголовков у вас в проекте тоже есть???
0
Just Do It!
 Аватар для XLAT
4211 / 2668 / 655
Регистрация: 23.09.2014
Сообщений: 9,082
Записей в блоге: 3
15.07.2019, 06:29
Цитата Сообщение от 410w Посмотреть сообщение
Никак не могу запустить её, к слову, не особо хорошо разбираюсь в visual studio.
запустил(сначала скомпилил), но шот она не фурычит:
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
///----------------------------------------------------------------------------|
/// Dev C++ GCC 4.9.2
///----------------------------------------------------------------------------:
#include <iostream>
#include <math.h>
 
using namespace std;
 
 
template <class Value>
int Sign(Value Val)
{   if (Val == 0.) return 0;
    if (Val > 0.) return 1;
    else return -1;
}
 
int main()
{   double Powell(double* a, double* b);
    
    double a = -1.0;
    double b =  1.0;
    
    std::cout << "Powell = " << Powell(&a, &b) << "\n";
    std::cout << "a = " << a << "\n";
    std::cout << "b = " << b << "\n";
    
    std::cin.get();
    return 0;
}
double Powell(double *a, double *b)
{   setlocale(LC_CTYPE, "Russian");
    // Программа поиска минимума на интервале [a, b]
    // методом квадратичной аппроксимации Пауэлла.
    // Значение функции f(x) вычисляется в подпрограмме Fx(x)
    // В результате интервал неопределённости уменьшается и
    // его границы доступны в вызывающей программе.
    // Также «наверх» передаётся минимальное значение функции.
 
    extern double Fx(double);
 
    double  dx, x[4], f[4], xt, ft, dn, nm, tolerance = 0.001;
    int j, k, s1, s2, s3;
    dx = 0.05; // Шаг
 
    // Начать процесс с первых трёх точек
    x[0] = *a;
    f[0] = Fx(x[0]);
    x[1] = *a + dx;
    f[1] = Fx(x[1]);
 
    if (f[0] < f[1])
        x[2] = *a - dx;
    else
        x[2] = *a + 2.0*dx;
 
    f[2] = Fx(x[2]);
 
    //Первый интерполированный минимум
    dn = (x[1]-x[2])*f[0];
    dn += (x[2] - x[0])*f[1] + (x[0] - x[1])*f[2];
    nm = (x[1] * x[1] - x[2] * x[2])*f[0];
    nm += (x[2] * x[2] - x[0] * x[0])*f[1];
    nm += (x[0] * x[0] - x[1] * x[1])*f[2];
 
    x[3] = nm / (2.0*dn);
    f[3] = Fx(x[3]);
 
    while (1)                   //Бесконечный цикл интерполяции
    {   for (j = 0; j < 3; j++)
            for (k = 0; k < 4; k++)
            {   if (f[j] > f[k])
                {   //Упорядочить x и f
                    xt = x[j];
                    x[j] = x[k];
                    x[k] = xt;
                    ft = f[j];
                    f[j] = f[k];
                    f[k] = ft;
                }               //Конец оператора if(  )
            }                   //Конец циклов по j и k
 
        if (fabs(x[0] - x[1]) < tolerance)
        {   // Точность по величине интервала достигнута.
            // Выход из цикла интерполяции.
            goto EXIT_;
        }
        
        
        // Точность по интервалу не достигнута,
        // создаём новую точку.
        s1 = Sign(x[1] - x[0]); //sng() =  1,  если скобки > 0
        s2 = Sign(x[2] - x[0]); //sng() =  0,  если скобки = 0
        s3 = Sign(x[3] - x[0]); //sng() = -1, если скобки < 0
        if (s1 == s2 && s1 == (-s3))
        {   x[2] = x[3];
            f[2] = f[3];
        }
        // Делаем вторую интерполяцию и  // переходим на упорядочивание
        dn  = (x[1] - x[2])*f[0] + (x[2] - x[0])*f[1] + (x[0] - x[1])*f[2];
        ft  = (f[0] - f[1]) / (2.0*dn);
        ft *= (x[1] - x[2])*(x[2] - x[0]);
        x[3] = (x[0] + x[1]) / 2.0 + ft;
        f[3] = Fx(x[3]);
 
    }//Конец бесконечного цикла интерполяции
 
EXIT_:
    *a = x[0];
    *b = x[1];
    return (f[0]);
}
 
///----------------------|
/// Моя функция!         |
///----------------------:
double Fx(double x)
{   return x*x + 3.0;
}
По идее должна вадавать ответ ~3 для a = - 0.001
где то её надо бы подкрутить, но вот где?
0
 Аватар для Andrey B
170 / 122 / 61
Регистрация: 06.02.2015
Сообщений: 300
15.07.2019, 07:17
Страница 33-34
1. Автор вопроса действительно пытался запустить и чуть изменил код
2. В коде в книге есть опечатки
3. После кода читаем:
"Приведённая программа проверяет только достижение требуемой точности по величине интервала неопределённости, то есть по условию (а), однако дополнение для проверки условия (б) сделать достаточно просто, и эту модификацию программы мы предоставляем читателю."
Вложения
Тип файла: pdf Данилин А.И. Методы оптимизации.pdf (1.45 Мб, 6 просмотров)
1
0 / 0 / 0
Регистрация: 30.05.2017
Сообщений: 17
15.07.2019, 15:11  [ТС]
к сожалению, без "pch.h" проект не запускается.
0
0 / 0 / 0
Регистрация: 30.05.2017
Сообщений: 17
15.07.2019, 15:28  [ТС]
Прилагаю ошибку, что мне выпадает.
Как заметил Andrey B, я немного исправил код, взятый из книги, чтобы его запустить.
Первоначальный код:
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
#include <math.h> 
 
double Powell(double *a, double *b) 
{ 
// Программа поиска минимума на интервале [a, b] 
// методом квадратичной аппроксимации Пауэлла. 
// Значение функции f(x) вычисляется в подпрограмме Fx(x) // В результате интервал неопределённости уменьшается и 
// его границы доступны в вызывающей программе. 
// Также «наверх» передаётся минимальное значение функции. 
 
extern double Fx(double); 
 
double  dx, x[4], f[4], xt, ft, dn, nm, tolerance=0.001; 
int j,k, s1, s2, s3; 
 dx = 0.05; // Шаг  
// Начать процесс с первых трёх точек x[0] = *a;       f[0] = Fx(x[0]); x[1] = *a + dx;  f[1] = Fx(x[1]); 
if (f[0] < f[1]) x[2] = *a - dx; else x[2] = *a + 2.0*dx; f[2] = Fx(x[2]); 
//Первый интерполированный минимум  dn = (x[1]-x[2])*f[0]; 
dn += (x[2]-x[0])*f[1] + (x[0]-x[1])*f[2];  nm = (x[1]*x[1]-x[2]*x[2])*f[0]; nm += (x[2]*x[2]-x[0]*x[0])*f[1]; nm += (x[0]*x[0]-x[1]*x[1])*f[2]; 
 
x[3] = nm /(2.0*dn); f[3] = Fx(x[3]); 
 
while(1) {//Бесконечный цикл интерполяции for (j = 0; j < 3; j++)     for (k = 0;k < 4; k++) { 
        if (f[j] > f[k] {//Упорядочить x и f             xt = x[j]; x[j] = x[k]; x[k] = xt;             ft = f[j]; f[j] = f[k]; f[k] = ft;         }//Конец оператора if(  ) 
    } // Конец циклов по j и k 
 
if (fabs(x[0]-x[1]) < tolerance) { 
    // Точность по величине интервала достигнута. 
    // Выход из цикла интерполяции.    goto EXIT_; 
} 
// Точность по интервалу не достигнута, 
// создаём новую точку 
s1 = sgn(x[1]-x[0]); //sng() =  1,  если скобки > 0 s2 = sgn(x[2]-x[0]); //sng() =  0,  если скобки = 0 s3 = sgn(x[3]-x[0]); //sng() = -1, если скобки < 0 if (s1 == s2 && s1 == (-s3)) {     x[2] = x[3];      f[2] = f[3]; 
} 
// Делаем вторую интерполяцию и  // переходим на упорядочивание 
dn = (x[1]-x[2])*f[0]+(x[2]-x[0])*f[1]+(x[0]x[1])*f[2]; 
ft  = (f[0]-f[1])/(2.0*dn); ft *= (x[1]-x[2])*(x[2]-x[0]); x[3] = (x[0]+x[1])/2.0 + ft;  f[3] = Fx(x[3]); 
 
}//Конец бесконечного цикла интерполяции 
 
EXIT_: 
*a = x[0];  *b = x[1];  return (f[0]); 
}
Вложения
Тип файла: zip картинка ошибки здесь.zip (42.1 Кб, 14 просмотров)
0
Just Do It!
 Аватар для XLAT
4211 / 2668 / 655
Регистрация: 23.09.2014
Сообщений: 9,082
Записей в блоге: 3
15.07.2019, 20:46
Цитата Сообщение от 410w Посмотреть сообщение
к сожалению, без "pch.h" проект не запускается.
pch.h не нужен!
Цитата Сообщение от 410w Посмотреть сообщение
картинка ошибки здесь.zip
добавить исследуемую функцию!

а для кого я постил:
Ошибка в программе С++
?

410w,
для вас же и постил
все компилится, запускается, но ошибка в самом коде реализующем алгоритм.
0
0 / 0 / 0
Регистрация: 30.05.2017
Сообщений: 17
15.07.2019, 23:03  [ТС]
Зависает при запуске у меня, так понимаю и у Вас. С этой проблемой разобраться я не в силах, алгоритм взят из книги, и вот как мог товарищ Данилин или чьих рук это дело, написать свой же алгоритм с ошибкой, не ясно..
А Вам спасибо за помощь)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.07.2019, 23:03
Помогаю со студенческими работами здесь

Ошибка в программе на C#
Помогите пожалуйста с ошибкой в программе на C#. Хочу представит ХП на удаление на C#, но выдает ошибку при нажатии кнопки в строке ...

Ошибка в программе
Доброе утро! Прошу у вас помощи с программой: не хочет работать. Буду очень благодарен за любую помощь! // ConsoleApplication1.cpp:...

Ошибка в программе
#include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;cstring&gt; using namespace std; class strtype { char* p; int len; ...

Ошибка в программе
Доброго времени суток. Только недавно начал пробовать что то ваять на С, пока все получалось до этого момента. #include...

Ошибка в программе
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;math.h&gt; #include &lt;omp.h&gt; #include &lt;time.h&gt; int main () { int i,j, N=1000; ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru