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

Функции - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Работа с файлами http://www.cyberforum.ru/cpp-beginners/thread1034963.html
Сформировать файл из чисел последовательности (–1)^(k)*0.3^(k)/(k + 1). Найти сумму наибольшего и наименьшего из значений компонентов файла
C++ Вывести статистику из массива структур Вот в чём нужно помочь : Создать программу учета сотрудников. О сотруднике необходимо хранить следующие данные: - ФИО - должность - дата рождения. Данные о сотрудниках следует хранить в массиве структур http://www.cyberforum.ru/cpp-beginners/thread1034962.html
C++ Построить массив только из значений, входящих в исходный более одного раза
Задан произвольный массив. Исходная информация записана в файле. Построить массив только из значений, входящих в него более одного раза.
Удалить все символы "*", а символы, не являющиеся "*", удвоить C++
Составить программу, которая вводит строку символов, выполняет ее обработку и затем выво- дит результаты. Удалить все символы "*", а символы, не являющиеся "*", удвоить
C++ Одномерный массив http://www.cyberforum.ru/cpp-beginners/thread1034951.html
помогите пожалуйста) в с++ совсем не бум-бум) Одномерный массив B и преобразовать его следующим образом: 1) увеличить каждый элемент массива на максимальный элемент 2) найти индекс и значение последнего минимального элемента массива 3) отсортировать элементы массива по убыванию заранее спасибо всем!!)))
C++ Обработка массивов с использованием подпрограмм Составить программу для решения задачи. Каждый элемент матрицы A(3,3) разделить на произведение ее не- четных отрицательных элементов подробнее

Показать сообщение отдельно
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
10.12.2013, 12:28  [ТС]     Функции
Лабораторная работа:

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

Краткие теоретические сведения.
Не все уравнения могут быть решены аналитически (то есть путём тождественных преобразований). В таких случаях используют численные методы, которые позволяют представляют собой алгоритм, позволяющий найти приближённое значение корня с некоторой наперёд заданной точностью. Рассмотрим несколько методов для нахождения корня функции 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,) // функция для нахождения площади фигуры методом прямоугольников с заданной точностью
// тут еще не думал как.
Мне конечно все нужно по сути сделать в функциях.
 
Текущее время: 22:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru