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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.95
Buiucliu
6 / 6 / 1
Регистрация: 06.05.2012
Сообщений: 18
#1

Вычислить с заданной точностью значение функции - C++

24.08.2012, 12:02. Просмотров 2877. Ответов 21
Метки нет (Все метки)

вот такая задачка...
0
Миниатюры
Вычислить с заданной точностью значение функции  
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2012, 12:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вычислить с заданной точностью значение функции (C++):

Вычислить с заданной точностью значение заданной комплексной функции - C++
Не могу составить алгоритм. Уже 2 дня мучаюсь и ищу материал. Вот, собственно, задачка: Даны комплексное число z (пара вещественных...

Вычислить с заданной точностью значение функции - C++
помогите пожалуйста справиться с заданием..скоро надо сдавать Вычислить с заданной точностью значение функции , используя ее разложение в...

Вычислить значение функции sh(x) с заданной точностью - C++
программа должна вычислять значение функции sh(x) действительного аргумента x с точностью ε с использованием рекурсии

Вычислить с заданной точностью значение функции - C++
вот такая задачка..

Вычислить с заданной точностью значение функции y=f(x) - C++
Вычислить с заданной точностью значение функции y=f(x), используя ее разложение в ряд: y=arth x=1/2ln1+x/1-x=x+x^3/3+x^3/5+..., для |x|<1...

Что значит вычислить значение функции с заданной точностью? - C++
Например, дана функция cosx/x и какая-либо точность. Как вычислить значение функции с заданной точностью? Нужен скорее не сам код (но для...

21
Bomg
2 / 2 / 0
Регистрация: 04.10.2009
Сообщений: 51
24.08.2012, 12:04 #2
Цитата Сообщение от Buiucliu Посмотреть сообщение
вот такая задачка...
Это я так понял общее задание, а должен быть твой вариант с функцией и точностью.
0
Пaтрик
416 / 391 / 39
Регистрация: 21.01.2012
Сообщений: 972
Завершенные тесты: 1
24.08.2012, 16:59 #3
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
#include <iostream>
#include <iomanip>
#include <cmath>
 
size_t fact(size_t num)
{
    if (num == 0)
        return 1;
    return num * fact(num - 1);
}
 
int main()
{
    const double e = 1e-15;
    const double x = 0.5;
    bool f = true;
    double y = 1.0;
    double v1 = y;
    double v2 = v1;
    size_t denom = 2;
    do
    {
        v2 = y;
        v1 = std::pow(x, (double)denom) / fact(denom);
        denom += 2;
        y += f ? -v1 : v2;
        f != f;
    }
    while (std::abs(v2 - y) > e);
    std::cout << std::setprecision(15) << y << std::endl;
    std::cout << std::cos(x) << std::endl;
}
Вычислить с заданной точностью значение функции
1
-=ЮрА=-
Заблокирован
Автор FAQ
25.08.2012, 15:46 #4
Buiucliu, решать задание рациональней с помощью итератора а не прямого вычисления по формуле (в случае вычисления факториала для каждого значения вы замедляете алгоритм в n! раз, где n - число элементов разложения которого вы достигнете)
Ниже быстрая версия алгоритма
Расчёт итератора
http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{n} ={(-1)}^{n}*\frac{{x}^{2*n}}{(2*n)!}
http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{n + 1} ={(-1)}^{n + 1}*\frac{{x}^{2*(n + 1)}}{(2*(n + 1))!}
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{{a}_{n + 1}}{{a}_{n}} = \frac{{(-1)}^{n + 1}*\frac{{x}^{2*n + 2}}{(2*n + 2)!}}{{(-1)}^{n}*\frac{{x}^{2*n}}{(2*n)!}} = (-1)*\frac{{x}^{2}}{(2*n + 1)*(2*n + 2)}
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
#include <cmath>
#include <iomanip>
#include <iostream>
using namespace std;
 
double cosx(double x, double e)
{
    double sum = 0;
    double   n = 0;
    for(double  an = 1; e < fabs(an); n = n + 1)
    {
        sum += an;
        an  *= (-1)*pow(x,2.0)/((2*n + 1)*(2*n + 2));
    }
    return sum;
}
 
int main()
{
    double xn, xk, dx, e;
    cout<<"xn = ";cin>>xn;
    cout<<"xk = ";cin>>xk;
    cout<<"dx = ";cin>>dx;
    cout<<" e = ";cin>>e;
    cout<<"  x\t|  cosx  | cmath\n";
    for(double x = xn; x <= xk; x += dx)
    {
        cout<<setprecision(5)<<setw(7)<<setfill(' ')<<x<<"\t|"
            <<setprecision(5)<<setw(7)<<setfill(' ')<<cosx(x, e)<<" |"
            <<setprecision(5)<<setw(7)<<setfill(' ')<<cos(x)<<endl;
    }
    return 0;
}
0
Миниатюры
Вычислить с заданной точностью значение функции  
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
25.08.2012, 16:21 #5
-=ЮрА=-, правильно говорите, это и очевидно, что для быстрого вычисления нельзя забывать информацию предыдущего шага. Но ваш алгоритм тоже небезупречен, вычислите, например
cosx(1000, 1e-10)
cosx(10000, 1e-10)
Все сразу падает.
Поскольку функция cos периодическая, то сначала необходимо привести аргумент в полуинтервал http://www.cyberforum.ru/cgi-bin/latex.cgi?[0,2\pi), а потом вызывать функцию cosx.
0
-=ЮрА=-
Заблокирован
Автор FAQ
25.08.2012, 16:24 #6
Thinker, разложение для ряда тейлора действует для значений аргумента по модулю меньших единицы и вызывая cosx(1000, 1e-10), т.е. х = 1000 нарушаем условие корректности разложения!
Мой алгоритм максимально быстр (конечно на асме было бы быстрей, т.е. масимум скорости для плюсов) и рабоатет в рамках допустимых значений аргумента, за всё остальное как говорится я ответсвенности не несу
0
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
25.08.2012, 16:27 #7
-=ЮрА=-, ничего подобного, данный ряд сходится на всей числовой оси, поэтому можно смело подставлять в него любые значения, только в силу ограниченности диапазона переменных, необходимо их приводить к указанному полуинтервалу. А по модулю < 1 это ln x. Указанный ряд для косинуса мало того сходится в каждой точке числовой оси, он еще и равномерно сходится на любом отрезке.
0
-=ЮрА=-
Заблокирован
Автор FAQ
25.08.2012, 16:30 #8
Thinker, то о чём я написал
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
разложение для ряда тейлора действует для значений аргумента по модулю меньших единицы
проявляется в отклонении от истинных значений функции при увеличении значения аргумента свыше 1-цы (по модулю) - т.е. чем больше модуль тем больше ошибка разложения. (тут уже не важно что ряд сходиться , его сумма начинает некорректно описывать функцию)
0
Миниатюры
Вычислить с заданной точностью значение функции  
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
25.08.2012, 16:34 #9
-=ЮрА=-, не верить мне ваше право, верьте математике, cos x это аналитическая функция, то есть соответствующий ряд сходится в каждой точке комплексной! плоскости.
0
-=ЮрА=-
Заблокирован
Автор FAQ
25.08.2012, 16:46 #10
Thinker, причём тут сходится
Цитата Сообщение от Thinker Посмотреть сообщение
=ЮрА=-, не верить мне ваше право, верьте математике, cos x это аналитическая функция, то есть соответствующий ряд сходится в каждой точке комплексной! плоскости.
я говорю о том, что разложение имеет свою область применимость касательно модуля аргумента. А уже не верить мне или верить это дело сугубо личное...
Иначе как опровергнуть результат отработки - тем что ЭВМ так захотелосьНе надо спорить надо отталкиваться от фактов - они такие чем выше модуль аргумента тем хуже разложение описывает исходную функцию, зачем спорить если это очевидно?
0
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
25.08.2012, 16:51 #11
-=ЮрА=-, для любого комплексного z справедливо равенство:
http://www.cyberforum.ru/cgi-bin/latex.cgi?cos z = 1-\frac{z^2}{2!}+...,
это означает, что какое бы число (комплексное или действительное) не подставить в левую и правую части равенства, они совпадут.

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Иначе как опровергнуть результат отработки - тем что ЭВМ так захотелось
Вот именно, нужна другая реализация.
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
25.08.2012, 16:51 #12
Thinker, вы не понимаете сути разложения в ряд Тейлора. Из того, что ряд сходится, ещё не следует, что его частичная сумма равна косинусу. Если увеличивать количество слагаемых, то ряд будет неограниченно близко подходить к косинусу — именно это вкладывается в понятие сходимости. Заметьте разницу между пределом суммы ряда (который действительно тождественнен косинусу) и его частичной суммой. А конкретная частичная сумма только приближает косинус. Причём ошибка тем больше, чем аргумент дальше от опорного значения ряда (тут это ноль); и тем меньше, чем больше слагаемых взять.
0
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
25.08.2012, 16:54 #13
~OhMyGodSoLong~, ерунду сказали и верите в это. почитайте признак Лейбница лучше. правильно, все зависит от количества слагаемых и чтобы это избежать необходимо привести аргумент к указанному промежутку.
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
25.08.2012, 16:59 #14
Тогда я жду от вас объяснений, каким образом вы с помощью линейной комбинации конечного числа непериодических функций смогли точно выразить периодическую функцию.
0
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
25.08.2012, 17:01 #15
вообще то требуется вычислить с указанной точностью cos x и это можно теоретически (практически сложнее) сделать для любого x, вот и весь наш спор с Юрой. Мой вариант решения задачи:

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
#include <cmath>
#include <iostream>
#define PI 3.1415926535897932384626433832795
 
long double Init(long double x)
{
   if (x < -PI)
      while (x < -PI)
         x += PI;
   else if (x > PI)
      while (x > PI)
         x -= PI;
   return x;
}
 
long double Cos(long double x, long double eps)
{
   long i = 0;
   long double p, rez;
   x = Init(x);
   rez = p = 1.0;
   while(std::fabs(p) >= eps)
   {
       i += 2;
       p *= -(x*x)/((i-1)*i);
       rez += p;
   }
   return rez;
}
 
int main()
{
    std::cout << Cos(1000, 1e-100);
    return 0;
}
0
25.08.2012, 17:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2012, 17:01
Привет! Вот еще темы с ответами:

Вычислить с заданной точностью значение функции, используя ее разложение в ряд - C++
Здравствуйте! Помогите, пожалуйста, с двумя заданиями: 1. Вычислить по формуле: (первая картинка) 2. Вычислить с заданной...

Вычислить с заданной точностью значение функции , используя ее разложение в ряд: - C++
Вычислить с заданной точностью значение функции , используя ее разложение в ряд: помогите пожалуста

Вычислить с заданной точностью значение функции представленной разложением в ряд Тейлора - C++
Здравствуйте товарищи программисты! Мне нужна ваша помощь! Вот задача: вычислить с заданной точностью значение функции,представленной в...

Вычислить с заданной точностью значение функции, представленной в виде суммы бесконечного ряда - C++
Всем привет. Я делаю лабу по программированию,но у меня не выходит,так как я только начинаю знакомиться с языком С++.Помогите...


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

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

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