ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ
УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«ВОРОНЕЖСКИЙ ГОСУДАРСТВЕННЫЙ
УНИВЕРСИТЕТ»
КРАТКОЕ ВВЕДЕНИЕ В СИСТЕМУ OCTAVE
Учебно-методическое пособие для вузов
Составитель
Я.А. Израилевич
Издательско-полиграфический центр
Воронежского государственного университета
2009
Стр.1
ВВЕДЕНИЕ
В последнее время усилился интерес к свободно распространяемому
программному обеспечению (freeware) — как альтернативе коммерческому
лицензионному программному обеспечению (proprietary software), причем
этот интерес характерен для самых различных сфер деятельности, включая
образование и бизнес. Стоит отметить, что основной альтернативой коммерческому
лицензионному пакету Microsoft Office является свободно распространяемый
пакет OpenOffice.org, и что имеется достаточно широкий выбор
свободно распространяемых средств программирования и разработки баз
данных, а в качестве альтернатив таким коммерческим лицензионным пакетам
компьютерной математики, как Mathematica, Maple и MATLAB, часто
используют программы Maxima и scilab, существенно уступающие своим
коммерческим лицензионным конкурентам (как это обычно и бывает). Определенный
интерес может представлять такая свободно распространяемая
программа компьютерной математики, как GNU Octave. Ее возможности в
решении задач математического программирования шире, чем у Maxima,
scilab и OpenOffice.org Calc, а документация по Octave вполне удобочитаема
и подробна. Отметим наличие в Octave основных финансовых функций, активно
используемых в финансовой математике и финансовом анализе; это
позволяет в ряде случаев сравнивать результаты расчетов в Octave и
OpenOffice.org Calc. Несмотря на примитивизм интерфейса Octave и даже
некоторую неустойчивость в работе, к Octave можно быстро приспособиться
и успешно ее использовать, по крайней мере для определенного ограниченного
круга задач. Дистрибутив и описание GNU Octave Вы можете получить
легально и бесплатно на сайтах
http://www.octave.org
http://www.gnu.org/software/octave/
или по адресу
http://freestatistics.altervista.org/click/fclick.php?fid=48
или там, где найдете (также легально и бесплатно).
Ниже дано беглое введение в систему GNU Octave и описано применение
Octave к решению некоторых простых задач учебного характера, связанных
с математическим программированием и финансовой математикой.
3
Стр.3
и построим график командой
octave.exe:1> t = -10:0.1:10;
octave.exe:2> plot (t, sin(t));
– эта команда откроет графическое окно, в котором и покажет нам
график. Заметим, что передвигая курсор этого окна, мы можем в левом
нижнем углу графического окна видеть абсциссы и ординаты различных
точек на графике.
Для численного уточнения корня применим функцию fsolve .. Для
этого сначала зададим функцию y = f(x)
octave.exe:3>function y = f (x)
y=sin(x)
endfunction
а затем уточним начальное приближение (скажем, 3.0) к корню
octave.exe:4>[x, info] = fsolve (@f, [3.0])
Octave сообщит нам о том, что корень найден, выдав
info = 1
Командой octave.exe:5> x, получим x = 3.1416
Рассмотрим теперь несколько более сложное уравнение
x3-5sin(3x)=0.
Командами
Ясно, что вне промежутка [-2,2] корней у этого уравнения нет.
octave.exe:6>t=-2:0.1:2;
octave.exe:7>plot (t, t.*t.*t.-5*sin(3*t));
построим график левой части уравнения на промежутке [-2,2]. Кроме
очевидного корня x=0 на графике видна пара симметричных относительно
нуля корней, приближенно равных –1 и 1. Зададим функцию g командой
octave.exe:6>function y = g(x)
y=x^3-5*sin(3*x)
endfunction
и уточним начальные приближения командами
octave.exe:7>[x, info] = fsolve (@g, [1])
octave.exe:8>x
x=0.98341
что даст нам
и
что даст нам
octave.exe:9>[x, info] = fsolve (@g, [-1])
octave.exe:10>x
x=-0.98341
6
Стр.6
РЕШЕНИЕ ЗАДАЧ ЛИНЕЙНОГО ПРОГРАММИРОВАНИЯ
Рассмотрим
следующую
программирования:
max{3x-4y}
x >= 0
y >= 0
x+y <=1
Решим ее численно с помощью доступной в Octave функции glpk из
GNU GLPK library. Для этого зададим вектор коэффициентов целевой
функции командой
octave:1> C = [3,-4]'
и параметр s = –1, что означает максимизацию, командой
octave:2> s = -1;
(Обратите внимание на символ транспонирования ‘ )
Ограничения x >= 0 , y >= 0 зададим командой
octave:3> lb = [0,0]';
означающей, что обе переменные ограничены снизу нулем, и командой
octave:4> ub = [];
означающей, что обе переменные формально не ограничены сверху.
(Симвод l в команде lb = [0,0]'; – это, конечно строчная буква, соответствующая
заглавной L – от lower bounds – нижние границы, а отнюдь не единица.)
Для учета ограничения x+y <=1 зададим матрицу A и вектор B
командами
octave:5>A= [1,1]
octave:6>B= [1]
а также зададим параметр ctype = "U" командой
octave:7>ctype = "U";
что означает знак "<=" в ограничении, которое задается с помощью A и B в
данном случае. Команда
octave:8>vartype="CC";
указывает, что обе переменные непрерывны (не дискретны). Далее зададим
нормальный уровень вывода командой
octave:9> param.msglev = 2;
и ограничим количество шагов симплекс-метода величиной 100 с помощью
команды
octave:10> param.itlim = 100;
Теперь запустим функцию glpk командой
octave:11>[xmin, fmin, status, extra] = ...
glpk (C, A, B, lb, ub, ctype, vartype, s, param);
7
несложную
задачу
линейного
Стр.7
Многоточие “…” здесь обозначает, что команда продолжается на
следующей строке.
В качестве результата получаем среди прочего значение целевой
функции в точке максимума
objval = 3.000000000e+000
и саму точку максимума
xmin =
1
0
Рассмотрим теперь следующую задачу линейного программирования;
она получена из примера, приведенного на листе «График занятости» файла
SOLVSAMP.xls из пакета Microsoft Office.
min { x(1)+x(2)+x(3)+x(4)+x(5)+x(6)+x(7)}
x(2)+x(3)+x(4)+x(5)+x(6) >= 22
x(3)+x(4)+x(5)+x(6)+x(7) >= 17
x(1)+x(4)+x(5)+x(6)+x(7) >= 13
x(1)+x(2)+x(5)+x(6)+x(7) >= 14
x(1)+x(2)+x(3)+x(6)+x(7) >= 15
x(1)+x(2)+x(3)+x(4)+x(7) >= 18
x(1)+x(2)+x(3)+x(4)+x(5) >= 24
x(i) целые
x(i) >= 0
Решим ее численно с помощью доступной в Octave функции glpk из
GNU GLPK library. Для этого зададим вектор коэффициентов целевой
функции командой
octave:1> c = [1, 1, 1,1,1, 1,1]';
и параметр s = 1, что означает минимизацию, командой
octave:2> s = 1;
Ограничения x(i) >= 0 зададим командой
octave:3> lb = [0, 0, 0,0, 0, 0,0]';
означающей, что все переменные ограничены снизу нулем, и командой
octave:4> ub = [];
означающей, что все переменные формально не ограничены сверху.
Команда octave:5> vartype = "IIIIIII" указывает, что все перемен-ные –
целые. (Здесь символ I –заглавная буква, соответствующая строчной i ).
Для учета оставшихся ограничений зададим матрицу a и вектор b
командами
octave:6> a = [ 0,1,1, 1, 1,1,0;
0,0,1, 1, 1,1,1;
1,0,0, 1, 1,1,1;
1,1,0, 0, 1,1,1;
1,1,1, 0,0,1,1;
8
Стр.8