Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
silencerus
0 / 0 / 0
Регистрация: 02.12.2016
Сообщений: 11
#1

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

15.12.2016, 14:34. Просмотров 177. Ответов 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
Ответы с готовыми решениями:

Объясните пожалуйста одну строку в коде
Объясните пожалуйста . #include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std; void...

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

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

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

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

5
Nishen
458 / 281 / 154
Регистрация: 26.02.2015
Сообщений: 1,329
Завершенные тесты: 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
Модератор
Эксперт С++
7062 / 6606 / 4180
Регистрация: 18.12.2011
Сообщений: 17,410
Завершенные тесты: 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

Что делают строчки 29-47 в коде,объясните
//--------------------------------------------------------------------------- #include&lt;iostream.h&gt;...

Объясните что означает каждая строчка в коде
Создать класс, для хранения стека чисел – списка, организованного по принципу LIFO (последним...

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


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

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

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