1. Набираем команду codeby webinar. Набираем команду для организации и проведения вебинаров. Подробнее ...

    Скрыть объявление
  2. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление
  3. Получи 30.000 рублей. Для получения денег необходимо принять участие в конкурсе авторов codeby. С условиями и призами можно ознакомиться на этой странице ...

    Внимание! Регистрация авторов на конкурс закрыта.

    Скрыть объявление

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

Тема в разделе "Вопросы новичков и не только", создана пользователем Rendall, 8 сен 2012.

Статус темы:
Закрыта.
  1. Rendall

    Rendall Гость

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

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

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

    Код:
    // 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 вариант вычисления этой суммы ряда. заранее спасибо
     
  2. Whatka

    Whatka Well-Known Member

    Репутация:
    0
    Регистрация:
    9 окт 2011
    Сообщения:
    428
    Симпатии:
    4
    не только там ошибка(их больше двух даже)

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

    Rendall Гость

    Репутация:
    0
    спасибо 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">
    Код:
    // 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;
    }
     
  4. Whatka

    Whatka Well-Known Member

    Репутация:
    0
    Регистрация:
    9 окт 2011
    Сообщения:
    428
    Симпатии:
    4
    у вас сумма от k=0;
    0!=1 => первый элемент = ((x)^0)/(2*1)=0.5
    то есть
    Код:
    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
    за кота + ;)
     
  5. Rendall

    Rendall Гость

    Репутация:
    0
    огромное спасибо, вы мне очень помогли.
    P.S я люблю катофф ;)
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей