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

Функции - C++

Восстановить пароль Регистрация
 
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
09.12.2013, 20:59     Функции #1
Добрый день!
Выполняю очередную лабу
Кодю недавно.

не могу сообразить, как реализовать функцию описанную ниже:
Кликните здесь для просмотра всего текста


вся лаборатория
Кликните здесь для просмотра всего текста



Мои попытки сделать что-то:
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <math.h>
#include <iomanip>
using namespace std;
 
double f (double x) //f(x)
    {
    return (pow(x,1.0/7.0)+log(x+0.3))/(sqrt(x+1)-1);
    }   
 
//double dihot (double r, double a, double b, double eps) // функция для нахождения корня методом дихотомии
 
    
 
//double rectangle (double a, double b, double eps,) // функция для нахождения площади фигуры методом прямоугольников с заданной точностью
 
int main()
{ 
setlocale(LC_ALL, "Russian"); // функция локализации вызывается только один раз
double  a, b, eps, r, h, c, x, y;
    cout<<" Введите Данные:"<< endl;
    cout<<" "<< endl;
 
do
    {
        cout<<" Введитеи интервал а:"<< endl; cin>>a;// интервал
        cout<<" Введите интервал b:"<< endl; cin>>b;// интервал
    }
while(a<0 || a>=1 || b<2 || b>=3 || a>=b);//проверка условий 
do
    {
        cout<<"Введите eps: "; //точность 
        cin>>eps;   
    } 
while (eps<0); //0.0001 < e < 0.1 (eps>0.1 || eps<0.0001);
system("cls");//очистка консоли
while (b - a > eps) 
    { 
        r=(a+b)/2;  //Вычислить значение с (точка разбиения отрезка) 
        if (f(a) * f(r)<0 )//f(b)*f(r)<0. • Выяснить, на каком из отрезков [a, r] или [r, b] находится корень (признаком наличия корня на отрезке [a, с] служит условие f(a)f(c)<0 
        b=r; // тогда границу b необходимо перенести в точку с
        else
        a=r;  // в противном случае корень находится на отрезке [с, b] и надо переносить точку a
    }
 
 
 
c=(a+b)/2;//Разделим отрезок [a; b] на n равных частей, т.е. на n элементарных отрезков.
x=a;
h=b-a/2; // Длина каждого элементарного отрезка
for(int i=0; i<=b;i++)
{
x+=a+(i-1)*h;
}
    
system("pause");
return 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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
#include <math.h>
#include <iomanip>
using namespace std;
 
double f (double x) //f(x)
    {
    return (pow(x,1.0/7.0)+log(x+0.3))/(sqrt(x+1)-1);
    }   
 
double dihot (double r, double a, double b, double eps) // функция для нахождения корня методом дихотомии
       {
              while (b - a > eps) 
                { 
        r=(a+b)/2;  //Вычислить значение с (точка разбиения отрезка) 
        if (f(a) * f(r)<0 )//f(b)*f(r)<0. • Выяснить, на каком из отрезков [a, r] или [r, b] находится корень (признаком наличия корня на отрезке [a, с] служит условие f(a)f(c)<0 
        b=r; // тогда границу b необходимо перенести в точку с
        else
        a=r;  // в противном случае корень находится на отрезке [с, b] и надо переносить точку a
            }
       }
 
//double rectangle (double a, double b, double eps,) // функция для нахождения площади фигуры методом прямоугольников с заданной точностью
 
int main()
{ 
setlocale(LC_ALL, "Russian"); // функция локализации вызывается только один раз
double  a, b, eps, h, c, x, y;
    cout<<" Введите Данные:"<< endl;
    cout<<" "<< endl;
 
do
    {
        cout<<" Введитеи интервал а:"<< endl; cin>>a;// интервал
        cout<<" Введите интервал b:"<< endl; cin>>b;// интервал
    }
while(a<0 || a>=1 || b<2 || b>=3 || a>=b);//проверка условий 
do
    {
        cout<<"Введите eps: "; //точность 
        cin>>eps;   
    } 
while (eps<0); //0.0001 < e < 0.1 (eps>0.1 || eps<0.0001);
system("cls");//очистка консоли
 
 
cout<<"корень"<<dihot; //допустим так просто вывести корень подсчитанный в функции  dihot
 
c=(a+b)/2;//Разделим отрезок [a; b] на n равных частей, т.е. на n элементарных отрезков.
x=a;
h=b-a/2; // Длина каждого элементарного отрезка
for(int i=0; i<=b;i++)
{
x+=a+(i-1)*h;
}
    
system("pause");
return 0;
}


Огромное спасибо тем, кто не оставляет без внимания этот пост. Стараемся как можем.

 Комментарий модератора 
Ознакомьтесь с правилами форума, в частности с пунктом 5.18.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.12.2013, 20:59     Функции
Посмотрите здесь:

C++ Найти среднее арифметическое значений функции f(x) в точках a, b, (a+b)/2 используя обращение к функции
Одномерный массив и функции (сделать 3 функции ввода/решения/вывода) C++
C++ Табулирование заданной функции и определение максимального и минимального значения функции в таблице
Вычислить m значений функции f(x) на отрезке [a, b]. Вычисление величины f(x) оформить в виде функции C++
Вычислить функции с использованием их разложения в степенной ряд. Функции и Перегрузка функций C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
10.12.2013, 12:28  [ТС]     Функции #2
Лабораторная работа:

Кликните здесь для просмотра всего текста

Краткие теоретические сведения.
Не все уравнения могут быть решены аналитически (то есть путём тождественных преобразований). В таких случаях используют численные методы, которые позволяют представляют собой алгоритм, позволяющий найти приближённое значение корня с некоторой наперёд заданной точностью. Рассмотрим несколько методов для нахождения корня функции f(x) = 0.
Метод половинного деления (или, что то же самое, метод дихотомии) рассмотрен в Лекции_2.
Метод хорд работает аналогично методу дихотомии, но отрезок [a, b] делится точкой с не пополам. Проведём хорду АВ, где А(а, f(a)), B(b, f(b)), а точка С(с, 0) получается при пересечении этой хорды с осью абсцисс. Формулу для с вывести нетрудно, используя уравнение прямой АВ и подставив в него у =0.
c=a-f(a)*b-a/f(b)-f(a)
И метод хорд, и метод половинного деления применимы при условии, что функция f(x) непрерывна на некотором отрезке[a, b] и принимает на границах значения разных знаков. В противном случае метод применять нельзя – может возникнуть либо зацикливание, либо получен неверный ответ.

Алгоритм уточнения значения локализованного корня функции f(x) на отрезке[a, b] с точностью 0<ε<1 (считаем, что функция отвечает поставленным выше условиям):

1. Задать a, b и точность ε.
2. Вычислить значение с (точка разбиения отрезка) в с соответствии требуемым методом.
3. Пока расстояние между точками a и b превышает заданную точность и f(c)≠0
• Выяснить, на каком из отрезков [a, с] или [с, b] находится корень (признаком наличия корня на отрезке [a, с] служит условие f(a)f(c)<0 , тогда границу b необходимо перенести в точку с, в противном случае корень находится на отрезке [с, b] и надо переносить точку a).
• Вычислить значение с для нового отрезка.
4. По окончании цикла сообщить значение с

Метод простых итераций состоит в том, что функция f(x) преобразуется к виду f(x) = g(x) – x , а уравнение f(x) = 0 заменяется эквивалентным уравнением x = g(x) . Взяв в качестве начального приближения некоторое , вычисляется , затем , и так далее до тех пор, пока . Для сходимости метода требуется, чтобы на отрезке [a, b], но, в случае сходимости метода решение получается за небольшое количество итераций, будем считать, что, если решение не получено за некоторое количество итераций (например, 20), то данный метод неприменим.

Алгоритм поиска корня функции f(x) с точностью 0<ε<1 (считаем, что функция отвечает поставленным выше условиям):
1. Задать начальное приближение x0 и точность ε.
2. Вычислить значение x = g(x0).
3. Пока расстояние между точками x и x0 превышает заданную точность
• Заменить старое значение x0 на только что вычисленное значение x.
• Вычислить значение x = g(x0).
4. По окончании цикла сообщить значение x

Также с использованием численных методов можно вычислять определённые интегралы . Рассмотрим метод прямоугольников и метод трапеций.
Метод прямоугольников основан на замене криволинейной фигуры ступенчатой.

График к задаче и формула интеграла:
Кликните здесь для просмотра всего текста
Функции


Для достаточно малого шага разбиения разницы между результатом вычисления по формулам нет, поскольку определённым интегралом называется предел интегральных сумм (частным случаем которых являются вышеприведённые формулы), не зависящий ни от способа разбиения интервала [a; b] на отрезки, не превышающие длины h, ни от выбора точки, в которой вычисляется значение функции f. Поэтому для того, чтобы вычислить интеграл с определённой степенью точности, необходимо уменьшать шаг разбиения (или, что то же самое, увеличивать количество точек разбиения). При этом для функции f, интегрируемой на отрезке [a; b], разность между очередной интегральной суммой S и предыдущим приближением S0 стремится к нулю. Таким образом, если , можно считать, что нужная точность вычислений достигнута.

При вычислении очередной интегральной суммы не следует выносить общий множитель h за скобки. Дело в том, при достаточно большом количестве точек разбиения n сумма может оказаться слишком велика и произойдёт вещественное переполнение.

В остальном принцип вычисления определённого интеграла с заданной точностью остаётся тем же самым.

Алгоритм вычисления площади криволинейной фигуры с заданной точностью:
1. Задать точность ε, пределы интегрирования a, b и первоначальное количество точек разбиения n.
2. Вычислить шаг разбиения .
3. Вычислить первоначальное приближение в соответствии с формулой (прямоугольников или трапеций) для заданного h (или для заданного n – особой разницы нет).
4. Следующее приближение S рассчитать по аналогичной формуле, увеличив количество точек разбиения n в 2 раза и вычислив новый шаг разбиения.
5. Пока делать
• Присвоить
• Рассчитать следующее приближение S, увеличив количество точек разбиения n в 2 раза и вычислив новый шаг.
6. По окончании цикла сообщить S

Задание на лабораторную работу
В таблице приведены выражения для f(x) в предположении, что решается уравнение f(x) = 0. Все уравнения предположительно имеют корни на отрезке [0, 2]:


Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
//формула f(x)
double f (double x) //f(x)
    {
    return (pow(x,1.0/7.0)+log(x+0.3))/(sqrt(x+1)-1);
    }


В программе следует:
1. Объявить и определить функции в соответствии с номером варианта и смыслом решаемой задачи
• f(x) или g(x)
• dihot(a, b, eps) функция для нахождения корня методом дихотомии
• hord(a, b, eps) функция для нахождения корня методом хорд
• iter(x, eps) функция для нахождения корня методом итераций
• rectangle(a, b, eps) функция для нахождения
или rectangle(a, b, n) интегральная сумма для n слагаемых
или rectangle(a, b, h) интегральная сумма для разбиения с шагом h
• trapeze(a, b, eps) функция для нахождения площади фигуры методом трапеций с заданной
точностью
или trapeze(a, b, n) сумма для n трапеций
или trapeze(a, b, h) сумма для трапеций с высотой h
Функция f(x) (или g(x)) в случае необходимости вызывается из функций dihot( ), hord( ), iter( ), rectangle( ), trapeze( ).
2. Найти такой отрезок [a, b] , на котором функция f(x) принимает значения разных знаков (см. Лекцию_2, при этом поиск начала и конца отрезка оформить также в виде функций);
в крайнем случае, убедиться, что на заданном с клавиатуры отрезке [a, b] функция принимает значения разных знаков;
3. Вычислить R – корень уравнения с заданной точностью (значение точности eps>0 снять с клавиатуры) в соответствии с номером варианта.
4. Выбрать из отрезков [a, R] и [R, b] тот, на котором функция f(x)>0 и найти площадь фигуры, ограниченной графиком функции f(x), осью абсцисс и прямой x = a (или x = b). Метод вычисления площади указан в номере варианта. При этом допустимо либо написать функцию, вычисляющую площадь фигуры с заданной точностью автоматически, либо написать соответствующую функцию для вычисления суммы.

В моем случаи:

1) Метод решения уравнения: дихотомии (или половинного деления)
2)Метод вычисления площади: прямоугольников
Объявить:
• f(x) или g(x)
• dihot(a, b, eps) функция для нахождения корня методом дихотомии
и получается • rectangle(a, b, eps) функция для нахождения площади фигуры методом прямоугольников с заданной точностью

