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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 54, средняя оценка - 4.89
хых
1 / 1 / 0
Регистрация: 02.11.2011
Сообщений: 9
#1

Вычислить значение arcsin x через разложение в ряд Тейлора - C++

08.11.2011, 17:29. Просмотров 7350. Ответов 11
Метки нет (Все метки)

оригинал
памагите ктони буть код проги есть на скрине только не выводит до конца результат тоже есть на скрине формула каторую надо использовать обведена в красный
1
Миниатюры
Вычислить значение arcsin x через разложение в ряд Тейлора   Вычислить значение arcsin x через разложение в ряд Тейлора   Вычислить значение arcsin x через разложение в ряд Тейлора  

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

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

Рекурсия. Найти значение функции через разложение в ряд Тейлора - C++
Собственно, сабж. Есть функция cos^2(x), которую я хочу разложить в ряд Тейлора. Вот отрывок кода с функцией: double func(double...

Вычислить значение функции exp(x) с точностью 0.001 (разложение в ряд Тейлора) - C++
вычислить значение функции exp(x) с точностью 0.001, разложив функцию в ряд Тейлора где ошибка не подскажите? вычисляет не верно.......

Как вычислить значение функции используя разложение cos в ряд Тейлора??? - C++
Вычислить значение функции y, разложив cos(x) в ряд Тейлора. Аргумент х изменяется от -2 до 2 с шагом 0,5. Определить погрешность. ...

Вычислить значение е^х через разложение в ряд - C++
Задали задачку....вот немогу реить,неполучается с условием пишет ошибку Вычеслить значение е (в степени) х ,используя ряд...

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

11
magirus
Супер-модератор
Эксперт по компьютерным сетямЭксперт Windows
26927 / 15185 / 887
Регистрация: 15.09.2009
Сообщений: 66,148
Записей в блоге: 77
08.11.2011, 17:55 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
http://rus.1september.ru/urok/
3
vetvet
08.11.2011, 18:04
  #3

Не по теме:

скорее даже так:
Помогите, кто-нибудь! Код проги есть на скрине, только не выводит до конца результат, который тоже есть на скрине. Формула, которую надо использовать, обведена красным.

0
diagon
08.11.2011, 18:22
  #4

Не по теме:

Лол, я помню как когда-то смеялся над картинкой, где блондинка фотографировала монитор. Но силуэт человека с фотоаппаратом на первых двух картинках - это нечто.

0
-=ЮрА=-
Заблокирован
Автор FAQ
09.11.2011, 11:26 #5
хых, всё потому что в формуле неправильно домножаете
Показываю:
Берём 2 элемента a[n] и a[n + 1], найдём отношение a[n + 1]/a[n]
Приводя подобные получим
a[n + 1]/a[n] = n*pow((2*n + 1),2)*pow(x,2)/(n + 1)*(2*n + 3)*(2*n - 1)
Как видим отличается от вашего домножения и степень не куб а квадрат - интересно да?)
Ниже код и скрин работы алгоритма
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 <stdio.h>
#include <conio.h>
#include <math.h>
 
double f(double x, double eps)
{
    double v, sum = x;
    long n = 1;
    double fn = pow(x,3)/2.0;
    while(eps < fabs(fn))
    {
        sum += fn;
        n   += 1;
        fn *= n*pow((2*n + 1),2)*pow(x,2);
        fn /= 1.0*(n + 1)*(2*n + 3)*(2*n - 1);
    }
    return sum;
}
 
