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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.95
Buiucliu
6 / 6 / 1
Регистрация: 06.05.2012
Сообщений: 18
24.08.2012, 12:02     вычислить с заданной точностью значение функции #1
вот такая задачка...
Миниатюры
вычислить с заданной точностью значение функции  
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2012, 12:02     вычислить с заданной точностью значение функции
Посмотрите здесь:

Вычислить с заданной точностью значение функции y=f(x) C++
Вычислить с заданной точностью значение функции, используя ее разложение в ряд C++
Вычислить с заданной точностью значение функции , используя ее разложение в ряд: C++
C++ Вычислить с заданной точностью значение функции
C++ Вычислить с заданной точностью значение функции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bomg
2 / 2 / 0
Регистрация: 04.10.2009
Сообщений: 51
24.08.2012, 12:04     вычислить с заданной точностью значение функции #2
Цитата Сообщение от Buiucliu Посмотреть сообщение
вот такая задачка...
Это я так понял общее задание, а должен быть твой вариант с функцией и точностью.
Пaтрик
 Аватар для Пaтрик
394 / 387 / 38
Регистрация: 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;
}
вычислить с заданной точностью значение функции
-=ЮрА=-
Заблокирован
Автор 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;
}
Миниатюры
вычислить с заданной точностью значение функции  
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 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.
-=ЮрА=-
Заблокирован
Автор FAQ
25.08.2012, 16:24     вычислить с заданной точностью значение функции #6
Thinker, разложение для ряда тейлора действует для значений аргумента по модулю меньших единицы и вызывая cosx(1000, 1e-10), т.е. х = 1000 нарушаем условие корректности разложения!
Мой алгоритм максимально быстр (конечно на асме было бы быстрей, т.е. масимум скорости для плюсов) и рабоатет в рамках допустимых значений аргумента, за всё остальное как говорится я ответсвенности не несу
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
25.08.2012, 16:27     вычислить с заданной точностью значение функции #7
-=ЮрА=-, ничего подобного, данный ряд сходится на всей числовой оси, поэтому можно смело подставлять в него любые значения, только в силу ограниченности диапазона переменных, необходимо их приводить к указанному полуинтервалу. А по модулю < 1 это ln x. Указанный ряд для косинуса мало того сходится в каждой точке числовой оси, он еще и равномерно сходится на любом отрезке.
-=ЮрА=-
Заблокирован
Автор FAQ
25.08.2012, 16:30     вычислить с заданной точностью значение функции #8
Thinker, то о чём я написал
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
разложение для ряда тейлора действует для значений аргумента по модулю меньших единицы
проявляется в отклонении от истинных значений функции при увеличении значения аргумента свыше 1-цы (по модулю) - т.е. чем больше модуль тем больше ошибка разложения. (тут уже не важно что ряд сходиться , его сумма начинает некорректно описывать функцию)
Миниатюры
вычислить с заданной точностью значение функции  
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
25.08.2012, 16:34     вычислить с заданной точностью значение функции #9
-=ЮрА=-, не верить мне ваше право, верьте математике, cos x это аналитическая функция, то есть соответствующий ряд сходится в каждой точке комплексной! плоскости.
-=ЮрА=-
Заблокирован
Автор FAQ
25.08.2012, 16:46     вычислить с заданной точностью значение функции #10
Thinker, причём тут сходится
Цитата Сообщение от Thinker Посмотреть сообщение
=ЮрА=-, не верить мне ваше право, верьте математике, cos x это аналитическая функция, то есть соответствующий ряд сходится в каждой точке комплексной! плоскости.
я говорю о том, что разложение имеет свою область применимость касательно модуля аргумента. А уже не верить мне или верить это дело сугубо личное...
Иначе как опровергнуть результат отработки - тем что ЭВМ так захотелосьНе надо спорить надо отталкиваться от фактов - они такие чем выше модуль аргумента тем хуже разложение описывает исходную функцию, зачем спорить если это очевидно?
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 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!}+...,
это означает, что какое бы число (комплексное или действительное) не подставить в левую и правую части равенства, они совпадут.

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Иначе как опровергнуть результат отработки - тем что ЭВМ так захотелось
Вот именно, нужна другая реализация.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
25.08.2012, 16:51     вычислить с заданной точностью значение функции #12
Thinker, вы не понимаете сути разложения в ряд Тейлора. Из того, что ряд сходится, ещё не следует, что его частичная сумма равна косинусу. Если увеличивать количество слагаемых, то ряд будет неограниченно близко подходить к косинусу — именно это вкладывается в понятие сходимости. Заметьте разницу между пределом суммы ряда (который действительно тождественнен косинусу) и его частичной суммой. А конкретная частичная сумма только приближает косинус. Причём ошибка тем больше, чем аргумент дальше от опорного значения ряда (тут это ноль); и тем меньше, чем больше слагаемых взять.
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
25.08.2012, 16:54     вычислить с заданной точностью значение функции #13
~OhMyGodSoLong~, ерунду сказали и верите в это. почитайте признак Лейбница лучше. правильно, все зависит от количества слагаемых и чтобы это избежать необходимо привести аргумент к указанному промежутку.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
25.08.2012, 16:59     вычислить с заданной точностью значение функции #14
Тогда я жду от вас объяснений, каким образом вы с помощью линейной комбинации конечного числа непериодических функций смогли точно выразить периодическую функцию.
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 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;
}
-=ЮрА=-
Заблокирован
Автор FAQ
25.08.2012, 17:09     вычислить с заданной точностью значение функции #16
Thinker, ниже наглядная демонстрация, надеюсь вы поймёте о чём я говорю

