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

Написать программу для нахождения значения функции с помощью ряда Тейлора - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 57, средняя оценка - 4.72
von_Manstein
17 / 17 / 0
Регистрация: 23.01.2011
Сообщений: 61
30.11.2011, 15:26     Написать программу для нахождения значения функции с помощью ряда Тейлора #1
Добрый день всем.

Прошу помощи у более опытных товарищей. Не могу решить задачу.

Вычислить и вывести на экран в виде таблицы значение функции, заданной с помощью ряда Тейлора на интервале от Хнач до Хкон с шагом dx с точностью e. Таблицу снабдить заголовком и шапкой. Каждая строка должна содержать значение аргумента, значение функции и количество просуммированных членов ряда.

Функция cos x



Заранее спасибо!
Миниатюры
Написать программу для нахождения значения функции с помощью ряда Тейлора   Написать программу для нахождения значения функции с помощью ряда Тейлора  
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.11.2011, 15:26     Написать программу для нахождения значения функции с помощью ряда Тейлора
Посмотрите здесь:

C++ Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью ряда Тейлора
Вычислить значения функции ch x (гиперболический косинус) с помощью бесконечного ряда Тейлора C++
Вычислить и вывести на экран в виде таблицы значения функции заданной с помощью ряда Тейлора C++
C++ Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью ряда Тейлора
Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью ряда Тейлора C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
30.11.2011, 15:31     Написать программу для нахождения значения функции с помощью ряда Тейлора #2
von_Manstein, вчера подобное задание реализовывал, только через Тэйлора находили гиперболический арктангенс, см пост и топик в целом, все соображения 1 в 1 могут применены к решению данной задачи Вычислить и вывести на экран в виде таблицы значения функции
-=ЮрА=-
Заблокирован
Автор FAQ
30.11.2011, 15:41     Написать программу для нахождения значения функции с помощью ряда Тейлора #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вижу, что кроме Ctrl+C Ctrl+V варианты видимо не подходят, что же вот код
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
#include <iostream>
using namespace std;
 
double my_abs(double val)
{
    double ret = val;
    if(val < 0)
        ret *= -1;
    return ret;
}
 
double Taylor(double x, double e, long &n)
{
    double sum = 0;
    double an = 1;
    n = 1;
    do
    {
        sum += an;
        n   += 1;
        an *= (-1)*(x*x/(2.0*n*2*(n - 1)));
    }
    while(e <= my_abs(an));
    return sum;
    
}
 
int main()
{
    long n;
    double xn, xk, dx, e;
    cout<<"xn = ";cin>>xn;
    cout<<"xk = ";cin>>xk;
    cout<<"dx = ";cin>>dx;
    cout<<" e = ";cin>>e;
    cout<<"|  x  |  Sum  |   N   |\n";
    while(xn <= xk)
    {
        cout<<xn<<" | "<<Taylor(xn, e, n)<<" |  ";
        cout<<n<<endl;
        xn = xn + dx;
    }
    system("pause");//Äëÿ CodeBlocks äîáГ*ГўГЁГІГј Гў ГЁГ*êëóäû <cstdlib>
    return 0;
}
Миниатюры
Написать программу для нахождения значения функции с помощью ряда Тейлора  
von_Manstein
17 / 17 / 0
Регистрация: 23.01.2011
Сообщений: 61
30.11.2011, 15:50  [ТС]     Написать программу для нахождения значения функции с помощью ряда Тейлора #4
Спасибо!

У меня была задача номер один - как рациональнее считать факториал 2n ? Просто n - это домножать в цикле на итератор и всё, а тут как рациональнее? Можно каждый раз находить через рекурсивную функцию, но врят ли это рациональнее.

Задача номер два - что есть погрешность и что с ней делать?

Ну и задача поменьше - как вывести это в ровную таблицу?

Там cout.width и cout.setf использовать, чтобы по центру и с фикс. числом позиций?
-=ЮрА=-
Заблокирован
Автор FAQ
30.11.2011, 15:54     Написать программу для нахождения значения функции с помощью ряда Тейлора #5
Цитата Сообщение от von_Manstein Посмотреть сообщение
Задача номер два - что есть погрешность и что с ней делать?
- см ссылку из 2-го поста, в том топике писал и за погрешность, зачем её приводил - наверное же не для красоты

Цитата Сообщение от von_Manstein Посмотреть сообщение
Ну и задача поменьше - как вывести это в ровную таблицу?
подключаем <iomanip> и переписываем цикл вот так
C++
1
2
3
4
5
6
7
8
cout<<"|  x   |  Sum   |    N   |\n";
    while(xn <= xk)
    {
        cout<<setw(6)<<setprecision(3)<<xn<<" | "
            <<setw(6)<<setprecision(3)<<Taylor(xn, e, n)<<" | ";
        cout<<setw(4)<<n<<endl;
        xn = xn + dx;
    }
