Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2013, 04:37   #1
ЛенаОвсянникова
Новичок
Джуниор
 
Регистрация: 24.09.2013
Сообщений: 1
По умолчанию Наработки С++ (сумма ряда и диапазон значений)

Помогите пожалуйста с кодом. Задали лабу по программирвоанию, а мы его учим то только 3 недели (((.
Задание звучит так:
Вычислить с точностью E сумму ряда и указать количество учтенных слагаемых. Считать, что требуемая точность достигнута, если вычислена сумма нескольких первых слагаемых и очередное слагаемое оказалось по модулю меньше, чем E , - это и все последующие слагаемые можно уже не учитывать. Oпределить диапазон возможных значений аргументов.

Этот кошмарный ряд выглядит вот так:
http://programmersforum.ru/attachmen...1&d=1379981378

Понятно что ряд сходится и при k стремящемся к бесконечности предел его стремится к нулю. Но я не уверена что правильно вообще выстроила логику задачи на С++. Помогите пожалуйста с кодом.Буду благодарна любым подсказкам

Код:
#include "stdafx.h"
#include <cmath>
#include <clocale>
#include <iostream>

using namespace std;

int  fuct(int k);
float Pow(float a,int k);
float K(int k);

int _tmain(int argc, _TCHAR* argv[])

{

setlocale(0, "Rus");

float x, e;
cout<<"Введите значение аргумента x = ";cin>>x;
cout<<"Введите значение точности вычисляемой суммы (e>0) e = ";
cin>>e;

float summa = 0;
//точность E должна быть больше нуля
if (e>0){
  bool flag=true;
	int x=1;
	float summa=K(x);
	while (flag)
	{
		float pred=K(x);
		float prev=K(x+1);
		summa+=prev;
		if((fabs(pred)-fabs(prev))<=e)
			flag=false;
		i++;
	}

cout<<"Сумма ряда = "<<summa<<"\n";
cout<<"Количество учтенных слагаемых = "<<k-1<<"\n"; } else
cout<<"Ошибка ввода. Точность больше нуля!\n";
getchar();
return 0;
}

float K(int k)
{
	return Pow(-1,k)*Pow(x,k+2)/(k+1)*fuct(k)); }

int  fuct(int k)
{
	if((k+2)==0 || (k+2)==1) return 1;
	
	else
	{
		int s=1;
		for(int i=1;i<=k;i++)
			s*=i;
		k=s;
	}
	return k;
}
float Pow(float x,int k)
{
	float s=x;
	if(k==0)
		return 1;
	for(int i=1;i<k;i++)
			s*=x;
	if(k>0)
		return s;
	return 1/s;
}
Изображения
Тип файла: jpg ВАРИАНТ.jpg (14.1 Кб, 102 просмотров)
ЛенаОвсянникова вне форума Ответить с цитированием
Старый 24.09.2013, 10:00   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Но я не уверена что правильно вообще выстроила логику задачи на С++
Для начала запусти программу. Что она выдаст? Сравни с расчетами на листике. Если совпадает то все правильно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.09.2013, 17:17   #3
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

А где сама функция? Ну то есть функция, которую разложили в ряд? Вот здесь хорошо написано: http://pers.narod.ru/algorithms/cpp_seriescount.html

Вот ещё: http://programmersforum.ru/showpost....7&postcount=13

P.S. Чтобы рисунок отображался, его нужно поместить в тег IMG (кнопка на панели "вставить рисунок")

Последний раз редактировалось 8Observer8; 24.09.2013 в 17:23.
8Observer8 вне форума Ответить с цитированием
Старый 24.09.2013, 20:52   #4
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,315
По умолчанию

1.
Цитата:
Понятно что ряд сходится и при k стремящемся к бесконечности предел его стремится к нулю.
Это не так.
В пределе к нулю стремится значение элемента ряда. Сумма элементов ряда имеет конкретное значение, которое будет равно нулю только при x=0.

Цитата:
Но я не уверена что правильно вообще выстроила логику задачи на С++
Я тоже считаю, что логика выстроена неверно. Причина в том, что непосредственное вычисление элемента ряда будет неэффективным способом.
Правильным будет такой подход.
2. Вычисляем каждый элемент ряда с использованием рекурентного соотношения: am+1 = Mnog*am
Значение для Mnog можем вычислить, если запишем отношение элементов ряда и подставим в это отношение соотвтетствующие значения:
Mnog = am+1/am = [(-1)^(m+1)*x^(m+3)*(m+1)*(m+2)!]/[(m+2)*(m+2)!*(m+3)*(-1)^m*x^(m+2)] = -x*(m+1)/((m+2)*(m+3)).
Будет лучше, если это отношение элементов ряда Вы распишите и разберётесь почему это так.
Например, откуда появиля в знаменателе множитель (m+3) ?

Первый элемент ряда равен x^2/2.
Код:
// Вначале инициализируем x
// Это может быть ввод с клавиатуры или ввод нач. и конеч. значений с указанием шага ...
an = pow(x,2)/2;
Sum = Sum + an;
n = 0;
do
    Mnog = -x*(n+1)/((n+2)*(n+3);
    an = an * Mnog;
    Sum = Sum + an;
    n = n + 1;
While an > Eps;
// Тут у нас вычисленное значение ряда с точьностю Eps
// а так же и число суммированных членов
Фрагмент не компилировался и может содержать ошибки. Это только идея как ...

Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Маскимальная сумма последовательных значений из ряда vdl Microsoft Office Excel 12 12.08.2012 00:49
Диапазон значений AquaticSoul Общие вопросы C/C++ 9 22.03.2010 13:52
отфильтровать диапазон значений RaMoNeZz БД в Delphi 8 18.02.2009 20:25
Сумма за переменный диапазон maxxBez Microsoft Office Excel 2 05.11.2008 10:00