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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2017, 10:16   #1
guardi
Пользователь
 
Регистрация: 24.09.2017
Сообщений: 27
По умолчанию Бесконечная сумма и факториал

Добрый день,как здесь посчитать факториал,это нужно делать отдельно или в этом же цикле?Просто начальное значение n=0 ,факториал не считается,почему-то..И как записать -1^n?

Код:
 n:=0;
   xs1:=-1;
   xs2:=1;
   fact:=1;
   s3:=1;
   c:=s3;
    while  s3 >= e do
    begin
     n:=n+1;
     fact:=fact*n;
     xs1:=xs1*x;
     xs2:=xs2*x*x;
     s3:=xs1*xs2/fact;
     c:=c+s3;
    end;

-----------------

Код:
program number15;
var
 x,x0,hx,xn,s1,s2,s3,y,a,b,c,e,xs,xs1,xs2:real;
 k,n:integer;
 fact:longint;
begin
writeln('x0,hx,xn,e');
readln(x0,hx,xn,e);
x:=x0;
while x< xn + hx/2 do
 begin
  a:=0;
  xs:=1;
   for k:=0 to 10 do
    begin
     xs:=xs*x;
     a:=a+xs/(k+1);
    end;
  b:=0;
  xs:=1;
   for n:=1 to 8 do
    begin
     xs:=xs*x*x;
     b:=b+xs/(2*n+1);
    end;
   n:=0;
   xs1:=-1;
   xs2:=1;
   fact:=1;
   s3:=1;
   c:=s3;
    while  s3 >= e do
    begin
     n:=n+1;
     fact:=fact*n;
     writeln('fact = ',fact);
     xs1:=xs1*x;
     xs2:=xs2*x*x;
     s3:=xs1*xs2/fact;
     c:=c+s3;
    end;
 y:=a*x*x+b*x+c;
 writeln('При x = ',x,' A = ',A:2:3,' B = ',B:2:3,' C = ',C:2:3, ' ----Y = ',y:2:3);
 x:=x+hx;
 end;
end.
Изображения
Тип файла: jpg IMG_20171214_101449.jpg (36.3 Кб, 121 просмотров)

Последний раз редактировалось guardi; 14.12.2017 в 10:19.
guardi вне форума Ответить с цитированием
Старый 14.12.2017, 10:38   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

во-первых,
xs1 умножать на X не надо. нужно умножать на -1:
Код:
xs1 := xs1 * (-1);
это как раз и даст -1^n

во-вторых,
s3 в формуле имеет знак, то минус, то плюс, поэтому сравнивать с точностью надо по модулю abs(s3)>e

факториал в данном случае удобно считать в этом же цикле (как Вы и сделали).
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.12.2017, 10:44   #3
guardi
Пользователь
 
Регистрация: 24.09.2017
Сообщений: 27
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
во-первых,
xs1 умножать на X не надо. нужно умножать на -1:
Код:
xs1 := xs1 * (-1);
это как раз и даст -1^n

во-вторых,
s3 в формуле имеет знак, то минус, то плюс, поэтому сравнивать с точностью надо по модулю abs(s3)>e

факториал в данном случае удобно считать в этом же цикле (как Вы и сделали).
Посмотрите,пожалуйста,это нормально,что факториал так скачет?
Изображения
Тип файла: png Screenshot_2.png (34.4 Кб, 120 просмотров)
guardi вне форума Ответить с цитированием
Старый 14.12.2017, 10:45   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

рекуррентное выражение текущего слагаемого, зная предыдущее
Код:
A(n) :=A(n-1) * ( -x*x / n )
осталось посчитать чему будет равен начальный элемент(слагаемое).
Цитата:
(?)**0 =1 //нулевая степень ЛЮБОГО числа всегда =1
0! =1 // факториал нуля равен 1
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 14.12.2017 в 10:48.
evg_m вне форума Ответить с цитированием
Старый 14.12.2017, 10:52   #5
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,504
По умолчанию

А факториал вычислять обязательно? Или нужно только ряд посчитать.

Можно без факториала. Последующий член ряда считать через предыдущий.
Первый ( нулевой) равен 1.
Последующий равен = предыдущий умножить на (-x^2)/n

Кстати, у вас факториал типа Longint. А уже 13! = 6227020800. Уже не влезет в Longint.

Последний раз редактировалось type_Oleg; 14.12.2017 в 10:55.
type_Oleg вне форума Ответить с цитированием
Старый 14.12.2017, 10:58   #6
guardi
Пользователь
 