int main()
{
    char sign[] = " ";
    double x, fx, dx = 0, xn = 0, xk = 0, eps = 0;
    printf("Enter xn : ");scanf("%lf",&xn);
    printf("Enter xk : ");scanf("%lf",&xk);
    printf("Enter dx : ");scanf("%lf",&dx);
    printf("Enter eps: ");scanf("%lf",&eps);
    printf("|-----------------------------------|\n");
    printf("|    x   |  f(x)  |  asin |(sin-f)/f|\n");
    printf("|-----------------------------------|\n");
    for(x = xn; x <= xk; x += dx)
    {
        fx = f(x,eps);
        if(x < 0)
            sign[0] = '\0';
        else
            sign[0] = ' ';
        printf("|%s%.4f |%s%.4f |%s%.4f|%s%.4f  |\n",
            sign,x,sign,fx,sign,asin(fx),sign,(sin(x) != 0 ? fabs(sin(x) - fx)/sin(x) : 0));
    }
    printf("|-----------------------------------|\n");
    printf("Press any key to continue\n");
    getch();
    return 0;
}
1
Миниатюры
Вычислить значение arcsin x через разложение в ряд Тейлора   Вычислить значение arcsin x через разложение в ряд Тейлора  
alexcoder
1546 / 691 / 90
Регистрация: 03.06.2009
Сообщений: 3,670
Завершенные тесты: 1
19.10.2013, 22:07 #6
Извиняюсь за некропостинг, понадобился сабж, а в программе ошибки.
Вот исправленный вариант, может кому сгодится:
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 <stdio.h>
#include <conio.h>
#include <math.h>
 
double f(double x, double eps)
{
    double v, sum = x;
    long n = 1;
    double fn = pow(x,3)/6.0;
    while(eps < fabs(fn))
    {
        sum += fn;
        n   += 1;
        fn *= (2*n - 1)*(2*n - 1)*x*x;
        fn /= 2*n*(2*n + 1);
    }
    return sum;
}
 
int main()
{
    char sign[] = " ";
    double x, fx, dx = 0, xn = 0, xk = 0, eps = 0;
    printf("Enter xn : ");scanf("%lf",&xn);
    printf("Enter xk : ");scanf("%lf",&xk);
    printf("Enter dx : ");scanf("%lf",&dx);
    printf("Enter eps: ");scanf("%lf",&eps);
    printf("|-----------------------------------|\n");
    printf("|    x   |  f(x)  |  asin |(sin-f)/f|\n");
    printf("|-----------------------------------|\n");
    for(x = xn; x <= xk; x += dx)
    {
        fx = f(x,eps);
        if(x < 0)
            sign[0] = '\0';
        else
            sign[0] = ' ';
        printf("|%s%.4f |%s%.4f |%s%.4f|%s%.4f  |\n",
            sign,x,sign,fx,sign,asin(fx),sign,(sin(x) != 0 ? fabs(sin(x) - fx)/sin(x) : 0));
    }
    printf("|-----------------------------------|\n");
    printf("Press any key to continue\n");
    getch();
    return 0;
}
0
-=ЮрА=-
Заблокирован
Автор FAQ
19.10.2013, 23:26 #7
alexcoder, жду пояснений по поводу вот этого
Цитата Сообщение от alexcoder Посмотреть сообщение
fn *= (2*n - 1)*(2*n - 1)*x*x;
* * * * fn /= 2*n*(2*n + 1);
вижу не умеешь находить рекурретный сомножитель...
0
alexcoder
1546 / 691 / 90
Регистрация: 03.06.2009
Сообщений: 3,670
Завершенные тесты: 1
19.10.2013, 23:32 #8
Я не теоретик, вычислил подбором членов, но с таким множителем погрешность на интервале |x|<1 строго укладывается в eps. Можешь проверить.
0
-=ЮрА=-
Заблокирован
Автор FAQ
19.10.2013, 23:47 #9
alexcoder, мне не зачем проверять у тебя написан лаг в рекуррентном сомножителе.
Хочешь юзай сой код только не пиши на коровьий кизяк - казинака.

