Вычисление Суммы Ряда С Заданной Точностью

  • Автор темы Rendall
  • Дата начала
Статус
Закрыто для дальнейших ответов.
R

Rendall

#1
есть задача
"Даны действительные x,e(x!=0, e>0) и целые k,a,n числа. Вычислить с
точностью e сумму и указать количество учтенных слагаемых. Считать, что требуемая точность достигнута, если вычислена сумма нескольких первых слагаемых и очередное слагаемое оказалось по модулю меньше, чем e , - это и все последующие слагаемые можно уже не учитывать. Проверить правильность вычислений на тестовых примерах, используя возможности отладчика, проследить изменение значений слагаемых суммы ряда, выполнив отладку цикла."

есть формула суммы ряда Ряд.PNG

есть ПОЧТИ правильный код

C++:
// ConsoleApplication1.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <iostream>
#include <cmath>
#include <clocale>
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
setlocale(0,"Rus");
double x, e;
cout<<"Введите значение аргумента x = ";
cin>>x;
cout<<"Введите значение точности вычисляемой суммы (e>0) e = ";
cin>>e;
//в переменной summa накапливаем сумму ряда
double summa = 0;
//точность E должна быть больше нуля
if (e>0)
{
//вычисляем первое слагаемое ряда
//pow(x, y) - функция возведения в степень, x - основание степени, y -показатель степени
int k = 1;
double summand = pow(x, k*2);
//вычисление суммы ряда
while (summand > e && k <= INT_MAX)
{
cout<<"k = "<<k<<"\t"<<summand<<"\n";
summa += summand;
k++;
summand *= x;
summand /= 2*k; //<<ТУТ ОШИБКА
}
cout<<"Сумма ряда = "<<summa<<"\n";
cout<<"Количество учтенных слагаемых = "<<k-1<<"\n";
}
else
cout<<"Ошибка ввода. Точность больше нуля!\n";
system("pause");
return 0;
}
и есть конечно же проблема, а именно, в цикле числитель (summand) должен делится на 2*k!(факториал), а получается что-то совсем не то, поскольку при проверке 3й и последующие члены ряда определяются неверно. пожалуйста поправьте код и, если не затруднит, напишите еще 1 вариант вычисления этой суммы ряда. заранее спасибо
 

Вложения

W

Whatka

#2
не только там ошибка(их больше двух даже)

Так как делитель 2 находится в каждом элементе ряда его можно вынести за знак суммы
факториал получается просто:
C++:
k=1;
{
текущий элем. *= (...)/k;
k++;
}
//
 
R

Rendall

#3
спасибо Whatka.

UPD. изменил код, вроде работает, проверьте пожалуста нет ли ошибок ;)

<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Code</div></div><div class="sp-body"><div class="sp-content">
C++:
// ConsoleApplication1.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <iostream>
#include <cmath>
#include <clocale>
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
setlocale(0,"Rus");
double x, e;
cout<<"Введите значение аргумента x = ";
cin>>x;
cout<<"Введите значение точности вычисляемой суммы (e>0) e = ";
cin>>e;
double summa = 0; //в переменной summa накапливаем сумму ряда
if (e>0) //точность E должна быть больше нуля
{
//вычисляем первое слагаемое ряда
int k = 1;
double k_element = pow(x, 2*k);
//вычисление суммы ряда
while (k_element > e && k <= INT_MAX)
{
cout<<"k = "<<k<<"\t"<<k_element<<"\n";
k_element *= x;
k_element /= k;
summa += k_element/2;
k++;
}
cout<<"Сумма ряда = "<<summa<<"\n";
cout<<"Количество учтенных слагаемых = "<<k-1<<"\n";
}
else  
cout<<"Ошибка ввода. Точность больше нуля!\n";
system("pause");
return 0;
}
 
W

Whatka

#4
у вас сумма от k=0;
0!=1 => первый элемент = ((x)^0)/(2*1)=0.5
то есть
C++:
double summa = 0.5;
double k_element=1;
int k = 1;
while (k_element > e && k <= INT_MAX)
{
k_element *=(x*x)/k;
summa += k_element;
k++;
}
summa /=2;
//
p.s
за кота + ;)
 
R

Rendall

#5
у вас сумма от k=0;
0!=1 => первый элемент = ((x)^0)/(2*1)=0.5
то есть
C++:
double summa = 0.5;
double k_element=1;
int k = 1;
while (k_element > e && k <= INT_MAX)
{
k_element *=(x*x)/k;
summa += k_element;
k++;
}
summa /=2;
//
p.s
за кота + ;)
огромное спасибо, вы мне очень помогли.
P.S я люблю катофф ;)
 
Статус
Закрыто для дальнейших ответов.