Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Учебник Математические пакеты

.pdf
Скачиваний:
43
Добавлен:
23.12.2022
Размер:
6.39 Mб
Скачать

--> // Загрузка сценария РИС15409 выполнение функции raz

-->

 

 

 

--> exec('РИС15409.sce');

 

--> p = raz(-2, 1)

// Проверка 1-й ветви

разветвления

p

=

 

 

 

1.

 

 

-->

 

 

 

--> p = raz(3, 1)

// Проверка 2-й ветви

разветвления

--> p = 9

 

 

p

=

 

 

9.

-->

--> p = raz(1, 1)// Проверка 3-й ветви разветвления

p=

1.

Рис.1.5.4-9 Примеры, реализующие вложенное разветвление

Оператор множественного выбора – select используется для осу-

ществления множественного выбора:

select Переменная

case Значение1 then Операторы1 case Значение2 then операторы2

else Операторы end

Если Переменная заголовка select имеет значение какого-либо Значение..., то выполняется соответствующий ему блок операторов case, в противном случае – список операторов, записанных после else. То есть при выполнении блока case исполняются те Операторы…, для которых Значение совпадает со

значением Переменной.

Поясним использование оператора select следующим примером вычисления значения t:

181

 

y

 

x, если

n 1;

 

 

 

 

 

x(10 x), если

n 2;

t

y

 

y

 

x Sin(nx), если

n 3, 4, 5;

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

1 / (1 x ), в противном случае

 

y

На рис. 1.5.4-10приведена функция multifunc, реализующая множественное разветвление с использованием оператора select, и обращение к ней при исходных данных, позволяющих проверить каждую ветвь разветвления.

 

 

 

 

-->

// Загрузка сценария РИС15410 и выполнение функции multifunc,

--> // реализующей множественное разветвление

 

-->

 

 

 

--> clear

 

 

--> exec('РИС15410.sce');

 

 

--> r = multifunc(5, 1)

// Проверка 1-ой ветви

разветвления

r

=

 

 

 

5.

 

 

--> r = multifunc(5, 2)

// Проверка 2-ой ветви

разветвления

r

=

 

 

 

25.

 

 

--> r = multifunc(5, -1)

// Проверка 3-ей ветви

разветвления

r

=

 

 

 

0.0384615

 

 

--> r = multifunc(5, 6)

//Проверка 4-ой ветви

разветвления

r

=

 

 

 

0.027027

 

 

Рис. 1.5.4-10 Обращения к функции multifunc

Базовые разветвляющиеся программные структуры Scilab позволяют описывать широкий класс задач: нахождение максимального и минимального значения двух переменных; нахождение максимального и минимального значений нескольких переменных; вычисление значений сложных функций, зависящих от сложных условий; выбора различных путей вычислительного процесса и другие.

Рассмотрим несколько простых примеров, реализующие базовые разветвляющие программные структуры.

182

Реализовать функции, которые присваивают переменной f наибольшее из значений двух переменных x, y (1.5.4-11).

При реализации функции fmax_a используется стандартное разветвление, а при реализации функции fmax_b – усеченное.

--> // Загрузка сценария РИС15411и выполнение функцийfmax_a и fmax_b --> // реализующих нахождение max из 2-х переменных

-->

--> clear

--> exec('РИС15411.sce', 0); --> r = fmax_a(10, 3)

r = 10.

--> r = fmax_b(10,3) r =

10.

Рис. 1.5.4-11 Нахождение максимума двух переменных, реализованное с помощью стандартной и усеченной разветвляющихся структур

Обратите внимание, что:

Ifx>ythenf = xelsef = yсоответствует функции f = max(x,y),

Ifx<ythenf = xelsef = yсоответствует функции f = min(x,y),

где x и y любые арифметические выражения.

Реализовать функцию, которая вычисляет минимальное значение трех

выражений r=min(a+b,c2, d ) (рис. 1.5.4-12).

