Функции GNU Octave
Материал из Xgu.ru
Автор: Владимир Кореньков
Правильная ссылка: http://xgu.ru/wiki/octave/function
Содержание |
Одним из современных принципом программирования является принцип модульности, соглано которому отдельные части программы, предназначенные для решения локальных задач, организовываются в подрограммы. В GNU Octave указанный принцип обеспечивается использованием файлов-сценариев и функций.
[править] Определение функций
В общем виде функция имеет следующий синтаксис:
function [ret-list] = name(arg-list)
... команды ...
endfunction
где ret-list -- перечень переменных, с возвращаемыми (рассчитанными значениями), arg-list -- перечень переменных, передаваемых в функцию в качестве исходных данных (оба списка параметров не являются обязательными).
Замечание! Когда GNU Octave сталкивается с неизвестным именем функции в командной строке, начинается просмот всех директорий, определенных в LOADPATH. В случае совпадения данного названия с аналогичным именем файла в каком-либо каталоге, начинается его "автоматическая" загрузка и выполнение. Таким образом, ОБЯЗАТЕЛЬНЫМ является условие идентичности названия функции и имени m-файла, в котором она определена (например, функция MyFunction должна описываться в файле MyFunction.m). Кроме того, файлы-функции должны начинаться с ключевого слова function! |
[править] Функции с входными и выходными параметрами
Пример 1. Функции без выходных параметров (аналог понятия "процедура")
# Файл SumOfVectors.m
# Сложение векторов
function SumOfVectors(v1, v2)
endfunction
- # функция disp(arg) просто печатает на экран выражение arg
- disp("Sum = "), disp(v1 .+ v2);
Пример использования
> n = 0:5;
> m = 0:5;
> SumOfVectors(n,m)
Sum =
- 0 2 4 6 8 10
Пример 2. Функции с одним входным и одним выходным праметром
# Файл RadToGrad.m
# Преобразование радиан в градусы
function g = RadToGrad(r)
endfunction
- g = r * 180 / pi;
Пример использования
> RadToGrad(pi/2)
ans = 90
Пример 3. Функции с несколькими входным и выходными праметрами
# Файл RootsOfEquations.m
# Решение квадратного уравнения вида ax^2+bx+c=0 (для действительных и комплексных корней)
function [x1,x2] = RootsOfEquations(a,b,c)
endfunction
- D = b^2 - 4 * a * c;
- x1 = (-b - sqrt(D)) / (2 * a);
- x2 = (-b + sqrt(D)) / (2 * a);
Пример использования
> [Root1, Root2] = RootsOfEquations(4,1,0)
Root1 = -0.25
Root2 = 0
>
> [Root1, Root2] = RootsOfEquations(3,2,2)
Root1 = -0.33333 - 0.74536i
Root2 = -0.33333 + 0.74536i
Внимание! В файлах-функциях все имена переменных внутри файла, а также имена переменных из ret-list и arg-list, указанные в заголовке воспринимаются как локальные. |
[править] Функции с заранее неизвестным числом параметров
Если число параметров задаваемых в качестве входных известно лишь в процессе выполнения функции, то для их объявления следует использовать конструкцию varargin. Эта обобщающая конструкция представляет собой одномерный массив, каждый элемент которого -- отдельный параметр.
Пример 4. Функция вывода диагностического сообщения (аналог printf либо sprintf')
function MyMessage(varargin)
# результирующее сообщение будет храниться в переменной S строчного типа
S = "";
endfunction
- # просматриваем массив входных параметров
- for (i = 1 : length(varargin))
- # если параметр, содержащийся в varargin{i}, строка - возвращается число 1 иначе 0
- if (ischar(varargin{i}))
- # "склеиваем" строки
- S = strcat(S, varargin{i});
- else
- # если varargin{i} число - преобразуем его в строку и присоединяем к предыдущему результату
- S = strcat(S, num2str(varargin{i}));
- endif
- endfor
- # вывод на экран сообщения (disp может обработать только одну переменную)
- disp(S);
Пример использования
> a = 1;
> b = 2;
> c = "error"
> MyMessage("a=", a, " b=", b)
a=1 b=2
>
> MyMessage("Sum = ", a+b)
Sum = 3
>
> MyMessage(c, ": ", "a*b = ", a*b)
error: a*b = 2
[править] Имя функции в качестве переменной
Данный способ используется в случаях, если необходимо вычислить функцию от функции (например, интеграл от суммы). В принципе ничего необычного в такой постановке задачи нет - просто в теле одной функции следует вызвать вторую функцию:
function FunctionName1(arg1, arg2,...)
...
...
- FunctionName2(arg3, arg4,...)
endfunctuin
Однако, если имя FunctionName2 становится известным лишь в процессе выполнения программы, то очевидно необходимо либо писать для каждого возможного случая собственную процедуру (что повлечет за собой появления большого числа одинаковых блоков кода, отличающихся лишь одним словом FunctionName2), либо использовать конструкцию:
feval(FunctionName, arg1, arg2,...)
Поясним вышесказанное на следующем примере.
Пример 5.
function S = trapez(fun,a,b,N)end
- h = (b-a)/N;
- fy = feval(fun,[a:h:b]);
- fy(1) = fy(1)/2;
- fy(N+1) = fy(N+1)/2;
- S = h*sum(fy);
function y = f(x)end
- y = exp(x);
for k=1:15;end
- err(k) = abs(exp(1)-1-trapez('f',0,1,2^k));
[править] Вычисление формул, представленных в виде строк
Описанные ниже две функции могут быть полезны при вычислении формул, представленных в виде строк либо текстовых файлов. Например, документ LaTex можно обработать, сохранив отдельно перечень формул, вычислить их в Octave и подставить результаты обратно в исходный tex-файл.
Пример 6. Использование функции eval для вычисления формулы, представленной в виде строки
> x = 2;
> S = "x^2-1";
> y = eval(S) # результат вычислений присваивается переменной y
y = 3
Пример 7. Использование функции inline для вычисления и преобразования формулы к виду f(x) = ...
> x = 2;
> S = "x^2-1";
> y = inline(S) # здесь y не переменная, а имя функции y(x) = x^2-1
> y(2)
ans = 3
[править] Встроенные функции
return прерывание выполнения (выход из функции)
GNU Octave Инсталляция |
Синтаксис языка |
Командная строка
|
---|