Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > разложение функции в степенной ряд (acos)


Автор: storyteller 10.12.2012, 20:27
Код

#include <stdio.h>
#include <math.h>
#include <iostream>
int main(void)
{
double Eps; // pogreshnost'
double An, Sum, f, x;
int n, Ndop=350;   // n-nomer chlena ryada;Ndop=max chislo takih chlenov
printf( "\ax="); //vvod x
scanf("%lf",&x);
printf( "\aEps=");  // vvod Eps
scanf("%lf",&Eps);
do
{
n = 0; An=x; Sum=An; //nach. znach. n,An i summi ryada
f=acos(x);
while( fabs(An) > Eps)
{ 
An =(3.14/2) - x + (An*(2*n+1)*(2*n+1)*x*x/((n+1)*(2*n+3)*(2*n-1)))); Sum += An; ++n;
if( n > Ndop)
break;
}
printf( "%f   ",x); printf( "%f   ",f); printf( "%f   ",Sum); printf( "%e   ",fabs(f-Sum)); printf( "%i   ",n);
} 
while(scanf("%lf",&x) != EOF);
return 0;
} 


формула:http://s1.ipicture.ru/uploads/20121210/a0TEuWgR.jpg, разложение функции в степенной ряд (acos)
скарее всего,ошибка в функции. помогите,кто знает,как исправить плиз)

Автор: feodorv 10.12.2012, 21:06
Цитата(storyteller @  10.12.2012,  21:27 Найти цитируемый пост)
An =(3.14/2) - x + ...

Ну зачем же так-то? И почему 
Цитата(storyteller @  10.12.2012,  21:27 Найти цитируемый пост)
Sum=An; //nach. znach. n,An i summi ryada


Логичнее было бы 
Код
Sum = (3.1415926/2.) - x;
а затем
Код
Sum -= An;
(не суммирование!). И 
Код
An *= ...;
на каждом шаге.

Потом 
Цитата(storyteller @  10.12.2012,  21:27 Найти цитируемый пост)
n = 0
 При n=0 имеем тот самый x, который уже учли. Поэтому отсчитываем от n=1.

Ну и 
Цитата(storyteller @  10.12.2012,  21:27 Найти цитируемый пост)
(2*n+1)*(2*n+1)*x*x/((n+1)*(2*n+3)*(2*n-1))
 Что это? Откуда там (n+1)? Почему (2*n+3)*(2*n-1)???

Сравните:
Код

n = 1; An *= x*x*1*1 / (2 * 3);
n = 2; An *= x*x*3*3 / (4 * 5);
n = 3; An *= x*x*5*5 / (6 * 7);
n = 4; An *= x*x*7*7 / (8 * 9);
...


Автор: storyteller 10.12.2012, 21:43
свой вывод формулы делал на основе:
An+1=An*Tn => Tn=An+1/An
An+1 и An взято из http://s1.ipicture.ru/uploads/20121210/a0TEuWgR.jpg

я что то не совсем понял,как можно более правильно заменить формулу? :(

другими словами,я не совсем понимаю,как вывести реккурентную формулу для arccos. 

Автор: feodorv 11.12.2012, 07:35
Цитата(storyteller @  10.12.2012,  22:43 Найти цитируемый пост)
An+1=An*Tn => Tn=An+1/An

И как из этого получается
Цитата(storyteller @  10.12.2012,  21:27 Найти цитируемый пост)
An =(3.14/2) - x + (An*(2*n+1)*(2*n+1)*x*x/((n+1)*(2*n+3)*(2*n-1))));

???

Пусть отсчёт для T(n) по n идёт от 0 (n=0,1,2,3,...). Но ведь тогда должно быть так:
Код

Sum = pi/2 - A(0) - A(1) - A(2) - A(3) - ...;
A(0) = x;
A(1) = A(0) * T(0);
A(2) = A(1) * T(1);
A(3) = A(2) * T(2);


Чему тогда равно T(n) в общем случае, если 
Код

n = 0; A(1) = A(0) * x*x*1*1 / (2 * 3);
n = 1; A(2) = A(1) * x*x*3*3 / (4 * 5);
n = 2; A(3) = A(2) * x*x*5*5 / (6 * 7);
n = 3; A(4) = A(3) * x*x*7*7 / (8 * 9);
...



Вот в этом коде 
Цитата(storyteller @  10.12.2012,  21:27 Найти цитируемый пост)
An =(3.14/2) - x + (An*(2*n+1)*(2*n+1)*x*x/((n+1)*(2*n+3)*(2*n-1))));
 первая часть 
Цитата(storyteller @  10.12.2012,  21:27 Найти цитируемый пост)
(3.14/2) - x
 всё таки относится к сумме:
Код
A(0) = x;
Sum = pi/2 - A(0);
 а вторая часть 
Цитата(storyteller @  10.12.2012,  21:27 Найти цитируемый пост)
An = (An*(2*n+1)*(2*n+1)*x*x/((n+1)*(2*n+3)*(2*n-1))));
 уже похожа на рекуррентное соотношение 
Цитата(storyteller @  10.12.2012,  22:43 Найти цитируемый пост)
An+1=An*Tn
 Числитель - правильный, знаменатель - совершенно не правильный.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)