]]> ]]>

GNU Octave

Реализация языка программирования MATLAB

GNU Octave (назван в честь бывшего преподавателя главного разработчика) — система для математических вычислений, использующая язык высокого уровня, совместимый с MATLAB.

Проект GNU Octave был начат в 1988 году; изначально он предназначался для курса по дизайну химических реакторов. В 1992 году началась его разработка как отдельного программного продукта.

GNU Octave написан на C++ с использованием STL. Скрипты на этом языке интерпретируются. Система распространяется под лицензией GNU GPL.

Синтакс Octave по большей части повторяет синтакс MATLAB, но добавляет ряд новых возможностей:

  • строки можно заключать как в одинарные, так и в двойные кавычки (MATLAB — только одинарные).
  • к комментариям % и %{ ... %} в стиле MATLAB добавляются комментарии # и #{ ... #}.
  • C-подобные операторы += -= *= /= \= ^= .*= ./= .\= .^= ! != ++ --.
  • функции можно определять в скриптах и в самом интерпретаторе (в MATLAB — только в специальных .m файлах).
  • оператор конца блока может зависеть от того, какого типа этот блок: вместо одного end в MATLAB в Octave рекомендуется использовать endif, endfor, endwhile и т.д.
  • Octave менее строг к правилам разбиения длинных команд на несколько строк: явно указывать разбиение необходимо только в том случае, когда трактовка строк неоднозначна.
  • в Octave к механизму try-catch добавляется механизм unwind_protect, вдохновленный Lisp. Это позволяет создавать конструкции try-catch-finally для обработки ошибок.
  • Octave позволяет индексирование временных переменных. Например, x = 1:10; y = sin(x)(1:3) — валидная конструкция в Octave, когда как MATLAB требовал бы отдельной промежуточной переменной для хранения sin(x).

Примеры:

Hello, World!:

Пример для версий GNU Octave 3.2.3

Первая функция аналогична printf в C. Вторая — специфична для MATLAB.

printf("Hello, World!\n");

disp("Hello, World!");

Факториал:

Пример для версий GNU Octave 3.2.3

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

for i = 0 : 16
  printf("%d! = %d\n", i, factorial(i));
endfor

Факториал:

Пример для версий GNU Octave 3.2.3

Используется рекурсивное вычисление факториала. Точка с запятой в конце строки подавляет автоматический вывод только что вычисленного значения (в данном случае fact) в интерактивном режиме, чтобы не засорять отформатированный вывод.

fact = 1;
for i = 0 : 16
  printf("%d! = %d\n", i, fact);
  fact *= i+1;
endfor

Факториал:

Пример для версий GNU Octave 3.2.3

Используется рекурсивное вычисление факториала.

function f = fact(n)
  if (n <= 1)
    f = 1;
  else
    f = n * fact(n - 1);
  endif
endfunction

for i = 0 : 16
  printf("%d! = %d\n", i, fact(i));
endfor

Числа Фибоначчи:

Пример для версий GNU Octave 3.2.3

Используется рекурсивное определение чисел Фибоначчи.

function f = fib(n)
  if (n <= 1)
    f = n;
  else
    f = fib(n - 1) + fib(n - 2);
  endif
endfunction

for i = 1 : 16
  printf("%d, ", fib(i));
endfor
disp("...");

Квадратное уравнение:

Пример для версий GNU Octave 3.2.3

За счет того, что Octave предназначен для работы с математическими задачами, в нем есть ряд встроенных численных методов решения стандартных задач, в том числе и нахождения корней полиномов. Чтобы найти корень полинома, достаточно вызвать функцию roots для вектора-строки, составленного из коэффициентов полинома в порядке убывания степени (т.е. коэффициент при максимальной степени x идет первым).

roots([2 -3 1])

Комментарии

]]>

blog comments powered by Disqus

]]>

Работа программистам