Критерии оценивания работы

В таблице приведены критерии, по которым студент может оценить свою работу.
Наличие логических ошибок, например:
 при подстановке значения корня, полученного в результате работы программы, в уравнение, получается значение, отличающееся от нуля на величину, превышающую 
 вычисленный корень не принадлежит интервалу [0, 2]
 отрицательное или слишком большое значение при вычислении интеграла
 зацикливание программы или возникновение ошибки времени выполнения

Объявлены и определены функции
f(x) или g(x)
dihot(a, b, eps) hord(a, b, eps) или iter(x, eps) (в зависимости от варианта)
rectangle( ) или trapeze( ) (в зависимости от варианта )
функция поиска интервала, на котором содержится корень (не обязательно! Но желательно)


Я попробовал сделать, но что-то не получается. Запутался. Вообще не знаю правильно ли я сделал.

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
#include <iostream>
#include <math.h>
#include <iomanip>
using namespace std;
 
double f (double x) //f(x)
    {
    return (pow(x,1.0/7.0)+log(x+0.3))/(sqrt(x+1)-1);
    }   
 
//double dihot (double r, double a, double b, double eps) // функция для нахождения корня методом дихотомии
    
 
//double rectangle (double a, double b, double eps,) // функция для нахождения площади фигуры методом прямоугольников с заданной точностью
 
    
 
 
 
 
int main()
{ 
setlocale(LC_ALL, "Russian"); // функция локализации вызывается только один раз
int n;
double  a, b, eps, r, h, y, intg=0,*x;
    cout<<" Данные по варианту:"<< endl;
    cout<<" "<< endl;
    cout<<" В таблице приведены выражения для f(x) в предположении, что решается уравнение f(x) = 0. "<< endl; 
    cout<<" Все уравнения предположительно имеют корни на отрезке [0, 2] [a, b]:"<< endl;
    cout<<" Метод Решения уравнения: Дихотомии dihot(a, b, eps) "<< endl;
    cout<<" Метод вычисления площади: Прямоугольников rectangle(a, b, eps) "<< endl;
    cout<<" "<< endl;
    cout<<" f(x) = (pow(x,1.0/7.0)+log(x+0.3))/sqrt(x+1)-1 "<< endl;
    cout<<" "<< endl;
    cout<<" Eps близкое к нулю положительное число, например, 0.1, 0.01, 0.001, 0.0001"<< endl;
 
    cout<<" "<< endl;
    cout<<" Введите Данные:"<< endl;
    cout<<" "<< endl;
do
    {
        cout<<"Введите n: "; //точность 
        cin>>n; 
    } 
while (n<1); 
do
    {
        cout<<" Введитеи интервал а:"<< endl; cin>>a;// интервал
        cout<<" Введите интервал b:"<< endl; cin>>b;// интервал
    }
while(a<0 || a>=1 || b<2 || b>=3 || a>=b);//проверка условий 
do
    {
        cout<<"Введите eps (Точность): "; //точность 
        cin>>eps;   
    } 
while (eps<0); //0.0001 < e < 0.1 (eps>0.1 || eps<0.0001);
system("cls");//очистка консоли
while (b - a > eps) 
    { 
        r=(a+b)/2;               //Вычислить значение с (точка разбиения отрезка) 
        if (f(a) * f(r)<0 )     //f(b)*f(r)<0. •    Выяснить, на каком из отрезков [a, r] или [r, b] находится корень (признаком наличия корня на отрезке [a, с] служит условие f(a)f(c)<0 
        b=r;                    // тогда границу b необходимо перенести в точку с
        else
        a=r;                    // в противном случае корень находится на отрезке [с, b] и надо переносить точку a
    }
 
 
int i;
h=b-a/n;  // Длина каждого элементарного отрезка
for(i=1,x[0]=a+(b-a)/(2*n);i<n;i++) //Заполняем массив коорднат x
  x[i] = x[i-1]*h;
  
y=f(x[i]); // присваиваем y=f(x)
 
//вычисляем интеграл
 for(i=0;i<=n;i++)
      intg +=((y) * (h));
 
 cout<<""<<r<<endl;
 cout<<""<<intg<<endl;
 
system("pause");
return 0;
}
я конечно пытался еще сделать так, но не работает. прошу сного совета
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
double dihot (double r, double a, double b, double eps) // функция для нахождения корня методом дихотомии
    {
while (b - a > eps) 
    { 
        r=(a+b)/2;               //Вычислить значение с (точка разбиения отрезка) 
        if (f(a) * f(r)<0 )     //f(b)*f(r)<0. •    Выяснить, на каком из отрезков [a, r] или [r, b] находится корень (признаком наличия корня на отрезке [a, с] служит условие f(a)f(c)<0 
        b=r;                    // тогда границу b необходимо перенести в точку с
        else
        a=r;                    // в противном случае корень находится на отрезке [с, b] и надо переносить точку a
    }
         }
 
