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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
silencerus
0 / 0 / 0
Регистрация: 02.12.2016
Сообщений: 11
#1

Объясните строку в коде - C++

15.12.2016, 14:34. Просмотров 163. Ответов 5
Метки нет (Все метки)

Здравствуйте.
Написал программу для нахождения корня методом золотого сечения. Меня интересует 1 вопрос в самом методе: строка if ((f(a+hb)*f(a+ha))<0) и собственно если больше нуля (т.е f(a)*f(b)<0 или >0) - что это значит? Читал, что если умножение значений функций меньше нуля, то это значит, что значения функции на концах отрезка отрицательные(1 отрицательное) и тогда корень лежит в промежутке этого отрезка. А что тогда значит если при умножении больше 0? Или тут совсем другой смысл.
Объясните кому не трудно...


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
#include "stdafx.h"
#include <math.h>
#include <iostream>
using namespace std;
 
//Функция
double f(double x) { 
 return 3*x*x-2;
}
int main() {
 double golden = 1.618; // "Золотое" число
 int n=0;
 double a,b,eps; //координаты и точность вычислений
 double h,ha,hb; 
 cout<<"Vvedite granici otrezka\n";
    cout<<"a="; cin>>a;
    cout<<"b="; cin>>b;
    cout<<"eps="; cin>>eps;
 h=b-a;
 while ((fabs(b - a)) > eps)
 {
 ha=h/golden;
 hb=ha/golden;
 if ((f(a+hb)*f(a+ha))<0) 
 { 
  a=a+hb;
  b=(a-hb)+ha;
  h=b-a;
 }
 else 
 {
  b=b-hb;
  a=(b+hb)-ha;
  h=ha-hb; 
 }
 
 } // Выполняем, пока не достигнем заданной точности
 cout<<"Zolotoe sechenie:\n";
 cout << "(" << (a + b) / 2 << ")"; 
 system("pause");
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.12.2016, 14:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Объясните строку в коде (C++):

Объясните пожалуйста одну строку в коде - C++
Объясните пожалуйста . #include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std; void mystrcat(char *s1,char *s2,int...

Объясните строчку в коде - C++
#include &lt;iostream&gt; using namespace std; class Node{ public: int data; Node * next; Node *prev; ...

Объясните суть ссылок и указателей в коде - C++
Всем добрый день! В общем, есть код (не судите, что примера попроще я не подобрал, просто подумал, что лучше я спрошу прям на деле),...

Объясните, как понять строчку в коде - C++
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; #include &lt;locale.h&gt; #define M 1000 int versh, ves, nov_ves,...

Объясните значение трёх строк в коде - C++
DWORD* vtablePtr; //вот здесь, знак '*' обозначает, что это указатель? vtablePtr = (PDWORD)(*((PDWORD)d3dDevice)); //Это вроде...

Объясните в чем заключаются ошибки в приведенном коде - C++
Объясните в чем заключаются ошибки в приведенном коде... class table { int size; int priority; public: table(int s = 0,...

5
Nishen
453 / 264 / 84
Регистрация: 26.02.2015
Сообщений: 1,236
Завершенные тесты: 2
15.12.2016, 14:34 #2
Цитата Сообщение от silencerus Посмотреть сообщение
Написал программу
Вы ведь сами писали? Откуда вопросы тогда?
0
silencerus
0 / 0 / 0
Регистрация: 02.12.2016
Сообщений: 11
15.12.2016, 18:11  [ТС] #3
Ну я написал по алгоритму, который нашел и естественно не понял весь метод...

Добавлено через 3 часа 31 минуту
Помогите кто-нибудь с данной проблемой...
0
zss
Модератор
Эксперт С++
6687 / 6249 / 2084
Регистрация: 18.12.2011
Сообщений: 16,321
Завершенные тесты: 1
15.12.2016, 19:24 #4
Цитата Сообщение от silencerus Посмотреть сообщение
(f(a+hb)*f(a+ha))<0
Если значения функций имеют разные знаки, то, соответственно, произведение будет отрицательным,
иначе положительным.
0
silencerus
0 / 0 / 0
Регистрация: 02.12.2016
Сообщений: 11
15.12.2016, 19:35  [ТС] #5
Ну я понимаю это. Вот например 3 итерации:
Кликните здесь для просмотра всего текста
h = 2 - 0 = 2
Итерация N1.
ha = 2 / 1.618 = 1.236
hb = 1.236 / 1.618 = 0.764
F(a) = F(0+0.764) = -0.249
F(b) = F(0+1.236) = 2.584
Поскольку F(a)*F(b) < 0, то a = 0 + 0.764 = 0.764
b = 0 + 1.236 = 1.236
h = 1.236 - 0.764 = 0.472
Итерация N2.
ha = 0.472 / 1.618 = 0.292
hb = 0.292 / 1.618 = 0.18
F(a) = F(0.764+0.18) = 0.675
F(b) = F(0.764+0.292) = 1.344
Поскольку F(a)*F(b) >= 0, то b = 1.236 - 0.18 = 1.056
a = 1.236 - 0.292 = 0.944
h = 0.292 - 0.18 = 0.111
Итерация N3.
ha = 0.111 / 1.618 = 0.0689
hb = 0.0689 / 1.618 = 0.0426
F(a) = F(0.944+0.0426) = 0.922
F(b) = F(0.944+0.0689) = 1.08
Поскольку F(a)*F(b) >= 0, то b = 1.056 - 0.0426 = 1.013
a = 1.056 - 0.0689 = 0.987
h = 0.0689 - 0.0426 = 0.0263

В 1 итерации if F(a)*F(b)<0 а в 2 других >0 -- так вот что это значит? Итерации продолжаются так и так.
0
Duff_Beer
0 / 0 / 0
Регистрация: 13.01.2016
Сообщений: 9
15.12.2016, 20:37 #6
Теперь меня тоже интересует данный вопрос
0
15.12.2016, 20:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2016, 20:37
Привет! Вот еще темы с ответами:

Полиндром: найдите ошибку в коде рекурсии и объясните - C++
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; bool palindrome(string *m, int i, int j) { if( i==j || i&gt;j) ...

Объясните, зачем в коде нужен явный конструктор копирования - C++
Добрый день, хочу понять код, почему тут обезательно надо явный конструктор копирования? #include &lt;iostream&gt; using namespace...

Объясните что именно делает функция даном коде - C++
Помогите пожалуйста. Я не могу понять что делает функция которая стоит вначале моего кода, точнее я немогу понять почему там k&lt;=N/2. Ниже...

Объясните, для чего нужны некоторые строчки в коде(using namespace, new, int main) - C++
#include &lt;iostream&gt; using namespace std; //для чего эта строчка int main(void) // что нужно изменить чтобы было void main() { ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru