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

Лаб_практикум_ОВИ_03_06_13

.pdf
Скачиваний:
63
Добавлен:
14.04.2015
Размер:
4.1 Mб
Скачать

S =

1.7183

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

Первые строки с комментариями не случайно отделены пустой строкой от остального текста программы. Именно они выводятся на экран,

когда пользователь при помощи команды help из командной строки получает информацию о том, что делает Fordem2

» help Fordem2

ФАЙЛ-ПРОГРАММА ДЛЯ ВЫЧИСЛЕНИЯ СУММЫ

1/1!+1/2!+ … +1/10!

При написании файл-программ и файл-функций не пренебрегайте комментариями!

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

глобальными переменными. С другой стороны, в файл-программе могут использоваться все переменные, введенные в рабочей среде.

Рассмотрим задачу вычисления суммы, похожую на предыдущую, но зависящую от переменной x

10

x

k

S

 

.

 

 

k 1 k!

Для вычисления данной суммы в файл-программе Fordem2 требуется изменить строку внутри цикла for на

121

S = S + x.^k/factorial(k);

Перед запуском программы следует определить переменную x в

командной строке при помощи следующих команд:

»x = 1.5;

»Fordem2 S =

3.4817

В качестве x может быть вектор или матрица, так как в файл-

программе Fordem2 при накоплении суммы использовались поэлементные операции.

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

выходным значение суммы S(x). Файл-функция sumN приведена в следующем листинге.

Листинг файл-функции для вычисления суммы

function S = sumN(x, N)

%файл-функция для вычисления суммы

%x/1!+x^2/2!+ … +x^N/N!

%использование: S = sumN(x, N)

%обнуление S для накопления суммы

S = 0;

% накопление суммы в цикле

122

for m = 1:1:N

S = S + x.^m/factorial(m);

end

Об использовании функции sumN пользователь может узнать, набрав в командной строке help sumN. В командное окно выведутся первые три строки с комментариями, отделенные от текста файл-функции пустой

строкой.

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

лучше оформлять собственные алгоритмы в виде файл-функций для того,

чтобы переменные, используемые в алгоритме, не изменяли значения

одноименных глобальных переменных рабочей среды.

Циклы for могут быть вложены друг в друга, при этом переменные

вложенных циклов должны быть разными.

Цикл for оказывается полезным при выполнении повторяющихся похожих действий в том случае, когда их число заранее определено.

Обойти это ограничение позволяет более гибкий цикл while.

Оператор цикла while

Рассмотрим пример на вычисление суммы, похожий на пример из

предыдущего пункта. Требуется найти сумму ряда для заданного x

(разложение в ряд sin x ):

 

x

2k 1

S(x) ( 1)k

 

.

 

 

 

 

k 0

(2k 1)!

123

Сумму можно накапливать до тех пор, пока слагаемые являются не слишком маленькими, скажем больше по модулю 1010. Циклом for здесь не обойтись, так как заранее неизвестно число слагаемых. Выход состоит в применении цикла while, который работает, пока выполняется условие цикла:

while условие цикла команды MATLAB

end

В данном примере условие цикла предусматривает, что текущее слагаемое xk / k! больше 1010 . Для записи этого условия используется знак больше (>). Текст файл-функции mysin, вычисляющей сумму ряда,

приведен в следующем листинге.

Листинг файл-функции mysin, вычисляющей синус разложением в

ряд

function S = mysin(x)

%Вычисление синуса разложением в ряд

%Использование: y = mysin(x), -pi<x<pi S = 0;

k = 0;

while abs(x.^(2*k+1)/factorial(2*k+1))>1.0e-10 S = S + (-1)^k*x.^(2*k+1)/factorial(2*k+1); k = k + 1;

end

Обратите внимание, что у цикла while, в отличие от for, нет переменной цикла, поэтому пришлось до начала цикла k присвоить нуль, а

внутри цикла увеличивать k на единицу.

124

Условие цикла while может содержать не только знак >. Для задания условия выполнения цикла допустимы также другие операции отношения,

приведенные в табл. 6.1.

Таблица 6.1 – Операции отношения

Обозначение

Операция отношения

==

Равенство

<

Меньше

>

Больше

<=

Меньше или равно

>=

Больше или равно

=

Не равно

Задание более сложных условий производится с применением

логических операторов. Например, условие

1 x 2

состоит

в

одновременном выполнении двух неравенств

x 1

и x 2

и

записывается при помощи логического оператора and

 

 

and(x >= -1, x < 2)

или эквивалентным образом с символом &

(x >= -1) & (x < 2)

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

