|
Вопрос # 1 014/ вопрос открыт / |
|
Здравствуйте, эксперты! помогите Написать подпрограмму для вычисления с заданной точностью суммы бесконечного ряда 1 - x + x2/2! - x3 /3! + x4 /4! - …, для x<0
 |
Вопрос задала: 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!!!
Приложение: Переключить в обычный режим- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls;
-
- type
- TForm1 = class(TForm)
- ListBox1: TListBox;
- Button1: TButton;
- procedure Button1Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- var
- Form1: TForm1;
-
- implementation
-
- {$R *.dfm}
-
- procedure TForm1.Button1Click(Sender: TObject);
- var s,x,xn,eps:real;
- i:integer;
- f:longint;
- begin
-
-
-
- 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;
-
- xn:=xn*x;
- inc(i); f:=f*i;
- end;
-
- end;
-
- end.
 |
Ответ отправил: Николай Рубан (статус: 10-ый класс)
Время отправки: 27 октября 2007, 13:18
|
Мини-форум вопроса
Всего сообщений: 2; последнее сообщение — 27 октября 2007, 12:05; участников в обсуждении: 1.
|
Dron (статус: Студент), 27 октября 2007, 12:00 [#1]:
И ещё: степень числа обычно обозначается знаком "^", т.е. квадрат x записывается как x^2. Вы же записали это как x2. Такая запись неверна.
С уважением.
|
|
Dron (статус: Студент), 27 октября 2007, 12:05 [#2]:
Ой, нет, я ошибся. Только сейчас заметил. Это не ряд функции ex. Там ведь идёт чередование знаков...
Исправить несложно - добавить в функцию расчёта члена ряда в конце строку:
if not(Odd(N)) then Result:=-Result;
С уважением.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|