Перейти к публикации
Дедовский городской форум
AK-47

рекуррентный алгоритм. найти сумму ряда //C++

Рекомендованные сообщения

в интернете пока что никто не помог. решил попытать счастье на нашем форуме.

вообщем задание: составить алгоритм и программу нахождения суммы ряда с заданной точностью E. использовать рекуррентные соотношения при вычислении очередного элемента ряда. Предусмотреть вычисление по контрольной формуле.

суммы рассматреваемых рядов конечны для значений X,абсолютная величена которых меньше единицы,причем сумма начальных элементов ряда отличаеться от суммы бесконечного ряда на величину,которая не превосходит абсолютной велечины E. абсолютная величена всех отброшенных членов ряда меньше E.

 

post-7713-1324229157_thumb.jpg

 

Собственно не совсем понятно что делать с контрольной формулой. Как я понял контрольная формула считает сумму бесконечного ряда. Но что то не сходиться.

Вот мой код:

#include <iomanip>
#include <conio.h>
#include <math.h>//математические функции
#include <iostream>//input output
#include <stdlib.h>
using namespace std;
#define E 0.001
int main()
{int i=1,k;
float slag=1,x,f1=1,f2=1,s=0,control=0;
do{
cout<<"vvedite x<1"<<endl;
cin>>x;}
while(fabs(x)>=1);
control=(2-exp(powf(-(x),2))-cos(x));
while(fabs(slag)>=E)
 {for(k=1;k<=i;k++){
						 f1=f1*k;
						 };
  for(k=1;k<=2*i;k++){
						  f2=f2*k;
						  };
  slag=(powf(x,2*i))*(1/f1 + 1/f2);
  if(i%2!=0){
			   s=s+slag;} 
				else 
			  {s=s-slag;};
  i++;
};
cout<<s<<endl;
cout<<control;
_getch();
return 0;
}

 

программа вроде бы работает,но не сходиться моя сумма и контрольная формула(а как я понял они должны сходиться или отличаться на число меньше E)

помогите,кто чем сможет)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

1. powf(-(x),2) - неправильно жеж ты любое отрицательное число возводишь в квадрат, согласно скану должно быть

2-exp(-1*powf(x,2))-cos(x)

 

2. slag=(powf(x,2*i))*(1/f1 + 1/f2);

if(i%2!=0){

s=s+slag;}

else

{s=s-slag;};

- это вообще какой-то крах. Зачем?

slag += powf(-1, 2*i)*powf(x,2*i)*(1/f1 + 1/f2) - так у тебя два вызова функции, без ветвлений и делений.

 

3. Вопрос в вашем учебном заведении прям вот так вот позволяют использовать перенаправление вывода и крестовые библиотеки? Тут не нужны средства си++.

 

4. ты когда свой код выставляешь на всеобщее обозрение хоть его отформатируй чтоли по людски. Или в стиле M$ или в стиле гугла, или в своем НО ОДНООБРАЗНОМ чтобы его можно было переформатировать нажав три кнопки.

 

5. Вот решение на коленке с оригинальными названиями переменных ТРАНСЛИТОМ сделанное за 5 минут НЕ ПРЕТЕНДУЮЩИЕ НА ИДЕАЛЬНЫЙ КОД.

 

post-638-1324276092_thumb.jpg

post-638-1324276100_thumb.jpg

post-638-1324276107_thumb.jpg

 

ПОЧЕМУ КАРТИНКИ????? ну хоть переписание будет закреплением очень важной темы, сходимости рядов и рекуррентных формул.

 

Надеюсь помог.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо,большое. Замечания по поводу внешнего вида кода попробую учесть... Ошибку с (-x^2) в контрольной формуле я исправил. вот только по поводу slag += powf(-1, 2*i)*powf(x,2*i)*(1/f1 + 1/f2) не уверен,ведь второй член должен быть отрицательным,а он получаеться положительным. Или я не прав? По поводу библиотек-да. Нам собственно только их и давали,и боюсь что использование других они нарекут ересью,и сожгут меня на костре. а чем они плохи? Спасибо за помощь,и советы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не прав:) там идет чередование знака. удачи на сдачи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

тут такое дело... мне оказываеться нужно это реализовать с помощью рекурсии... я вот что то не допру как. Сенсей Maksim, не поможите ли вы мне понять это?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ээээ, рекурсия это рекурсия. это ясно, не ясно каким боком она тут... факториал сичтать рекурсией? или всю формулу ряда. Я на бумаги погонял ряд, не могу его следующий член выразить через предведущий.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

unsigned int fact(unsigned int i)
{
if(i == 1)
	return 1;
else
	return i*fact(i - 1);
}