//double rectangle (double a, double b, double eps,) // функция для нахождения площади фигуры методом прямоугольников с заданной точностью
// тут еще не думал как.
Мне конечно все нужно по сути сделать в функциях.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
10.12.2013, 21:12     Функции #3
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
double dihot (double r, double a, double b, double eps) // функция для нахождения корня методом дихотомии
* * * *{
* * * * * * * while (b - a > eps) 
* * * * * * * * { 
* * * * r=(a+b)/2; *//Вычислить значение с (точка разбиения отрезка) 
* * * * if (f(a) * f(r)<0 )//f(b)*f(r)<0. • Выяснить, на каком из отрезков [a, r] или [r, b] находится корень (признаком наличия корня на отрезке [a, с] служит условие f(a)f(c)<0 
* * * * b=r; // тогда границу b необходимо перенести в точку с
* * * * else
* * * * a=r; *// в противном случае корень находится на отрезке [с, b] и надо переносить точку a
* * * * * * }
* * * *}
Для начала неплохо было бы, чтобы функция что-то возвращала после выполнения, на то она и функция.))

Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
cout<<"корень"<<dihot; //допустим так просто вывести корень подсчитанный в функции *dihot
А вот так вот нельзя, у Вас dihot объявлена как функция, да еще принимающая аж 4 аргумента. Они все должны быть перечислены в круглых скобках.
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
11.12.2013, 13:08  [ТС]     Функции #4
Цитата Сообщение от kazak Посмотреть сообщение
Для начала неплохо было бы, чтобы функция что-то возвращала после выполнения, на то она и функция.))


