Главная страница
Навигация по странице:

  • Глава 1. Структура программы. Основные математические операции и типы данных

  • 1.1. Структура программы пакета MatLab

  • 1.2. Простые переменные и основные типы данных в MatLab

  • 1.3. Основные математические функции MatLab

  • Глава 2. Условные операторы и циклы в MatLab

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

  • 2.2. Условный оператор switch

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

  • Глава 3. Работа с графиками в MatLab

  • Курс. Структура программы. Основные математические операции и типы данных


    Скачать 492.5 Kb.
    НазваниеСтруктура программы. Основные математические операции и типы данных
    Дата24.10.2018
    Размер492.5 Kb.
    Формат файлаdoc
    Имя файлаКурс.doc
    ТипДокументы
    #54380



    Введение
    Среди множества существующих математических пакетов, таких как Mathematica, MathCad и др., система MatLab занимает лидирующее место благодаря удобному встроенному языку программирования для реализации самых разнообразных математических алгоритмов и задач математического моделирования. Кроме того, данный пакет имеет дополнительно инструмент визуального моделирования Simulink, позволяющий строить и исследовать математические модели, не прибегая к их программированию.


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


    Глава 1. Структура программы. Основные математические операции и типы данных
    Первым шагом на пути создания математических алгоритмов является изучение структуры программы и набора математических операций, доступных языку программирования. В частности, в данной главе будут рассмотрены математические операции и функции пакета MatLab, связанные с обработкой как скалярных, так и матричных переменных.
    1.1. Структура программы пакета MatLab
    Как правило, каждая программа в MatLab представляет собой функцию и начинается с ключевого слова function, за которым через пробел следует ее название. Например,

    function Lab1
    a = 5;

    b = 2;

    c = a*b;


    Данная программа заключена в функции с именем Lab1 и вычисляет произведение двух переменных а и b. При сохранении программы в m-файл рекомендуется указывать имя файла, совпадающее с именем функции, т.е. в данном случае – Lab1.

    Следует отметить, что в одном m-файле можно задавать множество дополнительных функций. Для этого достаточно написать в конце листинга основной программы еще одно ключевое слово function и задать ее имя, например,

    function Lab1
    a = 5;

    b = 2;

    c = a*b;

    out_c(c); % вызов функции out_c()
    function out_c(arg_c) % определение функции out_c()

    disp(arg_c);

    Обратите внимание, что функцию out_c() можно вызывать в основной программе до ее определения. Это особенность языка MatLab, позволяющая не беспокоиться программисту о последовательности задания функций. В приведенном примере функция out_c() имеет один входной параметр с именем arg_c, который выводится на экран (в командное окно MatLab) с помощью встроенной функции disp(). В итоге, при выполнении приведенной программы в командном окне MatLab будет отображено значение переменной c.
    Дополнительные функции можно оформлять и в отдельных m-файлах. Например, если есть необходимость какую-либо функцию описать в одном m-файле, а вызывать ее в другом, то это можно реализовать следующим образом.
    1-й файл (Lab1.m)


    function Lab1




    a = 5;




    b = 2;




    c = square(a,b);

    % вызов функции square()

    out_c(c);

    % вызов функции out_c()

    function out_c(arg_c)

    % определение функции out_c()

    disp(arg_c);






    2-й файл (square.m)

    shape 3


    shape 1shape 2


    function res=square(a, b)
    res = a*b;

    shape 4

    При выполнении функции Lab1 система MatLab вызовет функцию square из файла square.m. Это будет сделано автоматически, т.к. встроенные функции языка MatLab определены также и вызываются из файлов, имена которых, как правило, соответствуют именам вызываемых функций. Обратите также внимание на то, что функция square() не только принимает два аргумента a и b, но и возвращает их произведение с помощью переменной res. Представленный синтаксис следует использовать всякий раз, когда требуется возвратить результат вычислений основной программе. В четвертой главе данного пособия более подробно изложены конструкции вызова функций для реализации разнообразных алгоритмов.
    1.2. Простые переменные и основные типы данных в MatLab
    Создание программы, как правило, начинается с определения переменных и способа представления данных. Следовательно, чтобы правильно организовать описание данных программы, необходимо знать как задавать переменные в MatLab и какие виды переменных возможны.
    Самый простой и наиболее распространенный тип данных – это число. В MatLab число хранится в переменной, которая имеет некоторое уникальное имя, например,

    a = 5;

    задает переменную с именем a и присваивает ей значение 5. По умолчанию переменная а является вещественной (тип double), т.е. может принимать дробные значения, например,

    a = -7.8;

    задает значение переменной а равное -7,8. Изменить тип переменной можно, указав тип присваиваемого числа с помощью соответствующего ключевого слова, например,

    a = int16(5)


    выполнит присваивание числа 5 как целочисленного 16-битового значения. В результате выполнения такой операции тип переменной a будет соответствовать int16.


    Типы данных, доступные в MatLab, представлены в табл. 1.1.
    Таблица 1.1 – Основные типы данных в MatLab


    double

    вещественный, 64 бит

    single

    вещественный, 32 бит

    int8

    знаковый целочисленный, 8 бит

    int16

    знаковый целочисленный, 16 бит

    int32

    знаковый целочисленный, 32 бит

    int64

    знаковый целочисленный, 64 бит

    uint8

    беззнаковый целочисленный, 8 бит

    uint16

    беззнаковый целочисленный, 16 бит

    uint32

    беззнаковый целочисленный, 32 бит

    uint64

    беззнаковый целочисленный, 64 бит


    По умолчанию используется тип double, который имеет наибольшую точность представления вещественного числа и является потому универсальным типом. Однако, если необходимо экономить память ЭВМ, то можно указывать самостоятельно желаемый тип.
    Последнее, что следует знать при задании переменных – это правило определения их имен. В MatLab имена переменных могут задаваться только латинскими буквами, цифрами и символом ‘_’. Причем, первый символ в имени должен соответствовать букве латинского алфавита. Также следует отметить, что имена

    arg = 1;

    Arg = 2;

    ARG = 3;

    это три разных имени, т.е. три разные переменные со значениями 1, 2 и 3 соответственно. Данный пример показывает, что MatLab различает регистр в именах переменных.

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


    1.3. Основные математические функции MatLab

    MatLab содержит в себе все распространенные математические функции, которые доступны по их имени при реализации алгоритмов. Например, функция sqrt() позволяет вычислять квадрат числа и может быть использована в программе следующим образом:

    x = 2;
    y = 4;

    d = sqrt(x^2+y^2); %вычисление евклидового расстояния

    Аналогичным образом вызываются и все другие математические функции, представленные в табл. 1.2

    Таблица 1.2.- Основные математические функции MatLab.


    sqrt(x)

    вычисление квадратного корня

    exp(x)

    возведение в степень числа e

    pow2(x)

    возведение в степень числа 2

    log(x)

    вычисление натурального логарифма

    log10(x)

    вычисление десятичного логарифма

    log2(x)

    вычисление логарифма по основанию 2

    sin(x)

    синус угла x, заданного в радианах

    cos(x)

    косинус угла x, заданного в радианах

    tan(x)

    тангенс угла x, заданного в радианах

    cot(x)

    котангенс угла x, заданного в радианах

    asin(x)

    арксинус

    acos(x)

    арккосинус

    atan(x)

    арктангенс

    pi

    число пи

    round(x)

    округление до ближайшего целого



    fix(x)

    усечение дробной части числа

    floor(x)

    округление до меньшего целого

    ceil(x)

    округление до большего целого

    mod(x)

    остаток от деления с учётом знака

    sign(x)

    знак числа

    factor(x)

    разложение числа на простые множители

    isprime(x)

    истинно, если число простое

    rand

    генерация псевдослучайного числа с




    равномерным законом распределения

    randn

    генерация псевдослучайного числа с нормальным




    законом распределения

    abs(x)

    вычисление модуля числа


    1.4. Структуры в MatLab
    При разработке программ важным является выбор эффективного способа представления данных. Во многих случаях недостаточно объявить простую переменную или массив, а нужна более гибкая форма представления данных. Таким элементом может быть структура, которая позволяет включать в себя разные типы данных и даже другие структуры. Структуры задаются следующим образом:

    S = struct('field1',VALUES1,'field2',VALUES2,...);

    где field1 – название первого поля структуры; VALUES1 – переменная первого поля структуры, и т.д.

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

    S = struct('title','','author','','year',0);


    В итоге задается структура с тремя полями: title, author и year. Каждое поле имеет свой тип данных и значение.

    Для того, чтобы записать в эту структуру конкретные значения используется оператор ‘.’ (точка) для доступа к тому или иному полю структуры:

    S.title = 'Евгений Онегин';
    S.author = 'Пушкин';

    S.year = 2000;


    и таким образом, переменная S хранит информацию о выбранной книге.
    Глава 2. Условные операторы и циклы в MatLab
    Вторым шагом создания полноценных программ на языке MatLab является изучение операторов ветвления и циклов. С их помощью можно реализовывать логику выполнения математических алгоритмов и создавать повторяющиеся (итерационные, рекуррентные) вычисления.
    2.1. Условный оператор if
    Для того чтобы иметь возможность реализовать логику в программе используются условные операторы. Умозрительно эти операторы можно представить в виде узловых пунктов, достигая которых программа делает выбор по какому из возможных направлений двигаться дальше. Например, требуется определить, содержит ли некоторая переменная arg положительное или отрицательное число и вывести соответствующее сообщение на экран. Для этого можно воспользоваться оператором if (если), который и выполняет подобные проверки.

    В самом простом случае синтаксис данного оператора if имеет вид:

    if <выражение>
    <операторы>

    end


    Если значение параметра «выражение» соответствует значению «истинно», то выполняется оператор, иначе он пропускается программой. Следует отметить, что «выражение» является условным выражением, в котором выполняется проверка некоторого условия. В табл. 2.1 представлены варианты простых логических выражений оператора if.


    Таблица 2.1. Простые логические выражения


    if a < b

    Истинно, если переменная a меньше переменной b и ложно




    в противном случае.

    if a > b

    Истинно, если переменная a больше переменной b и ложно в




    противном случае.

    if a == b

    Истинно, если переменная a равна переменной b и ложно в




    противном случае.

    if a <= b

    Истинно, если переменная a меньше либо равна переменной




    b и ложно в противном случае.

    if a >= b

    Истинно, если переменная a больше либо равна переменной




    b и ложно в противном случае.

    if a = b

    Истинно, если переменная a не равна переменной b и ложно




    в противном случае.



    2.2. Условный оператор switch


    • некоторых задачах программирования требуется выполнять проверку на равенство некоторой переменной константным значениям. Например, нужно преобразовать малые буквы в заглавные. В этом случае необходимо произвести проверку текущего символа со всеми возможными буквами алфавита и при равенстве с одной из них, заменить ее на заглавную. Для решения таких задач удобнее пользоваться условным оператором switch, который имеет следующий синтаксис:


    switch expr
    case case_expr,

    <операторы1>
    case {case_expr1, case_expr2, case_expr3,...} <операторы2>

    ...
    otherwise,

    <операторы>

    end

    Здесь expr – переменная, значение которой проверяется на равенство тем или иным константам; case_expr – константы, с которым сравнивается значение переменной; otherwise – ключевое слово, для выполнения операторов, при всех ложных условиях.

    2.3. Оператор цикла while
    Язык программирования MatLab имеет два оператора цикла: while и for. С их помощью, например, выполняется программирование рекуррентных алгоритмов, подсчета суммы ряда, перебора элементов массива и многое другое.
    В самом простом случае цикл в программе организуется с помощью оператора while, который имеет следующий синтаксис:
    while <условие>

    <операторы>

    end



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



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



    2.4. Оператор цикла for
    Часто при организации цикла требуется перебирать значение счетчика в заданном диапазоне значений и с заданным шагом изменения. Например, чтобы перебрать элементы вектора (массива), нужно организовать счетчик от 1 до N с шагом 1, где N – число элементов вектора. Чтобы вычислить сумму ряда, также задается счетчик от a до b с требуемым шагом изменения step. И так далее. В связи с тем, что подобные задачи часто встречаются

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


    Синтаксис оператора цикла for имеет следующий вид:
    for <счетчик> = <начальное значение>:<шаг>:<конечное значение> <операторы цикла>

    end

    Рассмотрим работу данного цикла на примере реализации алгоритма поиска максимального значения элемента в векторе:

    function search_max

    a = [3 6 5 3 6 9 5 3 1 0];

    m = a(1); % текущее максимальное значение

    for i=1:length(a) % цикл от 1 до конца вектора с

    % шагом 1 (по умолчанию)
    if m < a(i) % если a(i) > m,

    m = a(i); % то m = a(i)

    end

    end % конец цикла for

    disp(m);


    • данном примере цикл for задает счетчик i и меняет его значение от 1 до 10 с шагом 1. Обратите внимание, что если величина шага не указывается явно, то он берется по умолчанию равным 1.



    Глава 3. Работа с графиками в MatLab
    MatLab предоставляет богатый инструментарий по визуализации данных. Используя внутренний язык, можно выводить двумерные и трехмерные графики в декартовых и полярных координатах, выполнять отображение изображений с разной глубиной цвета и разными цветовыми картами, создавать простую анимацию результатов моделирования в процессе вычислений и многое другое.
    3.1. Функция plot
    Рассмотрение возможностей MatLab по визуализации данных начнем с двумерных графиков, которые обычно строятся с помощью функции plot().

    Множество вариантов работы данной функции лучше всего рассмотреть на конкретных примерах.



    Предположим, что требуется вывести график функции синуса в диапазоне от 0 до . Для этого зададим вектор (множество) точек по оси Ox, в которых будут отображаться значения функции синуса:
    x = 0:0.01:pi;



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


    y = sin(x);
    и выведем результат на экран
    plot(x,y);
    В результате получим график, представленный на рис. 3.1.
    Представленная запись функции plot() показывает, что сначала записывается аргумент со множеством точек оси Ох, а затем, аргумент со множеством точек оси Oy. Зная эти значения, функция plot() имеет возможность построить точки на плоскости и линейно их интерполировать для придания непрерывного вида графика.



    Рис. 3.1.- Отображение функции синуса с помощью функции plot().
    Функцию plot() можно записать и с одним аргументом x или y:
    plot(x);

    plot(y);


    в результате получим два разных графика, представленные на рис. 3.2.


    Анализ рис. 3.2 показывает, что в случае одного аргумента функция plot() отображает множество точек по оси Oy, а по оси Оx происходит автоматическая генерация множества точек с единичным шагом. Следовательно, для простой визуализации вектора в виде двумерного графика достаточно воспользоваться функцией plot() с одним аргументом.
    Для построения нескольких графиков в одних и тех же координатных осях, функция plot() записывается следующим образом:
    x = 0:0.01:pi;
    y1 = sin(x);

    y2 = cos(x);

    plot(x,y1,x,y2);
    Результат работы данного фрагмента программы представлен на рис. 3.3.



    а) б)

    Рис. 3.2.-Результаты работы функции plot() с одним аргументом:
    а– plot(x); б – plot(y).



    Рис. 3.3.-Отображение двух графиков в одних координатных осях.
    Аналогичным образом можно построить два графика, используя один аргумент функции plot(). Предположим, что есть два вектора значений
    y1 = sin(x);

    y2 = cos(x)


    которые требуется отобразить на экране. Для этого объединим их в двумерную матрицу



    в которой столбцы составлены из векторов y1 и y2 соответственно. Такая матрица будет отображена функцией
    plot([y1’ y2’]); % апострофы переводят вектор-строку


    • в вектор-столбец


    в виде двух графиков (рис. 3.4).



    Рис. 3.4.-Отображение двумерной матрицы в виде двух графиков.

    4 Практическая часть (с использованием программного комплекса Matlab)


    Цепи с одним источником энергии целесообразно рассчитывать методом эквивалентного преобразования.

    При расчете придерживаемся следующей последовательности.

    1. На схеме указать положительное направление напряжения на зажимах источника и положительные направления токов во всех ветвях.

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

    3. Записать комплексы полных сопротивлений каждой ветви.

    4. Рассчитать комплекс полного сопротивления параллельного участка

    5. Рассчитать комплекс полного сопротивления цепи.

    6. Рассчитать комплекс тока в неразветвленной части цепи.

    7. Рассчитать комплекс напряжения на неразветвленном участке цепи.

    8. Рассчитать комплекс напряжения на параллельном участке цепи.

    9. Рассчитать комплексы токов параллельных ветвей.

    10. Составить баланс комплексных мощностей.

    11. Построить векторные диаграммы.


    Дано:


    Рисунок 2.1 - Задание


    Вариант

    U,

    В

    f,

    Гц

    С3,

    мкФ

    L1,

    мкФ

    L2,

    мГн

    L3,

    мГн

    R1,

    Ом

    R2,

    Ом

    R3,

    Ом

    9

    100

    125

    100

    15,9

    15,9


    115

    10

    5

    10


    1. Положительное направление напряжения на зажимах источника указывается произвольно. Положительное направление токов в ветвях указывается в соответствии с выбранным направлением напряжения.



    1. Индуктивное XLi и емкостное ХСi сопротивления реактивных элементов находятся по соответствующим формулам: ;




    При расчете реактивных сопротивлений индуктивности подставляются в формулы в генри (Гн), а емкости в фарадах (Ф).

    С1 = 1.0000e-004

    L1 = L2 = 0.0159

    L3 = 0.1150




    1. Комплексы полных сопротивлений ветвей Zi записываются в соответствии с выражением:




    1. Комплекс полного сопротивления двух параллельных ветвей рассчитывают по формуле, аналогичной для расчета эквивалентного сопротивления параллельных ветвей постоянного тока. Но вместо R в нее входят соответствующие комплексы полных сопротивлений Zi. Например:


    Рисунок 4.1 - Эквивалентные схемы расчетной цепи

    1. После расчета комплекса полного сопротивления параллельного участка цепь, изображенная на рисунке 2.2, может быть представлена одной из эквивалентных схем (рис. 2.3)Комплекс полного сопротивления всей цепи z можно найти суммированием комплексов Z1 и Z23 :





    1. В соответствии с эквивалентными схемами (рис. 2.3) комплекс тока в неразветвленной части цепи можно найти на основании закона Ома для последовательной цепи, записанного в комплексной форме:




    1. Комплексы напряжений на неразветвленном и на параллельном участке цепи легко определить, пользуясь законом Ома для участка цепи, т. к. комплексы I1, Z1 и Z23 известны:

    ;


    7. Комплексы токов в параллельных ветвях можно рассчитать, пользуясь законом Ома, т. к. комплексы полных сопротивлений параллельных ветвей известны, а комплекс на параллельном участке определен в предыдущем пункте:

    ;

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




    Для проверки примем S1+S2+S3=X

    И сравним S и X.



    Как видно S и X равны, следовательно, расхождение балансов равно 0%.

    9. Построим векторные диаграммы, согласно нашим расчетам


    Рисунок 4.2- Векторная диаграмма токов

    Рисунок 4.3 - Векторная диаграмма напряжений

    Список литературы


    • В.И.Горбаченко "Вычислительная линейная алгебра с примерами на MATLAB. СПб.: БХВ-Петербург, 2011. – 320с.

    • Шампайн Л. Ф., Гладвел И., Томпсон С. Решение обыкновенных дифференциальных уравнений с использованием MATLAB: Учебное пособие. 1-е изд. СПб.: Лань, 2009, 304 с.

    • В.Ф. Худяков, В.А. Хабузов Моделирование источников вторичного электропитания в среде MATLAB 7.x: учебное пособие. СПб.: ГУАП, 2008, 382 с. .

    • И.Ф. Цисарь, В.Г. Нейман. Компьютерное моделирование экономики. М.: ДИАЛОГ-МИФИ, 2008.-384с.

    • И.Ф. Цисарь. MATLAB Simulink. Компьютерное моделирование экономики. М.: Солон-Пресс, 2008.-256с.

    • Чарльз Генри Эдвардс , Дэвид Э. Пенни. Дифференциальные уравнения и краевые задачи: моделирование и вычисление с помощью Mathematica, Maple и MATLAB. 3-е издание. Киев.: Диалектика-Вильямс, 2007. ISBN 978-5-8459-1166-7.

    • И. Черных. Моделирование электротехнических устройств в MATLAB, SimPowerSystems и Simulink. М.: ИД Питер, 2007, 288 с. ISBN 978-5-388-00020-0.

    • С.П. Иглин Теория вероятностей и математическая статистика на базе MATLAB. Харьков: НТУ "ХПИ", 2006,-612 стр.

    • С.Д.Штовба Проектирование нечетких систем средствами MATLAB. М.: Горячая Линия - Телеком, 2007,-288 стр. ISBN: 5-93517-359-X.



    написать администратору сайта