Добавлено через 6 минут
Цитата Сообщение от alexcoder Посмотреть сообщение
Можешь проверить.
проверил
http://codepad.org/BnT4Yi4g
Enter xn : Enter xk : Enter dx : Enter eps: |-----------------------------------|
| x | f(x) | asin |(sin-f)/f|
|-----------------------------------|
| 0.0000 | 0.0000 | 0.0000| 0.0000 |
| 0.1000 | 0.1000 | 0.1002| 0.0017 |
| 0.2000 | 0.2013 | 0.2027| 0.0134 |
| 0.3000 | 0.3045 | 0.3094| 0.0304 |
| 0.4000 | 0.4107 | 0.4232| 0.0546 |
| 0.5000 | 0.5232 | 0.5506| 0.0913 |
| 0.6000 | 0.6431 | 0.6985| 0.1389 |
| 0.7000 | 0.7747 | 0.8862| 0.2025 |
| 0.8000 | 0.9253 | 1.1817| 0.2898 |
| 0.9000 | 1.1165 | nan| 0.4253 |
| 1.0000 | 1.4847 | nan| 0.7644 |
|-----------------------------------|
Press any key to continue
думаю дальнейшее дискутирование бессмыслено
0
Инна96
Заблокирован
19.10.2013, 23:54 #10
Функция №3
0
Вложения
Тип файла: doc Lab_3_V2 (7).doc (85.0 Кб, 74 просмотров)
alexcoder
1546 / 691 / 90
Регистрация: 03.06.2009
Сообщений: 3,670
Завершенные тесты: 1
19.10.2013, 23:54 #11
Молодец. А в моем варианте получилось так:
Dlya x=-0.900 do 0.910 s shagom 0.100 i tochnostyu 0.001