А вот так вот нельзя, у Вас dihot объявлена как функция, да еще принимающая аж 4 аргумента. Они все должны быть перечислены в круглых скобках.
ДОБРЫЙ ДЕНЬ! Спасибо огромное, что не оставляете этот пост без внимания.

Если я правильно понимаю, то должно быть так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
double dihot (double r, double a, double b, double eps) // функция для нахождения корня методом дихотомии
    {
    while (b - a > eps) 
            { 
                r=(a+b)/2; //Вычислить значение с (точка разбиения отрезка) 
                if (f(b)*f(r)<0) //(f(a) * f(r)<0 ) • Выяснить, на каком из отрезков [a, r] или [r, b] находится корень (признаком наличия корня на отрезке [a, с] служит условие f(a)f(c)<0 
                b=r; // тогда границу b необходимо перенести в точку с
                else
                a=r; // в противном случае корень находится на отрезке [с, b] и надо переносить точку a
                return a; // получается, если а=р возвращаем а
            }
    return b; // иначе всегда возвращается б
    }
С остальным вычислением пока не разобрался. Корень вычисляется. осталось реализовать вычисление площади прямоугольника.
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
11.12.2013, 14:06  [ТС]     Функции #5
Цитата Сообщение от kazak Посмотреть сообщение
Для начала неплохо было бы, чтобы функция что-то возвращала после выполнения, на то она и функция.))

