Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основные понятия среды MATLAB.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

5.5 Локальные и глобальные переменные

Переменные, которые используются в теле M-функции и не совпадают с именами формальных параметров этой функции, называются локальными, т. е. они "невидимы" в командном окнед и другими М-функциями.

Чтобы рабочая область системы MATLAB и M-функции могли совместно использовать переменную, её всюду нужно объявить как глобальную с помощью ключевого слова global.

Синтаксис.

global список переменных – объявление глобальных переменных.

Пример.

Создание и использование глобальной переменной cof (рис. 1.15).

Рис. 1.15 Листинг М-файла и операторов командного окна с использованием глобальных переменных

Любое изменение глобальной переменной кокой-либо частью програмы немедленно воспринимается всеми областями, где эта переменная объявлена глобальной.

5.6 Созданий функций пользователя и указателей на функции. Функции как аргументы функций.

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

Синтаксис.

  • inline(expr) – создает функцию от одной переменной, заданую символьным выражением expr. В качестве аргумента функции определяется переменная х, если параметр х отсутствует, то вкачестве аргумента определяется ближайшее имя параметра в алфавитном порядке;

  • inline(expr,arg1,arg2,...) – создает функцию от нескольких переменных arg1, arg2,..., заданую символьным выражением expr.

Примеры.

1. >> g = inline('t^2'); % определение функции возведения в квадрат

>> g(3) % возведение в квадрат числа 3

ans = 9

>> a=[1 2;3 4]; % задание матрицы

>> g(a) % возведение в квадрат матрицы

ans =

7 10

15 22

2. >> f1 = inline('w(1) + w(2)*x','w','x');

>> y1 = f1([1 2],3)

y1 = 7

Также удобным способом обращения к функциям является указатель на функцию: function_handle. Создать такой указатель можно двумя способами:

  • с помощью операции @ – адресация:

  • специальной функцией str2func(’function name’).

Синтаксис.

  • handle = @functionname – создает указатель на функцию с именем functionname;

  • handle = @(arglist)my_fun – создает указатель на функцию my_fun , с аргументами, перечислеными в списке arglist

  • handle = str2func('my_fun') – создает указатель на функцию my_fun, заданую в виде строки символов;

  • handle = str2func('@(x)'my_fun(x)')) – создает указатель на функцию my_fun(х), заданую в виде строки символов.

Результат, возвращаемый функциями handle представляет собой имя указателя.

Пример.

1. >> h=@sin – создание указателя h на стандартную встроенную функцию вычисления синуса;

2. >> rad = @(x,y) sqrt(x.^2+y.^2) – создание указателя rad для вычисления радиуса окружности:

3. >> MySqr = @(x)[x;x.^2] – вычисления квадрата числа

>> MySqr([1 2 3])

ans =

1 2 3

1 4 9

Использование inline-функций и указателей очень удобно в тех случаях, когда параметром некоторой функции является функция, например, при использовании функции fplot('fun',limits) – построение графика функции fun или в задачах численного интегрирования, где аргументами функций, реализующих формулу приближенного значения определенного интеграла является подинтегральная функция (например, quad('fun',a.b) ). Следует отметить, что функция как аргумент является строковым параметром. Если функция описана командой inline, то в списке аргументов брать ее имя в апострофы не надо, так как при считывании имени выполняется подстановка символьной строки.

Примеры.

1. Вычисление . Для этого определим подинтегральную функцию как поэлементное возведения в квадрат.

>> g = inline('x.^2'); % описание функции

>> quad(g,0,1) вызов функции вычисления интеграла

ans = 0.3333

2. Построение графика функции , заданой М-файлом.

Создадим М-файл который описывает функцию и сохраним его на диске:

function y = sqr2( x )

% Вычисление квадрата числа

y=x.^2;

end

Далее, в командном окне создадим указатель используя два способа:

1) >> fh = str2func('@(x)sqr2(x)'); % создание указателя на функцию с

% использованием str2func4

2) >> fh = @sqr2; % создание указателя с использованием @

Вызовем функцию построения графика:

fplot(fplot('fun_name',limits),

используя в качестве параметра указатель 'fun_name':

>> fplot(fh,[0 2]) % построение графика функции, заданой М-файлом

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

Синтаксис.

feval('<'fun_name'>', x1, ..., xn), где 'fun_name'– список имен функций, x1, ..., xn – список аргументов.

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

Пример.

Зададим переменную fun, как вектор из трех символьных значений, которые соответствуют именам стандартных функций:

>>fun = ['sin'; 'cos'; 'log']

1. >>for k=1:3 % используя цикл. где k – номет элемента вектора fun

fplot(fun(k,:),[0.1 pi]) % построим график каждой функции на

hold on % удердивая одно графическое окно

end % результат выполнения представлен на рис. 1.16

Рис. 1.16 Построение графиков функций с использованием массива символьных переменных

2. Используя команду input, организуем выбор функции (в данном примере cos) и задание ее аргументов в диалоговом режиме:

>> k = input('Указать номер функции в списке: ');

Укажем номер функции в списке: 2.

>> x = input('Ввести значение x: ');

Введем значение x: pi.

Далее, используя функцию feval, вычислим значение выбраной функции в заданой точке:

>> (fun(k, :), x)

ans = -1

5.7 М-файл для создания классов

Как было отмеченоранее, среда MATLAB является объектно –ориентированой и позволяет создавать классы пользователя. В рассматриваемой версии MATLAB 7.8 такая возможность предусмотрена использованием М-файла Class M-file (рис. 1.17).

Рис. 1.17 Бланк Class M-file

Бланк Class M-file имеет следующую структуру:

  • заголовок М-файла – classdef name. Начинается с ключевого слова classdef, name – имя класса. Полный синтаксис заголовка имеет вид:

classdef (ConstructorOnLoad=True) PositivIntegers < Integers & Positive, где ConstructorOnLoad= True – атрибут класса и его значение(тип булеан), PositivIntegers – имя класса, Integers & Positive – супер класс;

  • % комментарии;

  • блок описания свойств класса – properties … end, имеет следующую структуру:

properties

property_name = значение (не обязательно), причем в качестве значения может выступать арифметическое или логическое выражение;

end;

  • блок описания методов класса (может быть пустой):

methods

(методы)

end;

  • блок описания событий класса (не обязательный):

events

(собития)..

end;

  • end – завершение М-файла.

Для инициализации значений удобнее всего использовать стандартные методы get и set:

methods

function value = get.PropertyName(object)

...

end

function obj = set.PropertyName(obj,value)

...

end

end % окончание блока methods

Инициализировать класс можно с помощью конструктора:

function obj = myClass(a,b,c)

obj.A = a;

...

end

Для сохранения класса с его компонентами можно создать отдельную директорию, имя которой должно начинаться с символа @. Тогда обратиться к классу можно с помощь следующей программной строки: >> dir4/@имя_директории/имя_класса.m.

При этом нет необходимости настраивать среду на путь к директории, в которой этот класс сохраняется,

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

>> x=mycl;

Пример.

Создадим экземпляр класса "MyAnimal" (мое животное) и запишем в М-файл.

classdef MyAnimal

properties % свойства

Species = 'cat'; % вид животного – кот

Name = 'Bars'; % имя

BirthYear= 2007; % год рождения

BirthMonth = 10; % месяц рождения

age=0; % полных лет (по умолчанию=0)

end% properties

methods % методы

function obj=MyAnimal % определение полных лет

b= clock; a=[obj.BirthYear obj.BirthMonth 0 0 0 0];

c=etime(b,a)./3600./24./365; y=round(c);

obj.age = y;

end % set.age

end% methods

end % classdef

В строке командного окна создадим переменную с класса MyAnimal.

>> c=MyAnimal

c = MyAnimal – результат создания переменной, выведенный на экран

Properties:

Species= 'cat'

Name= 'Bars'

BirthYear= 2007

BirthMonth: 10

age: 6

Methods

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

classdef MyAnimal

properties % свойства

Species='' % вид животного

Name='' % имя

BirthYear=0 % год рождения

BirthMonth=0 % месяц рождения

age=0; % полных лет (по умолчанию=0)

end% properties

methods % методы

function obj=MyAnimal % определение полных лет

b= clock; a=[obj.BirthYear obj.BirthMonth 0 0 0 0];

c=etime(b,a)./3600./24./365; y=round(c);

obj.age = y;

end % set.age

end% methods

end % classdef

>> c=MyAnimal;

>> c.Species='cat'; c.Name='Bars';

>> c.BirthYear=2007; cBirthMonth.=10;

Более детальную информацию о классах и их использовании можно найти в документации к системе.