Цитата Сообщение от von_Manstein Посмотреть сообщение
У меня была задача номер один - как рациональнее считать факториал 2n ?
- для данной задачи понятное дело рациональней домножать на итератор, мало того что невесть сколько членов суммировать может, так ещё и для каждого факториал по отдельности находить - это нерационально
von_Manstein
17 / 17 / 0
Регистрация: 23.01.2011
Сообщений: 61
30.11.2011, 15:56  [ТС]     Написать программу для нахождения значения функции с помощью ряда Тейлора #6
Но если домножать на итератор - то получится просто n!, а нужно (2n)! . Тут придётся цикл в цикле делать?
-=ЮрА=-
Заблокирован
Автор FAQ
30.11.2011, 16:10     Написать программу для нахождения значения функции с помощью ряда Тейлора #7
Цитата Сообщение от von_Manstein Посмотреть сообщение
что есть погрешность и что с ней делать?
- вот директ ссылка
Вычислить и вывести на экран в виде таблицы значения функции

Добавлено через 13 минут
Цитата Сообщение от von_Manstein Посмотреть сообщение
Но если домножать на итератор - то получится просто n!, а нужно (2n)! . Тут придётся цикл в цикле делать?
- поясняю
http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{n} = \sum_{n = 0}^{\propto }\frac{{(-1)}^{n}*{x}^{2*n}}{(2*n)!}

http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{n - 1} = \sum_{n = 0}^{\propto }\frac{{(-1)}^{n - 1}*{x}^{2*(n - 1)}}{(2*(n - 1))!}

Найдём отношение

http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{{a}_{n}}{{a}_{n - 1}} = \frac{\sum_{n = 0}^{\propto }\frac{{(-1)}^{n}*{x}^{2*n}}{(2*n)!}}{\sum_{n = 0}^{\propto }\frac{{(-1)}^{n - 1}*{x}^{2*(n - 1)}}{(2*(n - 1))!}} = (-1)*{x}^{2}*\frac{(2*(n - 1))!}{(2*n)!} = \frac{(-1)*{x}^{2}}{2*n*2*(n - 1)}
von_Manstein
17 / 17 / 0
Регистрация: 23.01.2011
Сообщений: 61
30.11.2011, 16:28  [ТС]     Написать программу для нахождения значения функции с помощью ряда Тейлора #8
Понял теперь. Чисто математически мы получили рекурентную формулу.

Или если проще - то, что справа внизу - есть рекурентная формула?
-=ЮрА=-
Заблокирован
Автор FAQ
30.11.2011, 16:37     Написать программу для нахождения значения функции с помощью ряда Тейлора #9
Цитата Сообщение от von_Manstein Посмотреть сообщение
Или если проще - то, что справа внизу - есть рекурентная формула?
- она самая (имеется ввиду рекуррентное соотношение для двух смежных членов ряда)
von_Manstein
17 / 17 / 0
Регистрация: 23.01.2011
Сообщений: 61
30.11.2011, 20:59  [ТС]     Написать программу для нахождения значения функции с помощью ряда Тейлора #10
Спасибо большое!

Добавлено через 31 минуту
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
#include <iostream>
#include <conio.h>
#include <clocale>
#include <iomanip>
 
using namespace std;
 
inline double my_abs(double val)
{
        double ret = val;
        if(val < 0)
                ret *= -1;
        return ret;
}
 
inline double Taylor(double x, double e, long &n)
{
        double sum = 0;
        double an = 1;
        n = 1;
        do
        {
                sum += an;
                n   += 1;
                an *= (-1)*(x*x/(2.0*n*2*(n - 1)));
        }
        while(e <= my_abs(an));
        return sum;
        
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    long n = 0;
    double xn, xk, dx, e;
 
    cout << "Программа для вычисления значения функции\ny = cos(x) с помощью ряда Тейлора\n";
 
    cout<<"Начальное значение xn = ";
    cin>>xn;
    cout<<"Конечное значение xk = ";
    cin>>xk;
    cout<<"Шаг dx = ";
    cin>>dx;
    cout<<"Погрешность e = ";
    cin>>e;
 
    cout << "--------------------------------------------------------------------------\n";
    cout << "|  текущее значение x  |  текущее значение суммы  |   счётчик итерации   |\n";
    cout << "--------------------------------------------------------------------------\n";
 
    while(xn <= xk)
    {
        cout<< "|" << setw(15)<< setprecision(8) << xn << "       |    "
            << setw(15) << setprecision(8) << Taylor(xn, e, n) <<"       | "
            << setw(15) << n << "      |" << endl;
        xn = xn + dx;
    }
    cout << "--------------------------------------------------------------------------\n";
 
    _getch();
    return 0;
}
Хочу узнать, правильно ли данная программа выполняет поставленную цель - вычисляет сумму ряда?
Картинка с рядом - в стартовом посте.
-=ЮрА=-
Заблокирован
Автор FAQ
01.12.2011, 21:52     Написать программу для нахождения значения функции с помощью ряда Тейлора #11
Цитата Сообщение от von_Manstein Посмотреть сообщение
Хочу узнать, правильно ли данная программа выполняет поставленную цель - вычисляет сумму ряда?Картинка с рядом - в стартовом посте.
- ну а как вы думаете?