А вот так вот нельзя, у Вас dihot объявлена как функция, да еще принимающая аж 4 аргумента. Они все должны быть перечислены в круглых скобках.
Я наверно был не прав в прошлом посту.
Должно быть по другому.
если опираться на это:
Кликните здесь для просмотра всего текста


1.3. Метод половинного деления

Метод половинного деления применяется для уточнения корня на выделенном участке , где этот корень является единст- венным . Это один из простых методов нахождения корней не- линейных уравнений . Метод заключается в следующем . Отрезок [ a, b ], на котором существует точка пересечения графика функции f (x) с осью Ох , делят пополам ( рис 1.5.). Полученное значение х1= ( a + b)/2
Рис . 1.5. Геометрическая иллюстрация метода половинного деления принимают в качестве начального приближения , и вычисляют значение функции f (x1), при этом , если f(x 1) ≠ 0, то выбирают тот из подынтервалов [ a, x1 ] или [ x1, b], на концах которого функ- ция f (x) имеет противоположные знаки . На рис . 1.5. этим отрез- ком будет [ a,x 1]. Полученный отрезок переименовывают в [ a, b] и снова делят пополам , затем проводят тот же анализ , что и при первоначаль- ном делении . Деления сужающего отрезка , проверку и выбор повторяют до тех пор , пока длина отрезка , на концах которого функция имеет противоположные знаки , не станет меньше за- данной точности вычислений ε . Проверку условия противопо- ложности знаков функций выполняют посредством неравенства f (a) ⋅ f (x) ≤ 0, а условия остановки вычислений – путем провер- ки неравенства b – а≤ ε .