Регистрация: 24.09.2017
Сообщений: 27
По умолчанию

Цитата:
Сообщение от type_Oleg Посмотреть сообщение
А факториал вычислять обязательно? Или нужно только ряд посчитать.

Можно без факториала. Последующий член ряда считать через предыдущий.
Первый ( нулевой) равен 1.
Последующий равен = предыдущий умножить на (-x^2)/n

Кстати, у вас факториал типа Longint. А уже 13! = 6227020800. Уже не влезет в Longint.
Через факториал,через double записать?
guardi вне форума Ответить с цитированием
Старый 14.12.2017, 10:59   #7
guardi
Пользователь
 
Регистрация: 24.09.2017
Сообщений: 27
По умолчанию

Цитата:
Сообщение от guardi Посмотреть сообщение
Через факториал,через double записать?
Записал через double,а значение всё то же в результате)
Скриншот выше
guardi вне форума Ответить с цитированием
Старый 14.12.2017, 11:22   #8
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,504
По умолчанию

Вот вам функция для вычисления С без факториала. eps - это заданная погрешность, например 0.000001
Код:
function funC(x,eps:Double):Double;
var s,t:Double;
    n:Integer;
begin
 s:=0;
 t:=1;
 n:=1;
 repeat
  s:=s+t;
  t:=-x*x*t/n;
  Inc(n);
 until Abs(t)<eps;
 funC:=s;
end;
Если все же нужен факториал, можно его так вычислять
Код:
function factr(n:Integer):Double;
begin
 if n=0 then factr:=1 else factr:=n*factr(n-1);
end;
Тогда С сами вычисляйте.
type_Oleg вне форума Ответить с цитированием
Старый 14.12.2017, 14:41   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от guardi Посмотреть сообщение
,это нормально,что факториал так скачет?
факториал никуда у Вас не скачет. Это просто тот факториал, что остался ПОСЛЕ того, как s3 стало меньше, чем введённая вами точность.
но, очевидно, что при x=0.1 уже второй же член ряда (при n=2) получается
x*x/n! = 0.1*0.1/2 = 0.01/2 = 0.005
Вы какую точность указываете? 0.001 ?
а нужно, хотя бы, 0.0000001
это во-первых.

а во-вторых, а зачем Вы после цикла вообще выводите значение факториала?
ну ладно, я бы ещё понял, если бы Вы количество итераций выводили, которое потребовалось для подсчёта суммы ряда С
а значение факториала выводить бессмысленно.
Уберите его.

Последний раз редактировалось Serge_Bliznykov; 14.12.2017 в 14:43.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.12.2017, 16:51   #10
guardi
Пользователь
 
Регистрация: 24.09.2017
Сообщений: 27
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
факториал никуда у Вас не скачет. Это просто тот факториал, что остался ПОСЛЕ того, как s3 стало меньше, чем введённая вами точность.
но, очевидно, что при x=0.1 уже второй же член ряда (при n=2) получается
x*x/n! = 0.1*0.1/2 = 0.01/2 = 0.005
Вы какую точность указываете? 0.001 ?
а нужно, хотя бы, 0.0000001
это во-первых.

а во-вторых, а зачем Вы после цикла вообще выводите значение факториала?
ну ладно, я бы ещё понял, если бы Вы количество итераций выводили, которое потребовалось для подсчёта суммы ряда С
а значение факториала выводить бессмысленно.
Уберите его.
Понятно,я немного в коде ошибся,и изначально у меня n=0,а n=n+1 только в конце цикла перед следующим прогоном,получается,нужно сделать так?Т.к. факториал 0! равен 1

Код:
n:=0;
   xs1:=1;
   xs2:=1;
   fact:=1;
   s3:=1;
   c:=s3;
    while  abs(s3) >= e do
    begin
     if n=0 then
      fact:=1
     else 
      fact:=fact*n;
     xs1:=xs1*(-1);
     xs2:=xs2*x*x;
     s3:=xs1*(xs2/fact);
     c:=c+s3;
     n:=n+1;
    end;
guardi вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бесконечная сумма Ikaros Помощь студентам 1 27.11.2017 19:15
C, бесконечная сумма East Undia Trading Помощь студентам 0 18.10.2013 21:41
Вычисления на языке C (Бесконечная сумма...) East Undia Trading Помощь студентам 5 17.10.2013 14:54
БЕСКОНЕЧНАЯ СУММА Ania Lunee Помощь студентам 4 17.05.2012 22:41