float sum(float x, unsigned int i)
{
if(i == 1)
	return pow(x,2)*1.5;
else
	return sum(x,i-1) + pow(-1, i + 1) * pow(x,2 * i) * (1.0/fact(i) + 1.0/fact(2*i));		  
}

Факториал и сумма ряда рекурсией.

Изменено пользователем ArchDevil

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

тебе же человек сверху написал решение через рекурсию(которая тут не пляшет). Оно верное на 100500. ТОлько добавить проверку слагаемого на превышение епсилон.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
тебе же человек сверху написал решение через рекурсию(которая тут не пляшет). Оно верное на 100500. ТОлько добавить проверку слагаемого на превышение епсилон.

я не спорю о его верности,просто фишка в том что я не до конца разобрался в названии лабы... Я сказал преподу что сдаю "рекурсию" и она собственно искала там её и не нашла,что не удивительно. На самом же деле лаба "вычисление с помощью реккурентных формул" что там и присутствует. Просто давалось это всё в одной лекции и я сглупил. И к тому же,к тому времени мы еще не умели делать функции(теперь умеем,и с этим отдельный геморой :mellow: ). вот как то так.

Изменено пользователем AK-47

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

хм, поэтому я тебе написал решение в лоб. Рекурсия тут не пляшет:) реккурентная формула != рекурсия.

 

Сдал лабу-то?

 

Преподу передай то, что подход тогда не умели сейчас за умели уродский и неправильный,- как бывших препод говорю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
хм, поэтому я тебе написал решение в лоб. Рекурсия тут не пляшет:) реккурентная формула != рекурсия.

 

Сдал лабу-то?

 

Преподу передай то, что подход тогда не умели сейчас за умели уродский и неправильный,- как бывших препод говорю.

ну как.. У нас там 2 препода принемают... Одна подошла сказла все неверно,вторая подошла повтыкала,сказала плюс поставить. Но там система такая что по проге еще отчет нужно сделать. Там билебирда случилась и он стерся,так что осталось только сдать отчет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Напишу сдесь,дабы не захламлять форум темами. Возникла проблемма. Нужно сделать в программе "форматированный" вывод.

Сформулировано вот как:Вывод результатов на экран – форматированный. Если выводится массив, то в первой строке – порядковые номера элементов, а строго под ними – значения соответствующих элементов; в начале строки номеров – слово «Номера:», в начале строки элементов – слово «Элементы:».

у меня вышло вот как:

post-7713-1329992076_thumb.jpg

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

80 знакомест на 25 строк текстовый режим с этим ничего не поделаешь.

 

делай в столбик

НОМЕРА | ЭЛЕМЕНТЫ

__________________

12 | 2342342.2

34 / 2342ю23

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
80 знакомест на 25 строк текстовый режим с этим ничего не поделаешь.

 

делай в столбик

НОМЕРА | ЭЛЕМЕНТЫ

__________________

12 | 2342342.2

34 / 2342ю23

Спасибо. С перподами трудно спорить,но придеться)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ну у тебя в примере 20 штук, впринципе если табуляцию сделать меньше может и влезет в экран. В консолях нет горизонтального скроллинга.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Еще один вопрос в постижении языка... Есть программа с 3-мя пунктами меню. Доступ в какой либо пункт осуществляеться путём ввода его № и нажатия ENTER. Надо сделать так,что бы входил в меню без подтверждения. Что то у меня даже мыслей нет,как... Не подскажите?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

тут такая беда... Вот кусочек:

while(!_kbhit());
printf("\n Была нажата клавиша (%c)\n", getch());
cout<<"Была нажата клавиша "<<_getch()<<endl;
switch (_getch())

где printf выводит клавишу которую нажал,а cout выводит её код,или что то такое,вообщем 1 это 49,2-50 и т.д. Это почему так? switch из-за этого не хочет работать...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

_getch() возвращает интовый код символа, в принтфе ты ему явно указываешь, что это символ(%с), поэтому он и печатает как символ. А сout получает и печатает int. Делай так в свитче, если не знаешь точного код нужного тебе символа:

case (int)'A':

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
_getch() возвращает интовый код символа, в принтфе ты ему явно указываешь, что это символ(%с), поэтому он и печатает как символ. А сout получает и печатает int. Делай так в свитче, если не знаешь точного код нужного тебе символа:

case (int)'A':

спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

и вот снова я со своими нубовопросами. Допустим есть строка:

f.open(FN,ios_base::out|ios_base::binary);

что значит параметр ios_base::binary. В хелпе ничего кроме того что это режим открытия файла... Препод сказал капать глубже...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

в хелпе как раз все есть... это режим открытия файла,- бинарный или двоичный. В этом режиме с файлом работа идет с байтами, никаких символов в этом режиме нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

благодарю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

×
×
  • Создать...