Рис .1.6. Блок -схема алгоритма метода половинного деления


Функции

Можно также проводить оценку значений функции f (x) после каждой i -й итерации , пока одно из них по модулю не станет меньше заданного числа ε , т.е.  f (xi)  < ε . Блок -схема алгоритма метода половинного деления изобра- жена на рис . 1.6. Здесь сужение отрезка проводится путем за- мены границы a или b на текущее приближенное значение кор- ня х. Метод половинного деления прост и очень надежен . Он схо- дится для любых непрерывных функций . Недостатком метода половинного деления является медлен- ная сходимость вычислительного процесса . Следовательно , метод половинного деления целесообразно применять , когда требуется высокая надежность счета , а ско- рость сходимости несущественна .



Но если я делаю как по теории, то программа "стоит":

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
double dihot (double r, double a, double b, double eps) // функция для нахождения корня методом дихотомии
    {
        
        do
            { 
                r=(a+b)/2; //Вычислить значение с (точка разбиения отрезка
                if (f(r)*f(a)>0) //все таки здесь наверно больше нуля.
                a=r; // тогда границу b необходимо перенести в точку с
                else
                b=r; // тогда границу b необходимо перенести в точку с, в противном случае корень находится на отрезке [с, b] и надо переносить точку a). Вычислить значение с для нового отрезка.
            }
        while (abs(b - a) <eps);        
        return r;
    }
А вот так вроде считает:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
double dihot (double r, double a, double b, double eps) // функция для нахождения корня методом дихотомии
    {
        
        do
            { 
                r=(a+b)/2; //Вычислить значение с (точка разбиения отрезка
                if (f(r)*f(a)>0) //все таки здесь наверно больше нуля.
                a=r; // тогда границу b необходимо перенести в точку с
                else
                b=r; // тогда границу b необходимо перенести в точку с, в противном случае корень находится на отрезке [с, b] и надо переносить точку a). Вычислить значение с для нового отрезка.
            }
        while (abs(b - a) > eps);       // т.е. если(abs(b - a) < eps) прога висит
        return r;
    }
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
11.12.2013, 16:48  [ТС]     Функции #6
Мой итог:
функция для нахождения корня методом дихотомии. Правда все еще не уверен верно ли.
Кликните здесь для просмотра всего текста



C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
double dihot (double a, double b, double eps) // функция для нахождения корня методом дихотомии
    {
        double r;
        do
            { 
                r=(a+b)/2; //Вычислить значение с (точка разбиения отрезка
                if (f(r)*f(a)>0) //все таки здесь наверно больше нуля.
                a=r; // тогда границу b необходимо перенести в точку с
                else
                b=r; // тогда границу b необходимо перенести в точку с, в противном случае корень находится на отрезке [с, b] и надо переносить точку a). Вычислить значение с для нового отрезка.
            }
        while (abs(b - a) > eps);       
        return r;
    }


И функция для нахождения площади фигуры методом прямоугольников с заданной точностью.
С ней немного не уверен, хотелось бы услышать советов. или подправили если не так.

Кликните здесь для просмотра всего текста

Первая попытка сделать, кажется совсем не в том направлении пошел.
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
double rectangle (double n, double a, double b, double eps) // точно не так 
    {
        double h, x0, s, x;
        do 
            {
                int i;
                h=(b-a)/n;
                s=0; 
                x0=a;
                for (i=0; i<n-1;i++)
                x=x0+i*h; 
                s=s+f(x)*h;
            } 
            while (s-s<eps);
        return s;
    }
 