табл. 6.2.

Таблица 6.2 – Логические операторы

Оператор

Условие

Запись в MATLAB

Эквивалентная запись

Логическое "И"

x 3 и k 4

and(x < 3, k == 4)

(x < 3) & (k == 4)

Логическое

x 1, 2

оr(x == 1,x == 2)

(x == 1) (x == 2)

"ИЛИ"

 

 

 

Отрицание "НЕ"

a 1.9

not(a == 1.9)

(a == 1.9)

 

 

125

 

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

ограничение на число слагаемых:

while(abs(x.^(2*k+1)/factorial(2*k+1))>1.0e-10)&

(k<=10000))

или в эквивалентной форме

while and(abs(x.^(2*k+1)/factorial(2*k+1))>1.0e-10),

k<=10000)

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

Условный оператор if

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

Оператор if может применяться в простом виде для выполнения блока команд при удовлетворении некоторого условия или в конструкции if-elseif-else для написания разветвляющихся алгоритмов.

Пусть

требуется вычислить выражение x2 1 . Предположим, что

вычисления

выполняются в области действительных чисел и требуется

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

126

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

if условие

команды MATLAB

end

Если условие выполняется, то реализуются команды MATLAB,

размещенные между if и end, а если условие не выполняется, то происходит переход к командам, расположенным после end. При записи условия используются операции, приведенные в табл. 6.1.

Файл-функция, проверяющая значение аргумента, приведена в следующем листинге. Команда warning служит для вывода предупреждения в командное окно.

Листинг файл-функции Rfun, проверяющей значение аргумента

function f = Rfun(x)

%вычисляет sqrt(x^2-1)

%выводит предупреждение, если результат комплексный

%использование y = Rfun(x)

%проверка аргумента

if abs(x)<1

warning('результат комплексный')

end

% вычисление функции f = sqrt(x^2-1);

127

Теперь вызов Rfun от аргумента, меньшего единицы, приведет к выводу в командное окно предупреждения:

» y = Rfun(0.2)

результат комплексный

y =

0 + 0.97979589711327i

Файл-функция Rfun только предупреждает о том, что ее значение комплексное, а все вычисления с ней продолжаются. Если же комплексный результат означает ошибку вычислений, то следует прекратить выполнение функции, используя команду error вместо warning.

Оператор ветвления if-elseif-else

В общем случае применение оператора ветвления if-elseif-else

выглядит следующим образом:

if условие 1

команды MATLAB elseif условие 2

команды MATLAB

………………………

elseif условие N

команды MATLAB

else

команды MATLAB

end

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

128

условий, то реализуются команды MATLAB, размещенные после else.

После выполнения любой из ветвей происходит выход из оператора.

Ветвей может быть сколько угодно или только две. В случае двух ветвей используется завершающее else, а elseif пропускается. Оператор ветвления должен всегда заканчиваться оператором end.

Пример использования оператора if-elseif-else, в котором анализируется значение переменной а и выводится сообщение о величине

а, приведен в следующем листинге

function ifdem(a)

% пример использования оператора if-elseif-else if (a == 0)

warning('а равно нулю') elseif a == 1

warning('а равно единице') elseif a == 2

warning('а равно двум') elseif a >= 3

warning('а, больше или равно трем')

else

warning('а меньше трех, и не равно нулю, единице,

двум')

end

Оператор ветвления switch

Для осуществления множественного выбора или ветвления может применяться оператор switch. Он является альтернативой оператору if-elseif-else. В общем случае применение оператора ветвления switch

выглядит следующим образом:

129

switch выражение case значение 1

команды MATLAB case значение 2

команды MATLAB

…………………………………

case значение N

команды MATLAB

case {значение N+1, значение N+2, …}

команды MATLAB

…………………………………

case {значение NM+1, значение NM+2,…} otherwise

команды MATLAB

end

В данном операторе сначала вычисляется значение выражения (это может быть скалярное числовое значение либо строка символов). Затем это значение сравнивается со значениями: значение 1, значение 2, …, значение

N, значение N+1, значение N+2, …, значение NM+1, значение NM+2,… (которые также могут быть числовыми либо строковыми). Если найдено совпадение, то выполняются команды MATLAB, стоящие после соответствующего ключевого слова case. В противном случае выполняются команды MATLAB, расположенные между ключевыми словами otherwise и end.

Строк с ключевым словом case может быть сколько угодно, но строка с ключевым словом otherwise должна быть одна.

После выполнения какой-либо из ветвей происходит выход из switch,

при этом значения, заданные в других case не проверяются.

130

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]