Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Редактор М-файлов автоматически предлагает расположить операторы внутри цикла с отступом от левого края. Используйте эту возможность для удобства работы с текстом программы.
В результате выполнения FORdem1 появится графическое окно, которое содержит требуемое семейство кривых.
Напишите файл-программу для вычисления суммы
.
Алгоритм вычисления суммы использует накопление результата, т.е. сначала сумма равна нулю (S = 0), затем в переменную k заносится единица, вычисляется 1/ k!, добавляется к S и результат снова заносится в S. Далее k увеличивается на единицу, и процесс продолжается, пока последним слагаемым не станет 1/10!. Файл-программа Fordem2, приведенная в следующем листинге, вычисляет искомую сумму.
Листинг файл-программы Fordem2 для вычисления суммы
% файл-программа для вычисления суммы
% 1/1!+1/2!+ … +1/10!
Обнуление S для накопления суммы
S = 0;
% накопление суммы в цикле
for k = 1:10
S = S + 1/factorial(k);
End
% вывод результата в командное окно
S
Наберите файл-программу в редакторе М-файлов, сохраните её в текущем каталоге в файле Fordem2.m и выполните. Результат отобразится в командном окне, т.к. в последней строке файл-программы S содержится без точки с запятой для вывода значения переменной S
S =
1.7183
Обратите внимание, что остальные строки файл-программы, которые могли бы повлечь вывод на экран промежуточных значений, завершаются точкой с запятой для подавления вывода в командное окно.
Первые две строки с комментариями не случайно отделены пустой строкой от остального текста программы. Именно они выводятся на экран, когда пользователь при помощи команды help из командной строки получает информацию о том, что делает Fordem2
>> help Fordem2
файл-программа для вычисления суммы
1/1!+1/2!+ … +1/10!
При написании файл-программ и файл-функций не пренебрегайте комментариями!
Все переменные, использующиеся в файл-программе, становятся доступными в рабочей среде. Они являются, так называемыми, глобальными переменными. С другой стороны, в файл-программе могут использоваться все переменные, введенные в рабочей среде.
Рассмотрим задачу вычисления суммы, похожую на предыдущую, но зависящую от переменной x
.
Для вычисления данной суммы в файл-программе Fordem2 требуется изменить строку внутри цикла for на
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;
% накопление суммы в цикле
for m = 1:1:N
S = S + x.^m/factorial(m);
end
Об использовании функции sumN пользователь может узнать, набрав в командной строке help sumN. В командное окно выведутся первые три строки с комментариями, отделенные от текста файл-функции пустой строкой.
Обратите внимание, что переменные файл-функции не являются глобальными (m в файл-функции sumN). Попытка просмотра значения переменной m из командной строки приводит к сообщению о том, что m не определена. Если в рабочей среде имеется глобальная переменная с тем же именем, определенная из командной строки или в файл-программе, то она никак не связана с локальной переменной в файл-функции. Как правило, лучше оформлять собственные алгоритмы в виде файл-функций для того, чтобы переменные, используемые в алгоритме, не изменяли значения одноименных глобальных переменных рабочей среды.
Циклы for могут быть вложены друг в друга, при этом переменные вложенных циклов должны быть разными.
Цикл for оказывается полезным при выполнении повторяющихся похожих действий в том случае, когда их число заранее определено. Обойти это ограничение позволяет более гибкий цикл while.
2.5.2. Оператор цикл а while
Рассмотрим пример на вычисление суммы, похожий на пример из предыдущего пункта. Требуется найти сумму ряда для заданного x (разложение в ряд ):
.
Сумму можно накапливать до тех пор, пока слагаемые являются не слишком маленькими, скажем больше по модулю Циклом for здесь не обойтись, так как заранее неизвестно число слагаемых. Выход состоит в применении цикла while, который работает, пока выполняется условие цикла:
while условие цикла
команды MatLab
end
В данном примере условие цикла предусматривает, что текущее слагаемое больше . Для записи этого условия используется знак больше (>). Текст файл-функции 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 на единицу.
Условие цикла while может содержать не только знак >. Для задания условия выполнения цикла допустимы также другие операции отношения, приведенные в табл. 1.
Таблица 1. Операции отношения
Обозначение | Операция отношения |
== | Равенство |
< | Меньше |
> | Больше |
<= | Меньше или равно |
>= | Больше или равно |
~= | Не равно |
Задание более сложных условий производится с применением логических операторов. Например, условие состоит в одновременном выполнении двух неравенств и , и записывается при помощи логического оператора and
and(x >= -1, x < 2)
или эквивалентным образом с символом &
(x >= -1) & (x < 2)
Логические операторы и примеры их использования приведены в табл. 2.
Таблица 2. Логические операторы
Оператор | Условие | Запись в MatLab | Эквивалентная запись |
Логическое "И" | и | and(x < 3, k == 4) | (x < 3) & (k == 4) |
Логическое "ИЛИ" | Or(x == 1,x == 2) | (x == 1) | (x == 2) | |
Отрицание "НЕ" | not(a == 1.9) | ~(a == 1.9) |
При вычислении суммы бесконечного ряда имеет смысл ограничить число слагаемых. Если ряд расходится из-за того, что его члены не стремятся к нулю, то условие на малое значение текущего слагаемого может никогда не выполниться и программа зациклится. Выполните суммирование, добавив в условие цикла 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)
Организация повторяющихся действий в виде циклов делает программу простой и понятной, однако часто требуется выполнить тот или иной блок команд в зависимости от некоторых условий, т.е. использовать ветвление алгоритма.
2.5.3. Условный оператор if
Условный оператор if позволяет создать разветвляющийся алгоритм выполнения команд, в котором при выполнении определенных условий работает соответствующий блок операторов или команд MatLab.
Оператор if может применяться в простом виде для выполнения блока команд при удовлетворении некоторого условия или в конструкции if-elseif-else для написания разветвляющихся алгоритмов.
Пусть требуется вычислить выражение . Предположим, что вычисления выполняются в области действительных чисел и требуется вывести предупреждение о том, что результат является комплексным числом. Перед вычислением функции следует произвести проверку значения аргумента x, и вывести в командное окно предупреждение, если модуль x не превосходит единицы. Здесь необходимо применение условного оператора if, применение которого в самом простом случае выглядит так:
if условие
команды MatLab
end
Если условие выполняется, то реализуются команды MatLab, размещенные между if и end, а если условие не выполняется, то происходит переход к командам, расположенным после end. При записи условия используются операции, приведенные в табл. 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);
Теперь вызов Rfun от аргумента, меньшего единицы, приведет к выводу в командное окно предупреждения:
>> y = Rfun(0.2)
результат комплексный
y =
0 + 0.97979589711327i
Файл-функция Rfun только предупреждает о том, что ее значение комплексное, а все вычисления с ней продолжаются. Если же комплексный результат означает ошибку вычислений, то следует прекратить выполнение функции, используя команду error вместо warning.
2.5.4. Оператор ветвления if-elseif-else
В общем случае применение оператора ветвления if-elseif-else выглядит следующим образом:
if условие 1
команды MatLab
elseif условие 2
команды MatLab
elseif условие 3
команды MatLab
...........
elseif условие N
команды MatLab
else
команды MatLab
end
В зависимости от выполнения того или иного из N условий работает соответствующая ветвь программы, если не выполняется ни одно из N условий, то реализуются команды 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
2.5.5. Оператор ветвления switch
Для осуществления множественного выбора или ветвления может применяться оператор switch. Он является альтернативой оператору if-elseif-else. В общем случае применение оператора ветвления switch выглядит следующим образом:
switch switch_выражение
case значение 1
команды MatLab
case значение 2
команды MatLab
...........
case значение N
команды MatLab
case {значение N+1, значение N+2, …}
команды MatLab
............
case {значение NM+1, значение NM+2,…}
otherwise
команды MatLab
end
В данном операторе сначала вычисляется значение switch_выражения (это может быть скалярное числовое значение либо строка символов). Затем это значение сравнивается со значениями: значение 1, значение 2, …, значение N, значение N+1, значение N+2, …, значение NM+1, значение NM+2,… (которые также могут быть числовыми либо строковыми). Если найдено совпадение, то выполняются команды MatLab, стоящие после соответствующего ключевого слова case. В противном случае выполняются команды MatLab, расположенные между ключевыми словами otherwise и end.
Строк с ключевым словом case может быть сколько угодно, но строка с ключевым словом otherwise должна быть одна.
После выполнения какой-либо из ветвей происходит выход из switch, при этом значения, заданные в других case не проверяются.
Применение switch поясняет следующий пример:
function demswitch(x)
a = 10/5 + x
switch a
case -1
warning('a = -1')
case 0
warning('a = 0')
case 1
warning('a = 1')
case {2, 3, 4}
warning('a равно 2 или 3 или 4')
otherwise
warning('a не равно -1, 0, 1, 2, 3, 4')
end
>> x = -4
demswitch(x)
a =
warning: a = 1
>> x = 1
demswitch(x)
a =
warning: a не равно -1, 0, 1, 2, 3, 4
2.5.6. Оператор прерывания цикла break
При организации циклических вычислений следует заботиться о том, чтобы внутри цикла не возникло ошибок. Например, пусть задан массив x, состоящий из целых чисел, и требуется сформировать новый массив y по правилу y(i) = x(i+1)/x(i). Очевидно, что задача может быть решена при помощи цикла for. Но если один из элементов исходного массива равен нулю, то при делении получится inf, и последующие вычисления могут оказаться бесполезными. Предотвратить эту ситуацию можно выходом из цикла, если текущее значение x(i) равно нулю. Следующий фрагмент программы демонстрирует использование оператора break для прерывания цикла:
for x = 1:20
z = x-8;
if z==0
break
end
y = x/z
end
Как только переменная z принимает значение 0, цикл прерывается.
Оператор break позволяет досрочно прервать выполнение циклов for и while. Вне этих циклов оператор break не работает.
Если оператор break применяется во вложенном цикле, то он осуществляет выход только из внутреннего цикла.
Дата публикования: 2014-12-08; Прочитано: 220 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!