• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

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

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

Rendall

есть задача
"Даны действительные 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 находится в каждом элементе ряда его можно вынести за знак суммы
факториал получается просто:
C++:
k=1;
{
текущий элем. *= (...)/k;
k++;
}
//
 
R

Rendall

спасибо 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

у вас сумма от 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

у вас сумма от 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 я люблю катофф ;)
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!