Оператор условного перехода
Введение
Вообще говоря, операторы управления необходимы, главным образом, для организации вычислительного процесса, который записывается в виде некоторого текста программы на языке программирования высокого уровня. При этом к операторам управления вычислительным процессом обычно относят операторы безусловного перехода, условных переходов (разветвления вычислительного процесса) и операторы организации циклических процессов. Тем не менее, система MatLAB построена таким образом, что эти операторы могут быть использованы при роботе MatLAB и в режиме калькулятора.
В языке MatLAB отсутствует оператор безусловного перехода и, в соответствии с этим, нет понятию метки. Это обстоятельство затрудняет организацию перехода вычислительного процесса к любому предшествующему или следующему оператору программы.
Все операторы цикла и условного перехода построены в MatLAB в виде составного оператора, который начинается одним из служебных слов if, while, switch или for и заканчивается служебным словом end. Операторы между этими словами воспринимаются системой как части одного сложного оператора. Поэтому нажатие клавиши <Enter> при переходе к следующей строке не приводит в этом случае к выполнению этих операторов. Выполнение операторов начинается лишь тогда, если введена "завершающая скобка" сложного оператора в виде слова end, а затем нажата клавиша <Enter>. Если несколько составных операторов такого типа вложены друг в друга, вычисления начинаются лишь тогда, когда записан конец end наиболее охватывающего (внешнего) составного оператора. Отсюда следует возможность осуществления даже в режиме калькулятора довольно сложных и объемных (состоящих из многих строк и операторов) вычислений, если они охвачены сложным оператором.
Оператор условного перехода
Конструкция оператора перехода по условию в общем виде такова:
if <условие> <операторы1> else <операторы2> end
Работает оператор так. Сначала проверяется, выполняется ли указанное условие. Если оно выполнено, программа выполняет совокупность операторов, которая записанная в делении <операторы1>. Если условие не выполнено, выполняется последовательность операторов <операторы2>.
Сокращенная форма условного оператора имеет вид:
if <условие> <операторы> __end
Действие оператора в этом случае аналогично, за исключением того, что при невыполнении заданного условия выполняется оператор, следующий за оператором end.
Легко заметить недостатки этого оператора, вытекающие из отсутствия оператора безусловного перехода: все части программы, которые выполняются в зависимости от условия, должны размещаться внутри операторных скобок ifи end. В качестве условия используются выражения типа:
<имя переменной1> <операция сравнения> <имя переменной2>
Операции сравнения в языке MatLAB могут быть такими:
< - меньше;
> - больше;
<= - меньше или равно;
>= - больше или равно;
= = - равно;
~ = - не равно.
Условие может быть составным, т. е. состоять из нескольких простых условий, объединенных знаками логических операций. Знаками логических операций в языке MatLAB являются:
& - логическая операция “И” (“AND”);
| - логическая операция “ИЛИ” (“OR”);
~ - логическая операция “НЕТ” (“NOT”).
Логическая операция “Исключительное ИЛИ” может быть реализована с помощью функции xor(А,В), где А и В - некоторые условия.
Допустима еще одна конструкция оператора условного перехода:
if <условие1> <операторы1> elseif <условие2> <операторы2> elseif <условие3> <операторы3> . . . else <операторы> end
Оператор elseif выполняется тогда, когда <условие1> не выполнено. При этом сначала проверяется <условие2>. Если оно выполнено, выполняются <операторы2>, если же нет, <операторы2> игнорируются, и происходит переход к следующему оператору elseif, т. е. к проверке выполнения <условия3>. Аналогично, при выполнении его выполняются <операторы3>, в противном случае происходит переход к следующему оператору elseif. Если ни одно из условий в операторах elseif не выполнено выполняются <операторы>, размещенные за оператором else. Так может быть обеспечено разветвление программы по нескольким направлениям.
Оператор переключения
Оператор переключения имеет такую структуру:
switch <выражение, скаляр или строка символов>
case <значение1> <операторы1>
case <значение2> <операторы2>
. . .
Otherwise <операторы>
End
Он осуществляет разветвление вычислений в зависимости от значений некоторой переменной или выражения, сравнивая значение, полученное в результате вычисления выражения в строке switch, со значениями, указанными в строках со словом case. Соответствующая группа операторов case выполняется, если значение выражения совпадает со значением, указанным в соответствующей строке case. Если значение выражения не совпадает ни с одним из значений в группах case, выполняются операторы, которые следуют за словом otherwise.
Операторы цикла
В языке MatLAB есть две разновидности операторов цикла - условный и арифметический.
Оператор цикла с предусловием имеет вид:
while <условие> <операторы> end
Операторы внутри цикла выполняются лишь в случае, если выполнено условие, записанное после слова while. При этом среди операторов внутри цикла обязательно должны быть такие, которые изменяют значения одной из переменных, указанных в условии цикла.
Приведем пример вычисления значений синуса при 21 значении аргумента от 0.2 до 4 с шагом 0.2:
» i = 1;
» while i <= 20
x = i/5;
si = sin(x);
disp([x,si])
i = i+1;
End
0.2000 0.1987
0.4000 0.3894
0.6000 0.5646
0.8000 0.7174
1.0000 0.8415
1.2000 0.9320
1.4000 0.9854
1.6000 0.9996
1.8000 0.9738
2.0000 0.9093
2.2000 0.8085
2.4000 0.6755
2.6000 0.5155
2.8000 0.3350
3.0000 0.1411
3.2000 -0.0584
3.4000 -0.2555
3.6000 -0.4425
3. 8000 -0. 6119
4.0000 -0. 7568
Примечание. Обратите внимание на то, какими средствами в указанном примере обеспечен вывод на экран значений нескольких переменных в одну строку. Для этого используется оператор disp. Но, в соответствии с правилами применения этого оператора, в нем должен быть только один аргумент (текст, переменная или матрица). Чтобы обойти это препятствие, нужно несколько числовых переменных объединить в единый объект - вектор-строку, а последнее легко выполняется с помощью обычной операции формирования вектора-строки из отдельных элементов [ x1, x2, ... , x].
Таким образом, с помощью оператора вида:
disp([x1, x2, ... , x])
можно обеспечить вывод результатов вычислений в виде таблицы данных.
Арифметический оператор цикла имеет вид:
for <имя> = <НЗ> : <Ш> : <КЗ> <операторы> end,
где <имя> - имя управляющей переменной цикла ("счетчика" цикла);
<НЗ> - заданное начальное значение этой переменной;
<Ш> - значение шага, с которым она должна изменяться;
<КЗ> - конечное значение переменной цикла.
В этом случае <операторы> внутри цикла выполняются несколько раз (каждый раз при новом значении управляющей переменной) до тех пор, пока значение управляющей переменной не выйдет за пределы интервала между <НЗ> и <КЗ>. Если параметр <Ш> не указан, по умолчанию его значение принимается равным единице.
Чтобы досрочно выйти из цикла (например, при выполнении некоторого условия) применяют оператор break. Когда программа сталкивается с этим оператором, выполнение цикла досрочно прекращается, и начинает выполняться оператор, следующий за словом end цикла.
Для примера используем предыдущую задачу:
» a = [' i ',' x ',' sin(x) '];
» for i = 1:20
x = i/5;
si = sin(x);
if i==1
Disp(a)
End
disp([i,x,si])
End
В результате получаем
i x sin(x)
1.0000 0.2000 0.1987
2.0000 0.4000 0.3894
3.0000 0.6000 0.5646
4.0000 0.8000 0.7174
5.0000 1.0000 0.8415
6.0000 1.2000 0.9320
7.0000 1.4000 0.9854
8.0000 1.6000 0.9996
9.0000 1.8000 0.9738
10.0000 2.0000 0.9093
11.0000 2.2000 0.8085
12.0000 2.4000 0.6755
13.0000 2.6000 0.5155
14.0000 2.8000 0.3350
15.0000 3.0000 0.1411
16.0000 3.2000 -0.0584
17.0000 3.4000 -0.2555
18.0000 3.6000 -0.4425
19. 0000 3.8000 -0. 6119
20.0000 4. 0000 -0. 7568
Так можно обеспечить вывод информации в виде таблиц.
Задания
Задание 1.11.
1. В соответствии с таблицей 1.5 выполнить:
- вычисление точных (используя стандартные функции MatLAB) значений соответствующей функции в диапазоне изменения аргумента от до в равноотстоящих точках этого диапазона, включая его границы;
x1 x2 m
- вычисление по указанным степенным рядам приближенных значений функции в тех же точках, ограничиваясь r первыми членами ряда;
- расчет погрешности приближенного определения функции в каждой точке, сравнивая приближенное значение с точным, и построение графика зависимости погрешности от аргумента;
- вычисление приближенных значений функции в тех же точках с относительной погрешностью не более ε=0.001; построение графика полученных относительных погрешностей.
Таблица 1.5
Вар. | x1 | x2 | m | r | f(x) | Приближённая формула |
0.2 | sin(x) | |||||
cos(x) | ||||||
0.3 | exp(x) | |||||
0.4 | ln(1+x) | |||||
0.5 | ln(x) | |||||
0.6 | ln(x) | |||||
0.7 | ln(x) | |||||
0.8 | ln(x+a) | |||||
1.1 | ctg(x) | |||||
1.2 | cosec(x) | |||||
1.3 | cosec(x) | |||||
1.4 | arctg(x) | |||||
1.5 | arctg(x | |||||
1.6 | ln(x) | |||||
0.9 | sin(x) |
Задание 1.12.
Вычислить значения функции из таблицы 1.5 при значениях аргумента в диапазоне от 0.1 до 100, образующих геометрическую прогрессию со знаменателем, равным квадратному корню из 10, и выведите в командное окно таблицу результатов вычислений.
О загрузке файла в Матлаб
В Матлаб можно загрузить файл, содержащий исходные данные.
Допустим, имеем на лиске d: в папке 1 файл diamond.points:
Этот файл содержит:
; Sharky Neural Network 0.9 Beta
; Training data
; Inputs: 2
; Outputs: 1/2
; Points: 400
; More on: http://www.sharktime.com/
-0.875500 -0.781250 1
0.305250 0.014750 2
0.460750 -0.781500 1
-0.640500 0.855000 1
-0.026000 0.723750 2
-0.562250 0.340000 2
0.501250 -0.978000 1
0.018000 0.535250 2
-0.765000 -0.085750 2
0.767250 0.612250 1
-0.280250 -0.946500 1
Необходимо открыть его и загрузить в переменную «а» в рабочем документе Матлаб. Для этого нужно, чтобы кодировка файла соответствовала требованиям Матлаб : ( ). И чтобы файл содержал только однородную информацию, без верхних 5 строк.
Для определения фактической кодировки загрузим файл в блокнот:
В нижней строке читаем текущую кодировку файла: Win 1200 (UTF-16LE).
В меню «Кодировка» выбираем «Сохранить в Windows – 1251».
В блокноте убираем из файла лишние строки.
После сохранения преобразованного файла с расширением txt, в Матлаб набираем:
>> open('d:\1\diamond.txt') % для открытия файла
>>load('d:\1\diamond.txt ') % для загрузки файла в рабочую область Матлаб
>>
И получаем результат:
Если при загрузке содержимое файла присвоить переменной “а”, то получим:
>> open('d:\1\diamant-1.txt')
>> a=load('d:\1\diamant-1.txt')
a =
-0.2758 -0.7855 1.0000
-0.0343 -0.7943 2.0000
0.2610 -0.5185 2.0000
0.1630 -0.7815 2.0000
-0.9547 0.9250 1.0000
0.5837 -0.6590 1.0000
-0.2580 0.7823 1.0000
-0.5062 0.7907 1.0000
-0.6212 0.3967 1.0000
0.1328 -0.1213 2.0000
-0.4108 -0.1948 2.0000
-0.4725 -0.5430 1.0000
0.7087 0.5933 1.0000
0.6445 -0.9520 1.0000
-0.6820 -0.0135 2.0000
0.7215 -0.1103 2.0000
…
только файл может оказаться очень длинным, не обязательно его показывать на экране.
Задание.
Постановка задачи: в указанных источниках содержится информация, характеризующая множества точек – координат объекта. Для каждого объекта выделить обучающее, тестирующее и экзаменационное множества точек в соотношении: 70%, 25% и 5%. Вывести графики полученных трёх файлов: обучающего, тестирующего и экзаменационного.
№ | Название | Адрес |
XOR | Sharky Neural Network | |
Circle | Sharky Neural Network | |
Square | Sharky Neural Network | |
Diamond | Sharky Neural Network | |
Ring | Sharky Neural Network | |
Thin Ring | Sharky Neural Network | |
Moon | Sharky Neural Network | |
Wave | Sharky Neural Network | |
Hole | Sharky Neural Network | |
Ying Yang | Sharky Neural Network | |
Showman | Sharky Neural Network | |
Face :) | Sharky Neural Network | |
N.points | http://www.sharktime.com/us_SharkyNeuralNetworkDownload.html | |
cn.points | http://www.sharktime.com/us_SharkyNeuralNetworkDownload.html | |
AI.points | http://www.sharktime.com/us_SharkyNeuralNetworkDownload.html |
Вопросы
1. Какие средства управления ходом вычислительного процесса предусмотрены в языке MatLAB?
2. Как можно организовать вычисления по циклу в языке MatLAB?
3. Как организовать вывод таблицы результатов вычислений в командное окно MatLAB?
4. Как осуществить сложные (многооператорные) вычисления в режиме калькулятора?