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

Базовые средства матпакета Scilab

.pdf
Скачиваний:
55
Добавлен:
04.04.2023
Размер:
6.29 Mб
Скачать

-->

 

 

 

 

 

-->clear

 

 

 

 

 

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

 

 

--> 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

-->fori = 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).

171

--> // Пример использования оператора 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'.

172

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

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

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

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

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

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

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

x

2

,если

хкратно 3 м;

 

 

 

 

 

 

 

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

 

x / 3

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

 

 

 

 

 

 

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

173

-->//Загрузка сценария РИС15420 и выполнение функции fb, реализующей --> // вложенное разветвление и вычисление суммы элементов массива

-->clear

-->b = [3546961012];

--> exec ('РИС15420.sce'); s =

409.66667

Рис. 1.5.4-20. Вычисление сумы элементов массива, используя функцию fb

Для вычисления суммы значений функции fb(х)

создан сценарий

РИС15420, в котором сначала описывается функцияfb(х),

а затем задаются

количество чисел (n=10) и вектор их значений (b), и организован регулярный цикл для обращения в функции (fb) для вычисления суммы.

Перед решением задачи созданный сценарий РИС15420, следует загрузить с использованием команды exec, а затем запустить его на

выполнение

из

Командного окна.

 

Сформировать из произвольных чисел матрицу а(3,4). Вычислить и вывести вектор b, каждый элемент которого есть среднее арифметическое элементов соответствующей строки матрицы а (рис.

1.5.4-21).

На рис. 1.5.4-21 приведен сценарий с именем РИС15421, где определена матрица а, состоящая из 3-х строк и 4-х столбцов и организован цикл по количеству формируемых элементов матрицы b путем обращения к вспомогательной функции sred_ar. В самой функции sred_arреализован

174

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

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

-->

-->b = [-1256; 0.60.10.50.55; 12.36.7248];

--> exec('РИС15421.sce', 0); --> a'

ans =

3.0.4375 7.755

Рис. 1.5.4-21 Сценарий формирования матрицы a,вычисления среднего арифметического значения элементов матрицы и результаты его работы

Создать функцию, которая вычисляет сумму положительных значений элементов матрицы b, при b(i,j)>0.

На рис. 1.5.4-22 приведено решение задачи, а затем пример вычисления суммы элементов вектора и матрицы с использованием стандартной функции sum. В данном примере элементы матрицы заданы положительными значениями специально, чтобы проверить на совпадение результаты работы созданной функции sumfи встроенной функции sum.

175

-->// Загрузка сценария РИС15422и выполнение функции Sumf, --> // вычисляющей сумму положительных элементов массиваB

--> -->clear

-->exec('РИС15422.sce', 0); --> B = [1 2 3; 4 5 6];

-->

--> s1 = Sumf(B) s1 =

21. -->

--> s1 = sum(B) s1 =

21.

Рис. 1.5.4-22 Вычисление суммы положительных элементов матрицы с использованием функции пользователя Sumfи встроенной функции sum

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

Aразмером 3x4 одномерный вектор, каждый элемент которого есть сумма элементов соответствующих столбцов матрицы A.

Решение задачи с использованием функции Summ, вычисляющей суммы элементов в столбцах матрицы А(3,4), и формирующий из них элементы вектора Х(4). Вызов функции и результаты выполнения приведено на рис. 1.5.4-23.

176

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

--> //которая формирует массивbиз сумм элементов в столбцах массива А

--> -->clear

--> A = [1 3 4 5; 4 7 8 9; 9 8 7 6]; --> exec('РИС15423.sce', 0);

--> X = Summ(A); -->

--> X'

X=

14.18. 19. 20.

Рис. 1.5.4-23 Программа формирования элементов массива Х равным суммам элементов соответствующих столбцов массива А

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

Итеративные циклические структуры и while

Общий вид итеративной циклической структуры с предусловием while…endможно представить следующим образом:

While ЛогическоеВыражение

Операторы

end

177

Отличительной особенностью этой структуры является то, что Операторы, расположенные в теле структуры, выполняются только в том случае, если

ЛогическоеВыражение равно %T(True). Как только ЛогическоеВыражение

становится %F(False), происходит выход из структуры повторения, и управление передается на инструкцию, расположенную после ключевого слова end.

Рассмотрим простой пример вычисления длины окружности. Сценарий, сохраненный в файле с именем РИС15424, служит для многократного вычисления длины окружности по вводимому пользователем значению радиуса r, где диалог реализован с помощью командыinput и disp. Cтроки, связанные с вводом переменной r и вычислением длины окружности, включены в управляющую структуру while...end. Это необходимо для циклического повторения вычислений при вводе различных значений r. Пока r>0, цикл повторяется. Но стоит задать r<0, вычисление длины окружности перестает выполняться, а цикл завершается. Поскольку во второй строке программы величина r определена равной 0, цикл выполняется хотя бы один раз.

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

--> -->clear

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

Введите окружность радиусом r=4 Длина окружности l =25.132741 Введите окружность радиусом r=-1 r<0

Рис. 1.5.4-24 Сценарий, использующий операторы итеративной циклической структуры

178

a0,a1,a2,a3,…,ai,…,an,…

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

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

Рекуррентная формула – это такая формула, которая позволяет вычислить значение n-го члена последовательности, используя значение одного или нескольких предыдущих членов этой последовательности.

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

Если задано некоторое число ε, условия окончания итерационного процесса могут, например, быть следующими:

an– для убывающей последовательности; an– для возрастающей последовательности;

|an|<ε– для убывающей знакопеременной последовательности; |an+1-an|<ε – для некоторых других типов последовательностей.

При заданной возрастающей последовательности

 

x

 

x

2

 

x

3

 

1,

,

 

,

 

, ... (x 10).

3

3

2

3

3

 

 

 

 

 

 

 

 

 

 

требуется реализовать функцию, которая вычисляет все члены последовательности, до тех пор, пока значение очередного члена не превысит некоторое заданное число d, например, (3<d<100).

В нашей задаче для вычисления любого члена последовательности можно воспользоваться формулой an=xn/3n, где n=0,1,2,… номер члена.

Во избежание зацикливания, в данном примере цикл будет выполняться не более 100 раз, даже если очередной член последовательности будет оставаться меньше d (рис. 1.5.4-25).

179

--> // Загрузка сценария РИС15425 и выполнение функции Pos, -->// реализующей вычисление членов последовательности

--> -->clear

-->exec('РИС15425.sce', 0); --> Pos(5,9)

n = 1. a = 3. n = 2. a = 9.

Рис. 1.5.4-25 Вычисление членов последовательности с использованием итеративного цикла

К сожалению, во многих задачах непосредственный подсчет очередного члена связан с вычислительными трудностями. В этом случае целесообразно использовать рекуррентную формулу, которая позволяет вычислить значение переменной на следующем шаге, используя ее значение на текущем шаге – an+1=anqили an=an-1q.

Вычислить значение функции точностью ε=0.01 при х=0.1, каждый член которой представляет собойзнакопеременную убывающую последовательность:

x 1

 

(x 1)2

 

(x 1)3

n (x 1)n 1

 

 

 

 

 

 

... ( 1)

 

...,

1!

 

2!

3!

(n 1)!

Вычисление с заданной точностью ε означает, что суммирование членов ряда надо продолжать до тех пор, пока очередной вычисленный член ряда не станет меньше по абсолютной величине числа ε(рис.1.5.4-26).

Приведем вывод рекуррентной формулы для заданного в примере ряда. Формула для n-го члена приведена в задании:

180