Пятница, 2025-06-20, 7:35 PM
Приветствую Вас Гость | RSS
Главная | Урок 10(2) | Регистрация | Вход
Меню сайта
Вход на сайт
Поиск
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Программирование

    6. Основы программирования в MatLab

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

    6.1. Оператор цикла  for

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

    for count = start:step:final 
    команды MatLab 
    end

    Здесь count - переменная цикла, start - ее начальное значение, final - конечное значение, а  step   - шаг, на который увеличивается count при каждом следующем заходе в цикл. Цикл заканчивается, как только значение count становится больше final. Переменная цикла может принимать не только целые, но и вещественные значения любого знака. Разберем применение оператора цикла  for  на некоторых характерных примерах. 
    Пусть требуется вывести семейство кривых для  , которое задано функцией, зависящей от параметра   для значений параметра от  -0.1 до  0.1. 
    Наберите текст файл-процедуры в редакторе М-файлов и сохраните в файле FORdem1.m,  и запустите его на выполнение (из редактора М-файлов или из командной строки, набрав в ней команду  FORdem1  и нажав <Enter>):

    % файл-программа для построения семейства кривых
    x = [0:pi/30:2*pi];
    for a = -0.1:0.02:0.1
    y = exp(-a*x).*sin(x);
    hold on
    plot(x, y)
    end

    Замечание 4

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

    В результате выполнения 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.

    6.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)

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

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

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

    6.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 = 
    1
    warning: a = 1
    >> x = 1
    demswitch(x)
    a = 
    6
    warning: a не равно -1, 0, 1, 2, 3, 4

     

    6.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  применяется во вложенном цикле, то он осуществляет выход только из внутреннего цикла.

    uCozCopyright MyCorp © 2025