В функции minХ выбор наибольшего (наименьшего) из значений переменных или выражений числом более двух сводится к последовательному применению усеченных разветвлений. Алгоритм, реализующий эту задачу, относится к числу базовых алгоритмов выбора наименьшего из нескольких значений. Основой алгоритма является усеченное разветвление. Здесь первоначально переменной R присваивается значение первого из выражений. Истинное значение наименьшего значения определяется путем последовательного сравнения со всеми остальными значениями выражений заданной последовательности.

183

--> // Загрузка сценария РИС15412и выполнение функций minx

-->

--> clear

--> a = 1; b = 5; c = 10; d = 1; --> exec('РИС15412.sce');

--> R = minx(a, b, c, d) // Использование функции пользователя minX

R=

1.

Рис. 1.5.4-12 Реализация вычисления минимум из элементов массива

Регулярные циклические структуры и оператор for

Оператор цикла for...end обычно используется для организации вычислений с заданным числом повторений циклов. Конструкция такого цикла имеет следующий вид:

for vаr= s : d : e

Оператор1

….

Операторn

end

где s - начальное значение переменной цикла var, d - приращение этой переменной и е – конечное значение управляющей переменной, при превышении которого цикл завершается. Возможна и запись в виде s:е (в этом случае d=1). Список выполняемых в цикле инструкций завершается оператором end.

Рассмотрим пример на рис.1.5.4-13, где при заданных действительных числах a, b (a<b),и целом числе n, необходимо вычислить выражение

s== ( ) , где

h

b

n

a

, если

F

 

a (i 1 / 2)h

,

i 1, 2,..., n.

(1 (i 1 / 2)h)2

 

i

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

184

--> // Загрузка сценария РИС15413 и выполнение функции summa, --> // вычисляющее выражения p

-->

--> clear

--> exec('РИС15413.sce', 0); --> a = 4; b=2; n=5;

--> summa(a, b, n)

Ошибка в исходных данных b<a -->

--> a = 2; b = 4; n = 5; --> p = summa(a, b, n)

p = -0.6114314

Рис. 1.5.4-13. Вычисление выражения

s (F

F

... F )h

1

2

n

Решение задачи требует разработки значенной для вычисления i-го слагаемого заданное выражение s (F1 F2 ... Fn)h

2-х функций: функции slog, предна- и функции summa, которая вычисляет

. Функции slog и summa помещены в

сценарий, сохраненный в файле с именем главной функции summa. Запуск на выполнение осуществляется из командного окна обращением к функции summa. Предварительно переменным a, bи n присваиваются числовые значения. Проверка правильности ввода исходных данных, предусмотрена в функции summa. В случае если b>a, происходит вычисление значения i-го слагаемого, накапливание суммы и, по окончании цикла, умножение суммы на величину h, с последующим выводом результат в командной строке, иначе в командной строке выводится сообщение «Ошибка в исходных данных b<a».

Необходимо отметить, что наиболее часто оператор цикла for...end используется при обработке векторов и матриц.

185

В качестве примера использования оператора for...end вычислим сумму элементов векторах с использованием функции summa и входными параметрами, которые служат вектор x и число элементов n. Значение элементов вектора определены в командном окне (рис. 1.5.4-14).

 

 

 

--> // Загрузка сценария РИС15414и выполнение функцииsumma

-->

 

 

--> clear

 

--> exec('РИС15414.scе');

--> x = [1 2 3 4 5]; n = length(x);

--> s = summa(x, n) // Обращение к функции пользователя summa

s

=

 

 

15.

 

-->

 

 

--> s = sum(x)

// Проверка с использованием встроенной функции sum

s

=

 

 

15.

 

 

Рис. 1.5.4-14 Функция summa, вычисляющей сумму элементов массива,

и обращения к функции summa и встроенной функции sum

Количество элементов массива х определяется функцией length. Кроме обращения к функции summa в командном окне предусмотрена проверка результата вычислений с использованием встроенной функции sum(x).

В цикле может быть использован оператор continue, который передает управление в следующую итерацию цикла, пропуская операторы, которые записаны за ним, причем во вложенном цикле он передает управление на следующую итерацию основного цикла. Оператор break может использоваться для досрочного прерывания выполнения цикла (например, при отладке участка программы). Как только он встречается в программе, цикл прерывается. Примеры использование break и continue будут приведены ниже.

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