PS:и не надо сбрасывать периоды косинуса(мы разговаривали о другом) я вам ещё раз повторюсь разложение имеет минимальную погрешность в области |x| < 1 BСЁ ЗАКОНЧИЛИ!
Миниатюры
вычислить с заданной точностью значение функции  
Вложения
Тип файла: rar TaylorCos.mcd.rar (1.8 Кб, 4 просмотров)
defer
秘密
 Аватар для defer
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
25.08.2012, 17:11     вычислить с заданной точностью значение функции #17
Цитата Сообщение от Thinker Посмотреть сообщение
Мой вариант решения задачи:
А где тут точность задается?
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
25.08.2012, 17:12     вычислить с заданной точностью значение функции #18
Mathcad не критерий истинности, голова для этого имеется. Там явный косяк, так как вычисления в нем не по признаку Лейбница проводятся.

Добавлено через 35 секунд
Цитата Сообщение от defer Посмотреть сообщение
А где тут точность задается?
Второй параметр функции Cos
-=ЮрА=-
Заблокирован
Автор FAQ
25.08.2012, 17:21     вычислить с заданной точностью значение функции #19
Thinker, только что написали что мол разложение работает для любых аргументов, а сами init-ом периоды убираете (У вас такое же разложение что и у меня только трудней записанное, дело в другом от того что написали вы разложение считать правельней для больших модулей аргумента НЕ СТАЛО!)
Короче вот оптимальный алгоритм со сбрасыванием периода без кучи всякой ненужной ерунды
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
#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 PI2 = 4*asin(1.0);
    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 - PI2*floor(x / PI2), e)<<" |"
            <<setprecision(5)<<setw(7)<<setfill(' ')<<cos(x)<<endl;
    }
    return 0;
}
Миниатюры
вычислить с заданной точностью значение функции  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2012, 17:23     вычислить с заданной точностью значение функции
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
25.08.2012, 17:23     вычислить с заданной точностью значение функции #20
-=ЮрА=-, для любого x теоретически работает, а практически переменные этого не позволяют.
Yandex
Объявления
25.08.2012, 17:23     вычислить с заданной точностью значение функции
Ответ Создать тему
Опции темы

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