Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 014

/ вопрос открыт /

Здравствуйте, эксперты! помогите Написать подпрограмму для вычисления с заданной точностью суммы бесконечного ряда 1 - x + x2/2! - x3 /3! + x4 /4! - …, для x<0

natasha Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задала: natasha (статус: Посетитель)
Вопрос отправлен: 27 октября 2007, 11:30
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Dron

Здравствуйте, natasha!
Сначала напишем функцию, вычисляющую n-ый член ряда по заданному x и n:

function GetElement(N: Integer; X: Real): Real;
begin
  if N = 1 then
    Result:=1
  else
    Result:=Power(X,N-1)/Factorial(N-1);
end;
Для вычисления факториала воспользуемся такой функцией:
function Factorial(X: Integer): LongInt;
var i: integer;
begin
  Result:=1;
  for i := 2 to X do
    Result:=Result*i;
end;
Использованная в примере функция Power находится в модуле Math, который нужно подключить, добавив его название в раздел uses.
А далее вспоминаем курс математического анализа - остаток ряда начиная с n-го члена не больше самого n-го члена. Этим и пользуемся:
procedure TForm1.Button1Click(Sender: TObject);
var S,X,A,E: Real; N: Integer;
begin
  X:=StrToFloat(Edit1.Text); {Число X}
  E:=StrToFloat(Edit2.Text); {Точность вычислений}
  N:=1;
  A:=GetElement(1,X);
  repeat
    S:=S+A;
    Inc(N);
    A:=GetElement(N,X);
  until A < E;
  Label1.Caption:=FloatToStr(S);
end;
В данном примере значение x вводится в Edit1, в Edit2 вводится точность вычисления (например, 0.0001). Полученная сумма выводится в Label1.
Ну и наконец, проверить точность достаточно просто - данный ряд является разложением функции ex, т.е. если взять x = 1, то сумма ряда будет равна самому числу e.
---
Добавлено: ряд, рассмотренный в примере, является рядом функции ex. Ряд, указанный в вопросе - знакопеременный, он рядом этой функции не является. Подробности в мини-форуме вопроса.

Ответ отправил: Dron (статус: Студент)
Время отправки: 27 октября 2007, 11:59

Ответ #2. Отвечает эксперт: Николай Рубан

Здравствуйте, natasha!

Обращаю Ваше внимание на то, что в предыдущем ответе допущена неточность сумма находится по такому ряду:
1 + x + x2/2! + x3 /3! + x4 /4! + …
хотя по условию рад знакопеременный!!!
В результате сумма будет находиться не верно!

Вот привожу свой вариант решения.
На форме рекомендую расположить два объекта - ListBox1: TListBox и Button1: TButton;

Процедура расчета суммы при нажатии на кнопку:
procedure TForm1.Button1Click(Sender: TObject);
var s,x,xn,eps:real;
i:integer;
f:longint;
begin
eps:=0.0001; //точность вычислений
x:=1; //начальное значение х

s:=1;
xn:=x; f:=1; i:=1;
while abs(xn/f) > eps do
begin
s:=s+(-ord(odd(i))+ord(not odd(i)))*xn/f;
ListBox1.Items.Add(Format('an=%.5f xn=%.2f f=%d',[xn/f,xn,f])); //выводим промежуточные вычисления
xn:=xn*x;
inc(i); f:=f*i;
end;
ListBox1.Items.Add(Format('%.5f',[s])); //выводим непосредственно найденную сумму
end;

В приложении к ответу Вы найдете полный исходник модулю программы.
P.S. Обращаю Ваше внимание на то, что я значения переменных x и eps определяю непосредственно в программе, если Вам необходимо вводить их в ручную, то просто добавте необходимые обекты и пару строк кода.

Good Luck!!!

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, StdCtrls;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. ListBox1: TListBox;
  12. Button1: TButton;
  13. procedure Button1Click(Sender: TObject);
  14. private
  15. { Private declarations }
  16. public
  17. { Public declarations }
  18. end;
  19.  
  20. var
  21. Form1: TForm1;
  22.  
  23. implementation
  24.  
  25. {$R *.dfm}
  26.  
  27. procedure TForm1.Button1Click(Sender: TObject);
  28. var s,x,xn,eps:real;
  29. i:integer;
  30. f:longint;
  31. begin
  32.  
  33.  
  34.  
  35. s:=1;
  36. xn:=x; f:=1; i:=1;
  37. while abs(xn/f) > eps do
  38. begin
  39. s:=s+(-ord(odd(i))+ord(not odd(i)))*xn/f;
  40.  
  41. xn:=xn*x;
  42. inc(i); f:=f*i;
  43. end;
  44.  
  45. end;
  46.  
  47. end.


Ответ отправил: Николай Рубан (статус: 10-ый класс)
Время отправки: 27 октября 2007, 13:18


Мини-форум вопроса

Всего сообщений: 2; последнее сообщение — 27 октября 2007, 12:05; участников в обсуждении: 1.
Dron

Dron (статус: Студент), 27 октября 2007, 12:00 [#1]:

И ещё: степень числа обычно обозначается знаком "^", т.е. квадрат x записывается как x^2. Вы же записали это как x2. Такая запись неверна.
С уважением.
Dron

Dron (статус: Студент), 27 октября 2007, 12:05 [#2]:

Ой, нет, я ошибся. Только сейчас заметил. Это не ряд функции ex. Там ведь идёт чередование знаков...
Исправить несложно - добавить в функцию расчёта члена ряда в конце строку:
if not(Odd(N)) then Result:=-Result;
С уважением.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:58
Выполнено за 0.05 сек.