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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 57, средняя оценка - 4.72
von_Manstein
17 / 17 / 0
Регистрация: 23.01.2011
Сообщений: 61
#1

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

30.11.2011, 15:26. Просмотров 7992. Ответов 18
Метки нет (Все метки)

Добрый день всем.

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

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

Функция cos x



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

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

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

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

Вычислить значения функции ch x (гиперболический косинус) с помощью бесконечного ряда Тейлора - C++
не могу решить никак 10. Написать программу вычисления значения функции ch x (гиперболический косинус) с помощью бесконечного ряда...

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

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

18
-=ЮрА=-
Заблокирован
Автор FAQ
30.11.2011, 15:31 #2
von_Manstein, вчера подобное задание реализовывал, только через Тэйлора находили гиперболический арктангенс, см пост и топик в целом, все соображения 1 в 1 могут применены к решению данной задачи Вычислить и вывести на экран в виде таблицы значения функции
2
-=ЮрА=-
Заблокирован
Автор 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;
}
3
Миниатюры
Написать программу для нахождения значения функции с помощью ряда Тейлора  
von_Manstein
17 / 17 / 0
Регистрация: 23.01.2011
Сообщений: 61
30.11.2011, 15:50  [ТС] #4
Спасибо!

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

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

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

Там cout.width и cout.setf использовать, чтобы по центру и с фикс. числом позиций?
0
-=ЮрА=-
Заблокирован
Автор 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 ?
- для данной задачи понятное дело рациональней домножать на итератор, мало того что невесть сколько членов суммировать может, так ещё и для каждого факториал по отдельности находить - это нерационально
2
von_Manstein
17 / 17 / 0
Регистрация: 23.01.2011
Сообщений: 61
30.11.2011, 15:56  [ТС] #6
Но если домножать на итератор - то получится просто n!, а нужно (2n)! . Тут придётся цикл в цикле делать?
0
-=ЮрА=-
Заблокирован
Автор 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)}
1
von_Manstein
17 / 17 / 0
Регистрация: 23.01.2011
Сообщений: 61
30.11.2011, 16:28  [ТС] #8
Понял теперь. Чисто математически мы получили рекурентную формулу.

Или если проще - то, что справа внизу - есть рекурентная формула?
0
-=ЮрА=-
Заблокирован
Автор FAQ
30.11.2011, 16:37 #9
Цитата Сообщение от von_Manstein Посмотреть сообщение
Или если проще - то, что справа внизу - есть рекурентная формула?
- она самая (имеется ввиду рекуррентное соотношение для двух смежных членов ряда)
1
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;
}
Хочу узнать, правильно ли данная программа выполняет поставленную цель - вычисляет сумму ряда?
Картинка с рядом - в стартовом посте.
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 вы этим работу алгоритма врядли ускорите, что вы хотели этим достичь????
2
von_Manstein
17 / 17 / 0
Регистрация: 23.01.2011
Сообщений: 61
01.12.2011, 22:52  [ТС] #12
Такие вот довольно короткие функции, как мне кажется, будут лучше смотреться встроенными. должно быть шустрей. Хуже не будет точно, ведь компилятор, насколько я помню, может игнорировать эту inline.

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

Или нет?
0
isaak
103 / 40 / 9
Регистрация: 17.10.2010
Сообщений: 670
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)! - это правильно???????
0
-=ЮрА=-
Заблокирован
Автор 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! т.е тут не работает привычная нам дистрибутивность
0
isaak
103 / 40 / 9
Регистрация: 17.10.2010
Сообщений: 670
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)}
0
24.07.2012, 22:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.07.2012, 22:14
Привет! Вот еще темы с ответами:

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

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

Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью ряда Тейлора - C++
Делал через различные циклы,всёравно не хочет выводить результат(((((((( #include &quot;stdafx.h&quot; #include &lt;clocale&gt; #include &lt;cmath&gt; ...

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


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

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

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