Цитата Сообщение от von_Manstein Посмотреть сообщение
double an = 1;
Цитата Сообщение от von_Manstein Посмотреть сообщение
sum += an;
* * * * * * * * n * += 1;
* * * * * * * * an *= (-1)*(x*x/(2.0*n*2*(n - 1)));
Как вариант запишите тело

Цитата Сообщение от von_Manstein Посмотреть сообщение
double Taylor(double x, double e, long &n)
- вот так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
double Taylor(double x, double e, long &n)
{
    cout<<"Taylor begin \n";
    cout<<"argument : "<<x<<"\n";
        double sum = 0;
        double an = 1;
        n = 1;
        do
        {
        cout<<"Iteration : "<<n<<endl;
                sum += an;
        cout<<"an = "<<an<<"\t";
        cout<<sum<<endl;
                n   += 1;
                an *= (-1)*(x*x/(2.0*n*2*(n - 1)));
        }
        while(e <= my_abs(an));
    cout<<"Taylor end\n";
        return sum;
}
- будете парсить работу функции для каждого значения аргумента и сравните вывод в консоль с расчётными значениями.
PS:von_Manstein, зачем было добавлять к функциям inline вы этим работу алгоритма врядли ускорите, что вы хотели этим достичь????
von_Manstein
17 / 17 / 0
Регистрация: 23.01.2011
Сообщений: 61
01.12.2011, 22:52  [ТС]     Написать программу для нахождения значения функции с помощью ряда Тейлора #12
Такие вот довольно короткие функции, как мне кажется, будут лучше смотреться встроенными. должно быть шустрей. Хуже не будет точно, ведь компилятор, насколько я помню, может игнорировать эту inline.

Особенно модуль. Мне кажется, что такое вещи нужно встраивать. Насчёт Тейлора я бы подумал, а вот модуль, мне кажется, можно, так должно быть шустрей.

Или нет?
isaak
101 / 38 / 9
Регистрация: 17.10.2010
Сообщений: 634
24.07.2012, 17:17     Написать программу для нахождения значения функции с помощью ряда Тейлора #13
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- вот директ ссылка
Вычислить и вывести на экран в виде таблицы значения функции

Добавлено через 13 минут
- поясняю
http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{n} = \sum_{n = 0}^{\propto }\frac{{(-1)}^{n}*{x}^{2*n}}{(2*n)!}

http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}_{n - 1} = \sum_{n = 0}^{\propto }\frac{{(-1)}^{n - 1}*{x}^{2*(n - 1)}}{(2*(n - 1))!}

Найдём отношение

