Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2016, 14:47   #1
Alexandr-
Пользователь
 
Регистрация: 04.03.2013
Сообщений: 79
По умолчанию Объясните строку в коде

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

Код:
#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;
}
Alexandr- вне форума Ответить с цитированием
Старый 15.12.2016, 14:57   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Читал, что если умножение значений функций меньше нуля, то это значит, что значения функции на концах отрезка отрицательные(1 отрицательное) и тогда корень лежит в промежутке этого отрезка. А что тогда значит если при умножении больше 0? Или тут совсем другой смысл.
Смотрю в книгу, вижу фигу... Ну как они могут быть на концах отрицательными, если их произведение то же отрицательное...

Включаем простейшую логику:
Если произведение значений функции на концах отрицательное, значит одно из них положительное, второе отрицательно. Тут умные слова про локальность, монотонность и т.д. Но вам хватит бытового понимания, что если на концах разный знак, то где-то между уж точно должно быть равно 0. А это и значит, что корень там.

Про положительность, учитывая все те же умные слова, можно сказать, что корня там нет.
p51x вне форума Ответить с цитированием
Старый 15.12.2016, 15:17   #3
Alexandr-
Пользователь
 
Регистрация: 04.03.2013
Сообщений: 79
По умолчанию

Ну я ведь подписал что там 1 отрицательный. Вот 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
Во 2 и 3 итерации F(a)*F(b)>0 но все равно считается дальше и ищется корень...
Alexandr- вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MatLab. Объясните, пожалуйста, места в коде Shouldercannon Помощь студентам 2 14.12.2014 22:55
Скрыть строку в коде (модуле) ольгаг Microsoft Office Excel 4 16.10.2012 18:15
Объясните ошибку в коде AceDragon Visual C++ 8 20.02.2012 14:49
Объясните строку serres Общие вопросы C/C++ 1 02.12.2010 06:32
Объясните ошибку в коде Skorpion555 Помощь студентам 2 28.02.2010 17:45