Файл: ИНДИВИД ЗАДАНИЕ ЭКОНОМИСТЫ _Методичка.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 10.07.2024

Просмотров: 148

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

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

его вычисление стандартными средствами языка Паскаль

S:=S+1/(sqr(i) + L),

при этом, расчет слагаемого и добавление его в сумму можно совместить в одном действии, не при- бегая к использованию дополнительных переменных. Однако перед началом цикла переменную S следует занулить. При входе в тело цикла в этом случае начальное значение суммы будет равно ну- лю, при выполнении первого шага оператора цикла с параметром значение переменной S изменится. К «старому» значению - ноль будет давлено рассчитанное значение, соответствующее первому сла- гаемому. На втором шаге, к уже имеющемуся в сумме первому слагаемому будет добавлено значе- ние выражения, соответствующее второму слагаемому суммы. На третьем третье слагаемое, и т.д. до последнего слагаемого, номер которого указан пользователем при помощи переменной n. По за- вершении работы оператора цикла переменная S будет содержать требуемую сумму. Ее необходимо будет вывести на экран и закончит работу программы.

С учетом этих особенностей реализация алгоритма на языке Паскаль выглядит так:

Program primer3 (input, output);

{Заголовок программы}

Const L=0.53;

{Описание параметра - константы}

Var; i, n: integer; s: real;

{Описание переменных}

Begin

{Начало программы}

Clrscr:

{Процедура очистки экрана}

Writeln(’Программа расчета суммы’);

{Вывод пояснений к программе}

Writeln(’Укажите необходимое число слагаемых’);

{Организация диалога}

Write(’n = ’); read(n);

{Ввод значения переменной n }

S:= 0;

{Установка начального значения }

For i:=1 to n do

{Заголовок цикла }

S:=S+1/(sqr(i)+L);

{Расчет слагаемого и добавление его к сумме }

Writeln(’Сумма равна, S = ’,S:6:4);

{Вывод результата на экран}

Repeat Until Keypressed;

{Процедура «задержки» экрана }

End.

{Конец программы}

Пример 3. Составить программу вывода таблицы функции y(x)=x(1+ex2 ) на отрезке [a,b] с шагом h

Решение.

Решение задачи следует производить по следующей схеме:

Следует ввести значения начала и конца отрезка табулирования и шаг табуляции функции;

Взять в качестве начального значения аргумента x значение начала отрезка табулирования;

До тех пор, пока не достигнут конец отрезка табулирования, следует рассчитывать значение функции; выводить его на экран и изменять значение аргумента с учетом шага табуляции;

Блок схема для решения задачи выглядит следующим образом:

- 18 -


При реализации этой схемы на алгоритмическом языке Паскаль учтем следующие обстоятельства:

Во-первых, все переменные должны быть описаны. Поэтому в разделе описаний переменных введем переменные a в качестве начала отрезка табулирования, b в качестве конца отрезка табулирования, h в качестве шага табулирования, x в качестве независимого аргумента, y

в качестве рассчитываемой функции. Все переменные вещественного типа.

Во-вторых, поскольку число шагов, которые необходимо будет выполнить для расчета суммы не известно, для организации цикла можно использовать оператор цикла с предварительной про- веркой условия. Однако следует помнить, что в теле цикла с предусловием должен быть исполь- зован только один оператор языка Паскаль и поэтому нам придется использовать составной опе- ратор. Можно воспользоваться для организации цикла и оператором цикла с постусловием, и в этом случае составной оператор в теле цикла не потребуется, в силу особенностей этого операто- ра цикла.

Заметим, что использование для данной задачи оператора цикла с параметром в принципе возможно, но неудобно, поскольку шаг табуляции вещественный, а оператор цикла с параметром может использовать только произвольный простой скалярный тип данных, кроме вещественного. В этом случае задачу можно решить, если определить, сколько шагов придется сделать, чтобы «накрыть» интервал табулирования. Для этого придется определить протяженность интервала табулирования и разделить его на величину шага, затем организовать вычисления с помощью дополнительной переменной. Этот вариант решения в силу его малой эффективности здесь не рассматривается.

В-третьих, перед использованием оператора цикла необходимо будет приписать всем перемен- ным, участвующим в циклических вычислениях некие начальные значения. Переменная x до на- чала цикла должна получить свое первое значение равное a (значение, соответствующее началу отрезка табулирования).

В-четвертых, поскольку при организации цикла с пред- или постусловием перебор параметров цикла (переменная x) следует производить программным образом, в теле цикла должен присут-

ствовать оператор, обеспечивающий переход к следующему значению параметра цикла с учетом

шага табулирования

x := x + h.

В-пятых, с учетом особенностей операторов цикла с пред- и постусловием, в случае использо-

вания оператора цикла с предварительной проверкой условия тело цикла будет выполняться до тех пор, пока логическое условие в заголовке цикла истинно, выполнение будет прекращено, как только логическое условие становится ложным. При этом в теле цикла допускается только один оператор языка Паскаль и придется использовать составной оператор. В случае использования

- 19 -


оператора цикла с постусловием тело цикла будет выполняться до тех пор, пока логическое ус- ловие в заголовке цикла является ложным, выполнение прекращается, как только условие стано- вится истинным.

В-шестых, следует помнить, что при записи выражения для расчета функции следует соблю- дать правила синтаксиса языка Паскаль.

В-седьмых, вывод рассчитанных значений на экран должен осуществляться до изменения ар- гумента x, в противном случае будет нарушено соответствие, между аргументом и значением

функции.