/*
    Разделим отрезок [a; b] на n равных частей, т.е. на n элементарных отрезков. Длина каждого элементарного отрезка  . 
    Точки деления будут: x0=a; x1=a+h; x2=a+2пѓ— h, ... , xn-1=a+(n-1)пѓ— h; xn=b. Эти числа будем называть узлами. 
    Вычислим значения функции f(x) в узлах, обозначим их y0, y1, y2, ... , yn. То есть, y0=f(a), y1=f(x1), y2=f(x2), ... , yn=f(b). Числа y0, y1, y2, ... , yn являются ординатами точек графика функции, 
    соответствующих абсциссам x0, x1, x2, ... , xn. Площадь криволинейной трапеции приближенно заменяется площадью многоугольника, составленного из n прямоугольников. 
    Таким образом, вычисление определенного интеграла сводится к нахождению суммы n прямоугольников
    */
А вот вторая, считает, но опять же я не уверен.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
double rectangle (double n, double a, double b, double eps) //Второй. функция для нахождения площади фигуры методом прямоугольников с заданной точностью
        {
            double h, S, S0;
            do
                {
                    int i;
                    h=(b-a)/n;      
                    S=0;
                    for (i=1; i<=(n-1); i++)
                        {
                            S=S+f(a+h*i);
                            S0=S; 
                        //  n=n*2; //Рассчитать следующее приближение S, увеличив количество точек разбиения n в 2 раза и вычислив новый шагКак это сделать? или я уже вообще запутался.
                        }
                }
            while(S0-S>=eps);// Пока S0-S>=eps  делать   •  Присвоить  S0=S; •  Рассчитать следующее приближение S, увеличив количество точек разбиения n в 2 раза и вычислив новый шаг. 6. По окончании цикла сообщить S
            
            return S; 
        }
Еще одно не понятное, (S0-S<eps) не считает программа весит (по задания вроде мне нужно именно так проверять) т.к. (S0-S>=eps) это вроде для трапеции.

Спасибо всем, кто не оставляет без внимания пост.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
11.12.2013, 16:52     Функции #7
В Вашей блок-схеме цикл выполняется пока условие ложно, в Си - всегда пока условие истинно.
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
11.12.2013, 16:56  [ТС]     Функции #8
Цитата Сообщение от kazak Посмотреть сообщение
В Вашей блок-схеме цикл выполняется пока условие ложно, в Си - всегда пока условие истинно.
т.е. оно у меня изначально не истинно.
не совсем понимаю что исправить.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
11.12.2013, 20:45     Функции #9
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
Но если я делаю как по теории, то программа "стоит":
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
while (abs(b - a) <eps);
В Си выражение в скобках означает условие выполнения цикла, которое должно быть истинным, чтобы цикл продолжался.
В блок-схеме же условиеам для продолжения цикла может быть как истинность какого-либо выражения, так и его ложность. В Вашем варианте условие для продолжения цикла должно быть ложным, поэтому простое копирование "теории" не дало нужный результат.
Функции
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
11.12.2013, 20:58     Функции #10
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
функция для нахождения корня методом дихотомии. Правда все еще не уверен верно ли.
Одно замечание, для нахождения модуля вещественного числа используется функция fabs().
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
А вот вторая, считает, но опять же я не уверен.
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
C++
1
2
3
4
5
6
for (i=1; i<=(n-1); i++)
* * * * * * * * * * * * {
* * * * * * * * * * * * * * S=S+f(a+h*i);
* * * * * * * * * * * * * * [U]S0=S;[/U] 
* * * * * * * * * * * * //* [U]n=n*2;[/U] //Рассчитать следующее приближение S, увеличив количество точек разбиения n в 2 раза и вычислив новый шагКак это сделать? или я уже вообще запутался.
* * * * * * * * * * * * }
C++
1
2
3
4
5
6
S0 = S;
for (int i = 0; i < n; i++)
{
   S = S +f(a+h*i)*h;
}
n = n*2;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2013, 17:45     Функции
Еще ссылки по теме:

Написать три функции, которые будут вызываться из функции main() C++
C++ Вычисление функции на заданном промежутке, и построение графика этой функции

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

Или воспользуйтесь поиском по форуму:
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
13.12.2013, 17:45  [ТС]     Функции #11
Цитата Сообщение от kazak Посмотреть сообщение
Одно замечание, для нахождения модуля вещественного числа используется функция fabs().


C++
1
2
3
4
5
6
S0 = S;
for (int i = 0; i < n; i++)
{
   S = S +f(a+h*i)*h;
}
n = n*2;
Спасибо за советы. Все поправлю. Надеюсь на дальнейшую помощь.
+ в рейтинг
Yandex
Объявления
13.12.2013, 17:45     Функции
Ответ Создать тему
Опции темы

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