3.2. Создание программы «Степенные ряды» Задача. Необходимо рассчитать значения функций ex и ln(x), заданных с помощью рядов, с определенной точностью. Точность и аргумент функции вводятся с клавиатуры. Результат работы сравнить со значениями стандартных функций.
Формулы разложения в ряд экспоненты и логарифма представлены в табл. 3.4.
Таблица 3.4
| Функция
| Разложение в ряд
| Стандартная функция
| Замечания
| exp(x)
|
| Exp(x)
| –
| ln(x)
|
| Lnxp1(x+1)
| Необходим модуль Math
|x|<1
| Примерный вид окна программы представлен на рис. 3.4.
Процесс создания программы происходит по следующему алгоритму:
Запустить Delphi.
Сохранить проект как «Work3», модуль – «Main».
Изменить свойства окна: заголовок «Степенные ряды» Caption.
С оздать поля ввода для значений X и погрешности Е. Считать, что все числа целые, порядок чисел задавать программно:
взять 2 элемента SpinEdit, вкладка Samples, значок ;
назвать (свойство Name) один SEValueX – для ввода X, другой SEValueE – ввод E;
настроить минимальные значения элементов на 0 MinValue;
настроить максимальное значение для элемента SEValueX – 9, для SEValueE – 14 MaxValue;
изменить шаг дискретизации на 1 Increment.
Добавить 2 элемента для вывода результатов – функция, рассчитанная с помощью ряда, и функция, рассчитанная с помощью стандартной функции:
добавить 2 элемента Edit, вкладка Standard, значок ;
назвать элементы (свойство Name) для вывода рассчитанной функции ERFun, для стандартной ESFun. Изменить свойство Text на 0 (по умолчанию результат равен «0»);
добавить метки для обозначения вводимых и выводимых величин:
изменить заголовки (Caption) меток:
для поля ввода X – «Введите Х»;
для ввода погрешности «Введите погрешность 10^-Е» (погрешность вводить как количество знаков после запятой, например, число 3 будет обозначать погрешность 0.001);
для вывода расчетного значения – «Рассчитанная функция»;
для вывода стандартного значения функции – «Стандартная функция».
Так как будут рассчитываться 2 функции, добавить переключатель – какая функция рассчитывается:
добавить элемент RadioGroup, вкладка Standard, значок ;
изменить название на RG Name;
изменить заголовок на «Функция» Caption;
добавить названия функций «Экспонента» и «Логарифм», запустив мастер свойства Items:
ввести 2 строки: «Экспонента» и «Логарифм»;
установить активным первый элемент (нумерация начинается с 0) ItemIndex установить в 0.
Добавить 2 кнопки для выхода из программы и для начала расчета:
добавить элемент Button, вкладка Standard, значок ;
кнопки назвать: кнопка выхода BQuit, кнопка расчета BOk Name;
изменить заголовки на «Выход» и «Ok» Caption.
Окно готово!
Запрограммировать выход на кнопку BQuit (команда Close);
Запрограммировать расчет на кнопке BOk: расчет будет осуществлен для функции, которая отмечена элементом RG. Первой является функция «экспонента»:
проанализировать ряд, по которому осуществляется расчет функции, и выявить, как получить элемент ряда an, зная элемент an-1. Для расчета экспоненты необходимо элемент ряда умножить на «x / n»;
для расчета функции потребуются следующие переменные: для хранения значения функции – переменная Func вещественного типа (тип Real); переменные а и а1 для хранения соответственно n-го и n+1-го членов ряда (также тип Real); переменная е (тип Real) для хранения точности расчета; переменная x (тип Real) для удобства записи формул; переменная n (тип Integer) – счетчик цикла. Эти переменные необходимо описать в разделе var процедуры нажатия на кнопку «Оk». Текст процедуры примет вид:
procedure TForm1.BOkClick(Sender: TObject);
var
Func : real;
A,A1 : real;
e : real;
x : real;
n : integer;
присвоить значению переменной x значение элемента SEValueX (свойство Value). При расчете точности необходимо в цикле умножать переменную e на число 0.1 столько раз, сколько требуется знаков после запятой (данное число содержит элемент SEValueE). Для этого после начала процедуры (оператор begin) ввести следующие строки:
x := SEValueX.Value;
e := 1;
For n := 1 to SEValueE.value do e := e * 0.1;
выяснить, какая функция рассчитывается, можно по переменной RG.ItemIndex: если она равна 0, то рассчитывается функция «экспонента», а 1 – «логарифм». Для решения такой задачи удобно использовать оператор выбора Case. После расчета точности необходимо добавить:
case RG.ItemIndex of
0 : begin
{Расчетэкспоненты}
end;
1 : begin
{Расчетлогарифма}
end;
end; {Case}
для расчета функции можно использовать оператор цикла с постусловием, так как данная функция может быть рассчитана как минимум один раз. Условием выхода из цикла будет тот факт, что значение очередного члена ряда станет меньше заданной точности. После комментария {Расчет экспоненты} добавить строки:
Func := 1;
a := 1;
n := 1;
repeat
a1 := a * x /n;
Func := Func + a1;
a := a1;
Inc(n);
until(a для вывода результатов расчета необходимо преобразовать числа в строки, так как полем ввода/вывода элемента Edit является строка. После окончания цикла (строка end {Case}) необходимо добавить следующие строки:
ERFun.Text := FloatToStr(Func);
ESFun.Text := FloatToStr(Exp(x));
Расчет экспоненты окончен! Запустить программу, нажав <F9>.
Для улучшения программы:
необходимо написать текст расчета функции «логарифм». Так как ряд использует в качестве аргумента x+1, удобно использовать функцию Lnxp1, которая также возвращает натуральный логарифм числа (х+1). Для этого требуется подключить к программе модуль Math. Это можно сделать в разделе описания модулей после слова implementation. Необходимо добавить:
Uses
Math;
для автоматического расчета после ввода значений в поля ввода (без нажатия на кнопку «Ok») необходимо назначить элементам SEValueX и SEValueE событие onChange кнопки BOk и сделать невидимой кнопку BOk (эти задачи рассмотрены в 2.2).
|