http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{{a}_{n}}{{a}_{n - 1}} = \frac{\sum_{n = 0}^{\propto }\frac{{(-1)}^{n}*{x}^{2*n}}{(2*n)!}}{\sum_{n = 0}^{\propto }\frac{{(-1)}^{n - 1}*{x}^{2*(n - 1)}}{(2*(n - 1))!}} = (-1)*{x}^{2}*\frac{(2*(n - 1))!}{(2*n)!} = \frac{(-1)*{x}^{2}}{2*n*2*(n - 1)}
-=ЮрА=- я правильно понял:
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{{a}_{n}}{{a}_{n - 1}} = \frac{\sum_{n = 0}^{\propto }\frac{{(-1)}^{n}*{x}^{2*n}}{(2*n)!}}{\sum_{n = 0}^{\propto }\frac{{(-1)}^{n - 1}*{x}^{2*(n - 1)}}{(2*(n - 1))!}} = (-1)*{x}^{2}*\frac{(2*(n - 1))!}{(2*n)!} =(-1)*{x}^{2}*\frac{(2n - 2)!}{(2*n)*(2*n-1)*(2*n-2)!}= \frac{(-1)*{x}^{2}}{2*n*2*(n - 1)}
Так как (2*n)! = (2*n)*(2*n-1)*(2*n-2)! - это правильно???????
-=ЮрА=-
Заблокирован
Автор FAQ
24.07.2012, 21:00     Написать программу для нахождения значения функции с помощью ряда Тейлора #14
Цитата Сообщение от isaak Посмотреть сообщение
ак как (2*n)! = (2*n)*(2*n-1)*(2*n-2)! - это правильно???????
isaak, конечно же нет, т.к ты неверно преобразовал факториал (2*(n - 1))!
Показываю в деталях
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{{a}_{n}}{{a}_{n - 1}} = (-1)*{x}^{2}*\frac{(2*(n - 1))!}{(2*n)!} =  (-1)*{x}^{2}*\frac{(2*n - 2)!}{(2*n)!}
Таким образом приводя подобные и раскрывая (2*n)! получим
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{{a}_{n}}{{a}_{n - 1}} = (-1)*{x}^{2}*\frac{(2*n - 2)!}{(2*n)!}  = (-1)*{x}^{2}*\frac{(2*n - 2)!}{2*n*(2*n - 1)*(2*n - 2)!} = \frac{(-1)*{x}^{2}}{2*n*(2*n - 1)}
Что и было мной вверху получено
Лишний раз предостеригаю всех от вот этого (2*n)! не равен 2*n! т.е тут не работает привычная нам дистрибутивность
isaak
101 / 38 / 9
Регистрация: 17.10.2010
Сообщений: 634
24.07.2012, 22:14     Написать программу для нахождения значения функции с помощью ряда Тейлора #15
-=ЮрА=- а как же тогда разложить (2*n)!????? И (2*(n - 1))! я не преобразовывал а просто перемножил 2*(n - 1) и у меня получилось (2*(n - 1))! = (2*n - 2)! ???? -=ЮрА=- как тогда правильно расписать (2*n)! и (2*(n - 1))! ????? Целый день бьюсь????? Заранее огромное спасибо!!!!

Добавлено через 6 минут
Кажется на шел свой косяк: (2*n)! = (2*n)*(2*n-1)*(2*n-2)! я вынес 2 из - скобки (2*n-1)- это мой косяк кажется.
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{{a}_{n}}{{a}_{n - 1}} = \frac{\sum_{n = 0}^{\propto }\frac{{(-1)}^{n}*{x}^{2*n}}{(2*n)!}}{\sum_{n = 0}^{\propto }\frac{{(-1)}^{n - 1}*{x}^{2*(n - 1)}}{(2*(n - 1))!}} = (-1)*{x}^{2}*\frac{(2*(n - 1))!}{(2*n)!} =(-1)*{x}^{2}*\frac{(2n - 2)!}{(2*n)*(2*n-1)*(2*n-2)!}= \frac{(-1)*{x}^{2}}{2*n*(2*n - 1)}
-=ЮрА=-
Заблокирован
Автор FAQ
24.07.2012, 22:16     Написать программу для нахождения значения функции с помощью ряда Тейлора #16
isaak,
(2*n)!=2*n*(2*n-1)*(2*n-2)*(2*n-3)...1

Добавлено через 57 секунд
да ты верно понял свою ошибку
isaak
101 / 38 / 9
Регистрация: 17.10.2010
Сообщений: 634
24.07.2012, 22:26     Написать программу для нахождения значения функции с помощью ряда Тейлора #17
-=ЮрА=- (2*(n - 1))! = (2*n - 2)! = (2*n-2)*(2*n-3)*(2*n-4)...1 это тоже правильно????
Тогда можно записать (2*n)!=2*n*(2*n-1)*(2*n-2)*(2*n-3)...1 = 2*n*(2*n-1)*(2*n-2)! , да????
Так как n! = n*(n-1)!
banda
1 / 1 / 0
Регистрация: 06.02.2011
Сообщений: 46
08.11.2012, 19:53     Написать программу для нахождения значения функции с помощью ряда Тейлора #18
Так тут не правильно
У тебя тут по ряду Тейлора cos(-1 радиана)=0.88002..
А проверь на калькулятор cos (-1 радиана)=0.5403..
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.12.2012, 10:40     Написать программу для нахождения значения функции с помощью ряда Тейлора
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
banda
1 / 1 / 0
Регистрация: 06.02.2011
Сообщений: 46
11.12.2012, 10:40     Написать программу для нахождения значения функции с помощью ряда Тейлора #19
Никто мне не ответит?
Yandex
Объявления
11.12.2012, 10:40     Написать программу для нахождения значения функции с помощью ряда Тейлора
Ответ Создать тему
Опции темы

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