Сучетом этих особенностей реализация алгоритма на языке Паскаль выглядит так:

Сиспользованием цикла с предусловием:

program primer1 (input, output);

 

{Заголовок программы}

uses crt;

 

{Подключение модуля}

var a,b,x,y,h: real;

 

{Описание переменных}

begin

 

{Начало программы}

clrsсr;

 

{Процедура очистки экрана}

write (‘Введи начальные данные’);

{Вывод пояснений к программе}

write (‘Введи начало отрезка a=‘); readln(а);

{Ввод начала отрезка табулирования }

write (‘Введи конец отрезка b=‘);

readln(b);

{Ввод конца отрезка табулирования }

write (‘Введи h=‘); readln(h);

 

{ Ввод шага табулирования }

x:=a;

 

{Установка начального значения}

while x<=b do

 

{Заголовок цикла}

begin

 

{Открывающая операторная скобка}

y:=x*(1+exp(SQR(x)));

{Расчет значения функции}

writeln(‘при x=‘,x, ‘

y=‘,y);

{Вывод результата на экран}

x:=x+h;

 

{Изменения аргумента}

end;

 

{Закрывающая операторная скобка}

repeat until keypressed;

 

{Процедура «задержки» экрана }

end.

 

{Конец программы}

С использованием цикла с постусловием:

 

program primer1 (input, output);

 

{Заголовок программы}

uses crt;

 

{Подключение модуля}

var a,b,x,y,h: real;

 

{Описание переменных}

begin

 

{Начало программы}

clrsсr;

 

{Процедура очистки экрана}

write (‘Введи начальные данные’);

{Вывод пояснений к программе}

write (‘Введи начало отрезка a=‘); readln(а);

{Ввод начала отрезка табулирования }

write (‘Введи конец отрезка b=‘);

readln(b);

{Ввод конца отрезка табулирования }

write (‘Введи h=‘); readln(h);

 

{ Ввод шага табулирования }

x:=a;

 

{Установка начального значения}

Repeat

 

{Заголовок цикла}

y:=x*(1+exp(SQR(x)));

{Расчет значения функции}

writeln(‘при x=‘,x, ‘

y=‘,y);

{Вывод результата на экран}

x:=x+h;

 

{Изменения аргумента}

until x > b

 

{Проверка условия цикла}

repeat until keypressed;

 

{Процедура «задержки» экрана }

end.

 

{Конец программы}

 

 

- 20 -



Пример 3. Рассчитать сумму при заданном натуральном значении n

 

 

 

 

 

 

 

 

 

n

(−1)

i

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

S = å

 

 

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Решение.

 

 

 

 

 

 

 

 

i =1

i !

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Запишем условия задачи в развернутом виде:

 

 

 

 

 

 

 

 

 

 

 

 

+ (-1)

 

 

S = å (-1)

i

=

(-1)

+

(-1)

2

+ (-1)

+

 

(-1)

 

+ ... +

(-1)

n−2

+

(-1)

n−1

.

n

 

 

1

 

 

 

3

 

 

4

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

3!

 

 

 

 

 

 

 

 

 

 

 

 

i =1

i !

 

 

1!

 

2!

 

 

 

4!

 

 

 

 

(n - 2)!

(n -1)!

 

n !

 

 

Формально эту сумму можно представить в общем виде как сумму из n слагаемых:

где

 

 

 

 

S = a1 + a2 + a3

+ a4 +...+ an-2 + an-1 + an ,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(-1)n−2

 

 

 

 

(-1)n−1

 

 

 

 

a =

(-1)1

, a

 

=

(-1)2

, a

 

=

(-1)3

...a

n−2

=

, a

 

=

, a

n

=

(-1)n

1!

 

2!

 

3!

(n - 2)!

 

 

n!

1

 

2

 

 

3

 

 

 

 

n-1

 

(n -1) !

 

По принципам нахождения суммы необходимо знать значение каждого слагаемого входящего в сумму. Для этого его необходимо рассчитать. Однако из-за отсутствия в стандарте языка Паскаль

функций возведения в степень и факториала числа провести непосредственный расчет слагаемого с определенным номером не представляется возможным. Попытка применить для расчета числителя формулу:

a х = ехр(х* ln( a))

приводит к необходимости записи натурального логарифма от отрицательного числа, что лишено смысла, поскольку натуральный логарифм определен только для положительных чисел, отличных от нуля. Поэтому запись вида

(-1) i = ехр(i* ln( -1))

не может быть использована для вычислений. Расчет знаменателя также стандартными средствами невозможен.

Конечно, можно описать в программе нестандартные функции для расчета степени и факториала, однако существует более рациональный способ решения данной задачи. Этот способ основан на ис- пользовании рекуррентной формулы. С ее помощью устанавливается связь между элементами по- следовательности текущим и предыдущим (или последующим). Получить рекуррентную формулу достаточно просто но не в общем виде, а конкретно для нашей последовательности. Для этого необ- ходимо разделить слагаемое, имеющее номер k на слагаемое с предыдущим номером (k-1):

ak

 

 

(-1)k

 

(-1)k

 

(k -1)!

 

(-1)k -1 × (-1)

 

(k -1)!

 

-1

 

=

 

k !

 

=

×

=

×

=

.

ak−1

(-1)

k -1

k !

(-1)

k -1

(k -1)!× k

 

(-1)

k -1

k

 

 

 

 

 

 

 

 

 

 

 

(k -1)!

Откуда получаем рекуррентную формулу, связывающую слагаемое с номером k с предыдущим слагаемым с номером (k-1):

ak = -k1×ak−1 , - 21 -