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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2012, 17:39   #1
Lemoral
 
Регистрация: 20.11.2012
Сообщений: 6
По умолчанию Гиперболический синус

Необходимо вычислить с помощью ряда значение гиперболического синуса sh(x), в задаваемом интервале, с задаваемым шагом изменением х, и начальным значением х (данные вводим с клавиатуры).
Ряд разложения: (x^(2n+1)) / (2n+1)!
Пишу так:
Код:
#include <stdio.h>
#include <conio.h>
#include <math.h>

int main()
{
	const double eps = 0.0001; // точность вычислений
	double x, a, b, l, y, f, p, sh ; // значение х, интервал от а до b, шаг, выражение под суммой, факториал, выражение (2n+1), сумма ряда		
	int n,k;

	f = 1;
	sh = 0;
	y = 1;

	printf("enter interval\n");
	scanf("%lf, %lf", &a, &b);
	printf("enter step\n");
	scanf("%lf", &l);
	printf("enter x\n");
	scanf("%lf", &x);

for (k=a; (a < x && x < b); k++)
{
	for (n=0; y > eps; n++)
	{
		p = 2*n+1;
		f=f*p;
		y = pow(x,p) / f;
		sh+=y;		
	}
x+=l;
printf("sh = %.3f\n ",sh);
}
	getch();
	return 0;
}
Программа работает не корректно. Во первых, выдается одно и то же значение sh, хотя шаг к x прибавляется, а во вторых, считается и то не правильно.
В чем ошибка?
Lemoral вне форума Ответить с цитированием
Старый 20.11.2012, 17:46   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

(2n+1)! = (2n-1)! * 2n * (2n+1). Это раз.
Кто такой k и зачем ему нужен k++, моя ни черта не понял, это два.
Если Вы в каждой итерации будете заодно выводить f, будет Вам три.
Ну, и eps ни разу не точность вычислений, и распространённость этого ляпа меня уже раздражает. Это четыре.
Abstraction вне форума Ответить с цитированием
Старый 20.11.2012, 17:56   #3
Lemoral
 
Регистрация: 20.11.2012
Сообщений: 6
По умолчанию

По k идет внешний цикл, где к x прибавляется шаг l, до тех пор пока x находится в интервале a,b.
А что с точностью и факториалом не так?
Lemoral вне форума Ответить с цитированием
Старый 20.11.2012, 18:12   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
По k идет внешний цикл, где к x прибавляется шаг l, до тех пор пока x находится в интервале a,b.
Мой вопрос был - зачем там k, если она не используется? Напоминаю, что a) в цикле for любые части могут быть пустыми и б) помимо цикла for существует ещё цикл while.
Цитата:
А что с точностью и факториалом не так?
С факториалом... проще на примере. При n=0, p=2*0+1=1, f=1*1=1. Это 1!, всё правильно. Затем при n=1, p=2*1+1=3, f=1*3=3. Но 3!=6, вот засада. Другими словами, вы пропускаете чётные множители.

С точностью всё заметно хуже - судя по постам здесь, это поразительно распространённая ошибка. Вот, к примеру, код:
Код:
double Harmonic(double eps){
  double sum=0, add=1;
  for(int n=1; add>eps; ++n){
    add = 1.0/n;
    sum += add;
  }
  return sum;
}
Как можно видеть, мы считаем 1+1/2+1/3+1/4+...+1/n+..., пока очередное слагаемое не станет меньше либо равно eps. Вопрос: как по-Вашему, можем ли мы сказать, что мы нашли сумму такого бесконечного ряда с точностью eps?
Abstraction вне форума Ответить с цитированием
Старый 20.11.2012, 19:41   #5
Lemoral
 
Регистрация: 20.11.2012
Сообщений: 6
По умолчанию

и, каким макаром тогда действовать?
Lemoral вне форума Ответить с цитированием
Старый 20.11.2012, 20:02   #6
Lemoral
 
Регистрация: 20.11.2012
Сообщений: 6
По умолчанию

Код:
#include <stdio.h>
#include <conio.h>
#include <math.h>

int main()
{
	const double eps = 0.0001; // точность вычислений
	double x, a, b, l, y, f, sh ; // значение х, интервал от а до b, шаг, выражение под суммой, факториал, сумма ряда		
	int n,k;

	f = 1;
	sh = 0;
	y = 1;

	printf("enter interval\n");
	scanf("%lf, %lf", &a, &b);
	printf("enter step\n");
	scanf("%lf", &l);
	printf("enter x\n");
	scanf("%lf", &x);

while (a < x && x < b)
{
	for (n=0; y > eps; n++)
	{
		f=f*(2*n+1)*(2*n-1)*2*n;
		y = pow(x,2*n+1) / f;
		sh+=y;		
	}
x+=l;
printf("sh = %.3f\n ",sh);
}
	getch();
	return 0;
}
Lemoral вне форума Ответить с цитированием
Старый 20.11.2012, 21:01   #7
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

1) Теперь Вы должны заметить, что функция всё растёт, и растёт, и растёт... А разгадка проста: суммировать ряд - это прибавлять все члены к некоторому начальному значению. На первой итерации оно 0 (что правильно), а на второй - sh(x) (что неправильно).

2) Если требуют именно "найти сумму с точностью до...", а не "сложить все члены не меньше...", то это неприятность. Терпимая в данном случае: сумма членов вида x^(2n+1)/(2n+1)! при n>N может быть ограничена сверху при N>x/2 выражением E(x, N) = x^(2N+1)/((2N-1)!*(4N^2-x^2)). Когда n станет больше x/2 И E(x, n) станет меньше e, накопленная сумма будет достаточно точной.
Если интересно, как получается выражение - возьмите хвост последовательности (x^(2n+1)/(2n+1)! и далее), и попробуйте вынести первый член за скобки, а для слагаемых в скобках подобрать величины больше их, образующие геометрическую прогрессию.
Abstraction вне форума Ответить с цитированием
Старый 21.11.2012, 00:11   #8
Lemoral
 
Регистрация: 20.11.2012
Сообщений: 6
По умолчанию

Да, нужно "сложить все члены не меньше". К какому тогда начальному значчению прибавлять?
Lemoral вне форума Ответить с цитированием
Старый 21.11.2012, 00:46   #9
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Да, нужно "сложить все члены не меньше". К какому тогда начальному значчению прибавлять?
Тогда Ваше условие вполне подходит, просто не надо называть eps "точностью вычислений".
Abstraction вне форума Ответить с цитированием
Старый 21.11.2012, 01:17   #10
Lemoral
 
Регистрация: 20.11.2012
Сообщений: 6
По умолчанию

Ну да, это понял я, тогда каким макаром прибавлять, и к какому значению?
Lemoral вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Логарифм по основанию делёный на гиперболический синус. Delphi Dilex Помощь студентам 9 11.12.2011 15:53
Гиперболический косинус Ewynn Помощь студентам 0 05.11.2011 13:14
Обратный гиперболический синус Lofty Помощь студентам 2 07.10.2008 18:20
гиперболический косинус lag@dinfo.ru Помощь студентам 2 08.12.2007 13:51