186

--> // Загрузка сценария РИС15415 и выполнение функции vzikl

--> -->clear

--> a = [1,2,3;4,5,6;7,8,9]; n = 3; --> exec('РИС15415.sce');

-->

--> s=vzikl(a) s =

45.

Рис. 1.5.4-15 Использование вложенных циклов для вычисления суммы элементов двумерного массива

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

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

Рассмотрим пример реализации функции, которая вычисляет y(x)=sin(x) при значениях x, изменяющихся на отрезке [a;b] с шагом h(рис.1.5.4-16).

--> // Загрузка сценария РИС15416 и выполнение функции ziklh

-->

--> clear

--> a = 1; b = 2; h = 0.2; // Исходные данные

187

-->

x = [a:h:b]

// Формирование массива х

 

-->

exec('РИС15416.sce', 0);

 

 

 

-->

[x, y] = ziklh(a, b, h);

 

 

 

-->

[x,y]'

 

// Вывод таблицы значений функции y(x)=sin(x)

ans

=

 

 

 

 

 

1.

 

1.2

1.4

1.6

1.8

2.

0.841471

0.9320391

0.9854497

0.9995736

0.9738476

0.9092974

Рис.1.5.4-16 Вычисление таблицы значений функции y(x)=sin(x)

Как уже отмечалось, в циклических структурах часто используются операторы, влияющие на их выполнение. Так, в примере рис. 1.5.4-17 показано применение оператора breakдля досрочного прерывания выполнения цикла. В качестве условия досрочного прерывания цикла используется условие i==5.

--> // Пример досрочного прерывания цикла

-->

--> clear

--> for i = 1:10

>if i==5 break, end

>end

i=

1.

i=

2.

i = 3.

i=

4.

i=

5.

Рис. 1.5.4-17 Прерывание программы с применением оператора break

Оператор continue, прерывая цикл, передает управление в следующую итерацию цикла, пропуская операторы, которые записаны за ним, причем во вложенном цикле он передает управление на следующую итерацию основного цикла. На рис.1.5.4-18 приведен пример вычисления суммы и произведения положительных элементов матрицы b(3,3).

188

--> // Пример использования оператора continue

--> // Загрузка сценария РИС15418 и выполнение функции prer

--> clear

--> b = [3 6 -1; -3 5 6 ; 2 -2 4]; --> n = 3;

--> exec('РИС15418.sce'); -->

--> [s, p] = prer(a, n) p =

362880. s =

4.

Рис. 1.5.4-18 Прерывание выполнения цикла с применением оператора continue

Оператор return обеспечивает нормальный возврат в вызывающую функцию и в режим работы с клавиатурой. Пример применения оператора return представлен на рис. 1.5.4-19.

--> // Пример использования оператора return

--> // Загрузка сценария РИС15419 выполнение функции det

--> clear -->

--> A = []; --> det(A)

ans = 1.

-->

--> A = [1]; --> det(A)

Неопределённая переменная 'd' в функции 'det'.

Рис. 1.5.4-19 Применение оператора return

189

В данном примере показано, что если матрица A пустая, то будет выведено значение 1, иначе, система выводит сообщение:

«Неопределённая переменная 'd' в функции 'det.

Базовые алгоритмы регулярной циклической структуры позволяют опи-

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

Рассмотрим несколько простых примеров, реализующие базовые алгоритмы разветвляющих структур.

При заданных числа х b1,b2,…,bn, требуется вычислить их сумму:

f(b1)+f(b2)+…+f(bn),где

x

2

,если

хкратно 3 м;

 

 

х,если хпри делениина 3 даетостаток1;

f (x)

 

x / 3

востальныхслучаях.

 

 

 

 

 

 

Программная реализация задачи приведена на рис.1.5.4-20. Для решения поставленной задачи создадим функцию fb(x), которая реализует алгоритм вычисления значения y=f(x). Функция имеет один входной параметр – х, который при обращении к функции принимает текущее значение элемента массива b(i), и один выходной параметр y. Обращение к функции происходит в цикле, организованном для вычисления суммы значений fb(x).

190