Консультация № 144850
24.09.2008, 10:58
0.00 руб.
0 3 3
Здравствуйте, помогите в програмке, заранее большое спасибо!
Dev-C++ 4
1.Вычислить сумму ряда для заданного в режиме диалога с ЭВМ |x|<1. Вычисления заканчиваются, когда очередной член ряда становится меньше 0.0001:
y=2!/x^2*3!+3!/x^4*4!+4!/x^6*5!+.....

Обсуждение

Неизвестный
24.09.2008, 11:32
общий
это ответ
Здравствуйте, Dragonlio!

Если правильно понял, член ряда имеет вид a i = (i+1)!/(x (i*2*(i+1)!) ).
Иначе (если последний факториал вне степени) - ряд расходящийся...

В приложении код.

Приложение:
#include <stdio.h>
#include <math.h>
int main()
{
double x;
scanf("X = %lg", &x);
int fact = 2; // 2!
int next = 3;
double sum = 0;
double term = 1;
do
{
term = fact;
fact *= next++;
term /= pow(x, (next-3)*2*fact);
sum += term;
} while (term > 0.0001);
printf("SUM = %g", sum);
}
Неизвестный
24.09.2008, 14:17
общий
это ответ
Здравствуйте, Dragonlio!
Общий вид членов ряда имеет следующий вид: y(i)=fact(i+1)/((pow(x,i+1)*fact(i+2))). Не ясно тока где находятся 3!,4!,5!... в степени или в знаменателе, ну раз уж скобок не стоит, пусть будет в степени.
Скомпил в MS Visual Studio 2005



Приложение:
//Определяет ввод-вывод
#include <iostream>

//Подключен для функции pow()
#include <math.h>

//Задаем стандартное пространство имен
using namespace std;

//Функция расчета факториала
double fact(int);

int main()
{
//Объявление переменных для расчета суммы
double x,
y=0.0, //Вычисление члена ряда
sum=0.0; //Сумма

//Ввод х
cout<<"BBEDITE x, |x|<1: ";
do{
cin>>x;
if(x>1||x<0) cout<<"IIOBTOPuTE IIOIIbITKY:\n";
}while(x>1||x<0);

int i=1; //итератор

//Вычисление суммы
do{
y=fact(i+1)/((pow(x,i+1)*fact(i+2)));
sum+=y;
i++;
}while(y>0.0001);

//Вывод результата
cout<<"CYMMA PABHA:\t"<<sum<<"\n";

return 0;
}

//Определение ф-ии расчета факториала
double fact(int N)
{
double factorial=1.0;
for (int j=1;j<=N;j++) factorial*= j;
return factorial;
}
Неизвестный
24.09.2008, 18:03
общий
это ответ
Здравствуйте, Dragonlio!
наверное вы все таки имели ввиду, ряд: y=2!/(x^2*3!)+3!/(x^4*4!)+4!/(x^6*5!)+.....
т.к. иначе ряд монотонно возрастает, т.к. числитель всегда больше единицы, а знаменатель всегда меньше
но даже этот ряд расходится и выполнить задание не возможно, доказательство в приложении.
и судя по доказательству у вас еще и условие должно быть не |x| < 1, а как раз таки наоборот |x| > 1
вот для этих исправленных начальных данных и представлена программа (под доказательством)

Приложение:
Доказательство:
Запишем общий член ряда: s(n) = (n+1)!/((x^(2*n) * (n+2)!)
s(n+1) (n+2)!/((x^(2*(n+1)) * (n+3)!)
---------- = -----------------------------------------------
s(n) (n+1)!/((x^(2*n) * (n+2)!)

(n+2)! * x^(2*n) * (n+2)!
= ---------------------------------------------
(n+1)! * x^(2*(n+1)) * (n+3)!

n + 2
= ----------------------------
x^2 * (n + 3)

n + 2
lim ---------------------------- =
n->inf x^2 * (n + 3)


1
= --------, что при |x| < 1
x^2


всегда больше единицы и согласно вытекающему из условия сходимости Коши признаку Даламбера этот ряд расходится


// программа с исправленным рядом и условием
#include <iostream>
#include <math.h>

float seriesSum(float x, float eps)
{
float sum = 0.f;
x *= x;
float xx = 1.f;
for(int i = 3; i < 1000000; ++i){
xx *= x;
float s = 1.f / (xx * (float)i);
sum += s;
if(s < eps)
break;
};
return sum;
}

int main(int argc, char* argv[])
{
float x = 0.f;
while(fabs(x) <= 1.f){
std::cout << "Input x, |x| > 1\n x = ";
std::cin >> x;
}

std::cout << "sum = " << seriesSum(x, 0.0001f);

return 0;
}
Форма ответа