Функции GNU Octave

Материал из Xgu.ru

Перейти к: навигация, поиск
stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.

Если вы считаете, что её стоило бы доработать как можно быстрее, пожалуйста, скажите об этом.

Автор: Владимир Кореньков
Правильная ссылка: http://xgu.ru/wiki/octave/function

Содержание


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

[править] Определение функций

В общем виде функция имеет следующий синтаксис:

function [ret-list] = name(arg-list)
... команды ...
endfunction

где ret-list -- перечень переменных, с возвращаемыми (рассчитанными значениями), arg-list -- перечень переменных, передаваемых в функцию в качестве исходных данных (оба списка параметров не являются обязательными).

Tip-icon.gif

Замечание! Когда GNU Octave сталкивается с неизвестным именем функции в командной строке, начинается просмот всех директорий, определенных в LOADPATH. В случае совпадения данного названия с аналогичным именем файла в каком-либо каталоге, начинается его "автоматическая" загрузка и выполнение. Таким образом, ОБЯЗАТЕЛЬНЫМ является условие идентичности названия функции и имени m-файла, в котором она определена (например, функция MyFunction должна описываться в файле MyFunction.m). Кроме того, файлы-функции должны начинаться с ключевого слова function!

[править] Функции с входными и выходными параметрами

Пример 1. Функции без выходных параметров (аналог понятия "процедура")

# Файл SumOfVectors.m
# Сложение векторов

function SumOfVectors(v1, v2)
# функция disp(arg) просто печатает на экран выражение arg
disp("Sum = "), disp(v1 .+ v2);
endfunction

Пример использования

> n = 0:5;
> m = 0:5;
> SumOfVectors(n,m)
Sum =
0 2 4 6 8 10


Пример 2. Функции с одним входным и одним выходным праметром

# Файл RadToGrad.m
# Преобразование радиан в градусы

function g = RadToGrad(r)
g = r * 180 / pi;
endfunction

Пример использования

> RadToGrad(pi/2)
ans = 90


Пример 3. Функции с несколькими входным и выходными праметрами

# Файл RootsOfEquations.m
# Решение квадратного уравнения вида ax^2+bx+c=0 (для действительных и комплексных корней)

function [x1,x2] = RootsOfEquations(a,b,c)
D = b^2 - 4 * a * c;
x1 = (-b - sqrt(D)) / (2 * a);
x2 = (-b + sqrt(D)) / (2 * a);
endfunction

Пример использования

> [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


Icon-caution.gif

Внимание! В файлах-функциях все имена переменных внутри файла, а также имена переменных из ret-list и arg-list, указанные в заголовке воспринимаются как локальные.

[править] Функции с заранее неизвестным числом параметров

Если число параметров задаваемых в качестве входных известно лишь в процессе выполнения функции, то для их объявления следует использовать конструкцию varargin. Эта обобщающая конструкция представляет собой одномерный массив, каждый элемент которого -- отдельный параметр.

Пример 4. Функция вывода диагностического сообщения (аналог printf либо sprintf')

function MyMessage(varargin)
# результирующее сообщение будет храниться в переменной S строчного типа
S = "";
# просматриваем массив входных параметров
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);
endfunction

Пример использования

> 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)
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);
end
function y = f(x)
y = exp(x);
end
for k=1:15;
err(k) = abs(exp(1)-1-trapez('f',0,1,2^k));
end

[править] Вычисление формул, представленных в виде строк

Описанные ниже две функции могут быть полезны при вычислении формул, представленных в виде строк либо текстовых файлов. Например, документ 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 прерывание выполнения (выход из функции)


Octave GNU Octave

Инсталляция | Синтаксис языка | Командная строка
Скрипты | Функции | Регулярные выражения | Массивы | Графики | Ввод/вывод данных
Распределенные вычисления | Численные методы | Сплайны