x n s f
--------------------------------------
-0.900 10 -1.116462 -1.119769
-0.800 6 -0.925271 -0.927295
-0.700 5 -0.774674 -0.775397
-0.600 4 -0.643082 -0.643501
-0.500 3 -0.523177 -0.523599
-0.400 2 -0.410667 -0.411517
-0.300 2 -0.304500 -0.304693
-0.200 2 -0.201333 -0.201358
-0.100 1 -0.100000 -0.100167
0.000 1 0.000000 0.000000
0.100 1 0.100000 0.100167
0.200 2 0.201333 0.201358
0.300 2 0.304500 0.304693
0.400 2 0.410667 0.411517
0.500 3 0.523177 0.523599
0.600 4 0.643082 0.643501
0.700 5 0.774675 0.775398
0.800 6 0.925271 0.927295
0.900 10 1.116462 1.119770
--------------------------------------
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
#include <stdio.h>
#include <conio.h>
#include <math.h>
int main()
{
//описание переменных
    float x, s, f, x_nach, x_kon, delta_x, eps, temp;
    int n;
 
    printf("\nVvod ishodnix dannyh:\n");    //ввод исходных данных
    printf("\nx_nach=");                        
    scanf("%f", &x_nach);                               //начальное значение аргумента
    printf("\nx_kon=");                     
    scanf("%f", &x_kon);                                //конечное значение аргумента
    printf("\ndelta_x=");                       
    scanf("%f", &delta_x);                              //шаг изменения аргумента
    printf("\neps=");                       
    scanf("%f", &eps);                                  //точность вычислений
    
    //эхо-печать
    printf("\nDlya  x=%5.3f  do  %5.3f  s shagom  %5.3f  i tochnostyu  %5.3f\n", x_nach, x_kon, delta_x, eps);
 
    printf("\n   x      n         s            f");
    printf("\n--------------------------------------");
    
    x = x_nach;
    
    do              //внешний цикл - изменение аргумента
    {
        temp = pow(x,3)/6.0;    //первое слагаемое
        s = x;      //начальное значение суммы
        n = 1;      //количество итераций на каждом шаге
        f = asin(x);    //точное значение функции
        
            //внутренний цикл - вычисление суммы ряда
while (fabs(temp) > eps)
        {
            s += temp;  //очередная сумма
            
            n++;            //количество итераций   
            //очередное слагаемое
            temp *= (2*n - 1)*(2*n - 1)*x*x;
            temp /= 2*n*(2*n + 1);
    }
        
        printf("\n%5.3f     %d     %0.6f     %0.6f", x, n, s, f);
        
        x += delta_x;   //увеличение аргумента на шаг  delta_x
    }
    while (x <= x_kon);
    
    printf("\n--------------------------------------");
 
    getch();
    return 0;
}
Почему-то все работает. Можно называть это какашкой, можно вообще пост удалить, мне все равно. Но может кому-то понадобится. Дискуссию прекращаю.
0
-=ЮрА=-
Заблокирован
Автор FAQ
20.10.2013, 00:27 #12
Цитата Сообщение от alexcoder Посмотреть сообщение
Почему-то все работает.
а ещё http://www.cyberforum.ru/cgi-bin/latex.cgi?\alpha \approx sin(\alpha ) \approx tg(\alpha ) для малых углов.
Ещё раз привожу научнообоснованный код
http://codepad.org/CCTtwU2C
| x | f(x) | asin |(sin-f)|
|-----------------------------------|
|-0.9000 |-1.1165 |nan|0.3331 |
|-0.8000 |-0.9253 |-1.1817|0.2079 |
|-0.7000 |-0.7747 |-0.8862|0.1305 |
|-0.6000 |-0.6431 |-0.6985|0.0784 |
|-0.5000 |-0.5232 |-0.5506|0.0438 |
|-0.4000 |-0.4107 |-0.4232|0.0212 |
|-0.3000 |-0.3045 |-0.3094|0.0090 |
|-0.2000 |-0.2013 |-0.2027|0.0027 |
|-0.1000 |-0.1000 |-0.1002|0.0002 |
|-0.0000 |-0.0000 |-0.0000|0.0000 |
| 0.1000 | 0.1000 | 0.1002| 0.0002 |
| 0.2000 | 0.2013 | 0.2027| 0.0027 |
| 0.3000 | 0.3045 | 0.3094| 0.0090 |
| 0.4000 | 0.4107 | 0.4232| 0.0212 |
| 0.5000 | 0.5232 | 0.5506| 0.0438 |
| 0.6000 | 0.6431 | 0.6985| 0.0784 |
| 0.7000 | 0.7747 | 0.8862| 0.1305 |
| 0.8000 | 0.9253 | 1.1817| 0.2079 |
| 0.9000 | 1.1165 | nan| 0.3331 |
|-----------------------------------|
И прошу тебя alexcoder, не путать людей. Для некоторых функций подходит кусочно линейная аппроксимация, к примеру синус в полупериоде можно неплохо заменить параболой, но это же не значит что на всей числовой оси параболическая зависимость опишет синус одинаково хорошо. Считай что с отрабаоткой тебе просто повезло, но прошу не путай людей.

Добавлено через 1 минуту
При этом вот твои слова
Цитата Сообщение от alexcoder Посмотреть сообщение
Я не теоретик, вычислил подбором членов,
ну будь добр тогда обоснуй своё решение, если его обоснование будет научно обоснованным я возьму в работу именно твои идеи.
1
20.10.2013, 00:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.10.2013, 00:27
Привет! Вот еще темы с ответами:

Дано разложение функции в ряд Тейлора. Вычислить для значения x и точности Eps точное значение функции - C++
Дано разложение функции y(x) в ряд Тейлора. Составить программу, вычисляющую для значения x и точности Eps: • точное значение функции...

Найти разложение в ряд arcsin(x) - C++
Здравствуйте, помогите, пожалуйста,решить задачу в С++ arcsin(x)=x+1/2*x^3/3+1*3/2*4*x^5/5.....при R=1

Вычислить арктангенс через разложение в ряде Тейлора - C++
Алгоритм вроде верный,но есть две ошибки,которые не могу решить. Вот код: #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;math.h&gt; ...

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


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

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

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