Пакеты
Пакет (package) Octave является аналогом toolbox Matlab. Часть пакетов устанавливается во время инсталляции системы. Список установленных (в частности после инсталляции) пакетов можно получить, выполнив в командном окне
>> pkg listКак и в Matlab, символьные вычисления в Octave поддерживаются пакетом Symbolic, но в отличие от toolbox, основанного на Maple/MuPAD, этот package не идёт с основной инсталляцией и использует SymPy. Для возможности установки пакета со страницы
octave-forge (непосредственно или скачав на локальную машину) уже должны быть установлены Python и SymPy. Со страницы
github/../octsympy можно скачать связку Symbolic + SymPy + single-file stand-alone Python для установки под Windows — файл symbolic-win-py-bundle-2.6.0.zip.
Как и при установке любого дополнительного пакета из директории на локальной машине, в среде Octave директория с инсталляцией пакета выбирается в качестве текущей и затем пакет устанавливается при помощи
>> pkg install symbolic-win-py-bundle-2.6.0.zipЕсли система ничего не сообщает в качестве ответа, то установка прошла успешно.
В моём случае (Windows Server 2003) было получено:
Use of uninitialized value in lc at /usr/lib/perl5/5.8/utf8_heavy.pl line 123.См.
Notes on Windows installation.
Для удаления пакета можно выполнить
>> pkg uninstallПосле внесения изменений в файл \lib\perl5\5.8\utf8_heavy.pl в соответствии с perl.diff [см. 'патч'] и удаления директории пакета, повторная инсталляция прошла без ошибок с сообщением:
warning: directory C:\OCTAVE~1.0\share\octave\packages\symbolic-2.6.0 previously lost
For information about changes from previous versions of the symbolic package, run 'news symbolic'. II. Сравнение символьных вычислений (начало)S.0 В общей документации системы Octave описания (дополнительного) пакета Symbolic естественно нет. Введя в командном окне
>> help имя_функции
Получим справку с большим числом искажённых символов. В общем "патч" проблему до конца не решает или я что-то делаю не так.
S.1 sym(A, falags)Из хелпа функции
sym в Matlab 8.2 (R2013b)
S = sym(A,flag) converts a numeric scalar or matrix to symbolic form.
The technique for converting floating point numbers is specified by
the optional second argument, which may be 'f', 'r', 'e' or 'd'.
The default is 'r'.
'f' stands for 'floating point'. All values are transformed from
double precision to exact numeric values N*2^e for integers N and e.
'r' stands for 'rational'. Floating point numbers obtained by
evaluating expressions of the form p/q, p*pi/q, sqrt(p), 2^q and 10^q
for modest sized integers p and q are converted to the corresponding
symbolic form. This effectively compensates for the roundoff error
involved in the original evaluation, but may not represent the floating
point value precisely. If no simple rational approximation can be
found, the 'f' form is used.
'e' stands for 'estimate error'. The 'r' form is supplemented by a
term involving the variable 'eps' which estimates the difference
between the theoretical rational expression and its actual floating
point value. For example, sym(3*pi/4,'e') is 3*pi/4-103*eps/249.
'd' stands for 'decimal'. The number of digits is taken from the
current setting of DIGITS used by VPA. Using fewer than 16 digits
reduces accuracy, while more than 16 digits may not be warranted.
For example, with digits(10), sym(4/3,'d') is 1.333333333, while
with digits(20), sym(4/3,'d') is 1.3333333333333332593,
which does not end in a string of 3's, but is an accurate decimal
representation of the double-precision floating point number nearest
to 4/3.
Выполнение в Matlab 8.2 (R2013b)
>> sym([pi, 0.3333; 0.1, inf], 'f')
ans =
[ 884279719003555/281474976710656, 6004199023210345/18014398509481984]
[ 3602879701896397/36028797018963968, Inf]
>> sym([pi, 0.3333; 0.1, inf], 'r')
ans =
[ pi, 3333/10000]
[ 1/10, Inf]
Из хелпа функции в Octave (часть текста исправлена)
The тАЬdangerтАЭ here is that typing тАШ0.1тАЩ gives a double-precision
floating-point value which differs slightly from the fraction
тАШsym(1)/10тАЩ (and this is true for most decimal expressions). It is
generally impossible to determine which exact symbolic value the
user intended. The warning indicates that some heuristics have
been applied (namely a preference for тАЬsmallтАЭ fractions, small
fractions of ╧А and square roots of integers). Further examples
include:
y = sym(pi/100)
warning: passing floating-point values to sym is dangerous, see "help sym"
warning: called from
double_to_sym_heuristic at line 50 column 7
sym at line 373 column 13
y = (sym)
pi
------
100
y = sym(pi)/100
y = (sym)
pi
------
100
(sym(pi) is a special case; it does not raise the warning).
There is an additional reason for the float-point warning, relevant
if you are doing something like тАШsym(1.23456789012345678)тАЩ. In
many cases, floating-point numbers should be thought of as
approximations (with about 15 decimal digits of relative accuracy).
This means that mixing floating-point values and symbolic
computations with the goal of obtaining exact results is often a
foolтАЩs errand. Compounding this, symbolic computations may not
always use numerically stable algorithms (as their inputs are
assumed exact) whereas a floating-point input is effectively
perturbed in the 15th digit.
If what you really want is higher-precision floating-point
computations, *note vpa::.
If having read the above, you _still_ want to do something symbolic
with floating-point inputs, you can use the RATFLAG argument; by
setting it to тАЩfтАЩ, you will obtain the precise rational number
which is equal to the floating-point value:
sym(0.1, 'f')
ans = (sym)
3602879701896397
--------------------------
36028797018963968
The default heuristic rational behaviour can be obtained by passing
RATFLAG as тАЩrтАЩ; this avoids the floating-point warning:
sym(0.1, 'r')
ans (sym) 1/10
В Octave
каждый элемент матрицы должен быть преобразован в символьное
>> [sym(pi, 'f'), sym(0.333333, 'f'); sym(0.1, 'f'), sym(inf, 'f')]
ans = (sym 2x2 matrix)
[ 884279719003555 3002396749180579]
[ --------------- ----------------]
[ 281474976710656 9007199254740992]
[ ]
[ 3602879701896397 ]
[----------------- oo ]
[36028797018963968 ]
>> [sym(pi, 'r'), sym(0.333333, 'r'); sym(0.1, 'r'), sym(inf, 'r')]
ans = (sym 2x2 matrix)
[ 333333]
[ pi -------]
[ 1000000]
[ ]
[1/10 oo ]
Об этом и подобном от разработчика
Differences between OctSymPy and the Symbolic Math ToolboxЦитата:
…
SMT's sym() constructor allows big string expressions: we don't really support that (and its not the way modern SMT is used either). Build your expressions like sym('x')/2 rather than sym('x/2'). (If you do want to pass long strings, they should be valid Python SymPy srepr syntax---i.e., you probably don't want to do this!)
…
S.2 (Константы) В toolbox symbolic Matlab 8 (наследство Maple)
Pi,
infinity — константы
,
, но нет константы
e — эту константу можно задать через
exp(1).
>> vpa('Pi')
ans = 3.1415926535897932384626433832795
>> sym('infinity')
ans = infinity
>> x= sym('exp(1)');
>> vpa(x)
ans = 2.7182818284590452353602874713527В Octave для этих константы можно использовать
pi,
inf (без кавычек), и есть константа
e (основание натурального логарифма).
>> vpa(pi)
ans = (sym) 3.1415926535897932384626433832795
>> vpa(inf)
ans = (sym) inf
>> vpa(e)
ans = (sym) 2.7182818284590452353602874713527S.3 В Octave нет сокращённого варианта синтаксиса для построения квадратной символьной матрица —
sym('a', n).
S.4 Во многих версиях Symbolic Math Toolbox (в Matlab) есть два варианта синтаксиса функции assume
assume(condition)
assume(expr, assumption)
Здесь
condition — условие, содержащее имя переменной;
expr — выражение, в частности идентификатор;
assumption — предположение.
Примеры
>> assume(x < -1 | x >1)
>> assume(x, 'integer')При вызове функции
assume удаляются ранее сделанные предположения относительно переменной. Для добавления предположений в достаточно поздних версиях Matlab имеется функция
assumeAlso, которая аналогично
assume, имеет два варианта синтаксиса
assumeAlso(condition)
assumeAlso(expr, assumption)
Примеры. Пусть
целoе и
или
>> assume(x < -1 | x >1); assumeAlso(x, 'integer');
>> assume(x, 'integer'); assumeAlso(x < -1 | x >1);В пакете symbolic (в Octave) нет аналога первого варианта синтаксиса toolbox, а второй вариант имел два существенно разных варианта синтаксиса см.
online-документациюy = assume(x, assumption1, assumption2,…)
assume(x, assumption1, assumption2,…)
В первом варианте синтаксиса предположения задаются для переменной
y, а во втором варианте для всех вхождений символов с тем же именем, что и
x.
В справке
help assume assume x, y,… assumption1, assumption2,…
Переменных может быть одна или более, предположений может быть одно или более.
В справке
help @sym/assume варианты синтаксиса
assume([x, y, …], assumption1, assumption2,…)
[x, y, …] = assume([x, y, …] assumption1, assumption2,…)
S.5 В Symbolic Math toolbox (SMT) Matlab функция subs может иметь один, два или три аргумента. В пакете Symbolic Octave — нет варианта с одним аргументом.
S.6limit(f, t, t_0)
Здесь
f — символьное выражение, содержащее идентификатор
t; третий аргумент — точка, в которой должен быть вычислен предел (число/
/-
).
Для вычисления предела справа (слева) в точке
t_0 используется вызов функции
limit с дополнительным параметром — направлением:
'left' (для предела слева) или
'right' (для предела справа). Если выражение
f не содержит параметры, то указание переменной в списке аргументов функции может быть опущено. Если предел находится в 0, то указание точки может быть опущено.
S.6.1 Системы демонстрируют иногда «странное» поведение «на умолчаниях»
Symbolic Math Toolbox (SMT) Matlab 6.5 (Maple)
Код:
>> limit(sym('sin(x)/x'), 'x', 0)
ans = 1
>> limit(sym('sin(x)/x'), 'x')
??? Error using ==> sym/maple
Error, (in limit) invalid arguments
Error in ==> C:\MATLAB6p5\toolbox\symbolic\@sym\limit.m
On line 58 ==> r = maple('map','limit',f,MapleString);
>> limit(sym('sin(x)/x'))
ans =1
SMT Matlab R2013b
Код:
>> limit(sym('sin(x)/x'), 'x', 0)
ans = 1
>> limit(sym('sin(x)/x'), 'x')
ans = 0
>> limit(sym('sin(x)/x'))
ans = 1
Примечание. В окне MuPad
limit(sin(x)/x, x) вычисляется верно.
Symbolic package Octave (SymPy)
Код:
>> syms x
>> limit(sin(x)/x, x,0)
ans = (sym) 1
>> limit(sin(x)/x, x)
ans = (sym) 0
>> limit(sin(x)/x)
ans = (sym) 1
S.6.2 Различное поведение в случае, если предел не может быть найден. например, не может быть найден придел
,
, если не указать системе знак параметра
.
SMT Matlab R2013b: если предел не может быть вычислен, то возвращается исходное выражение
Код:
>> limit(sym('x^2*exp(-a*x)'), 'x', +inf)
ans = limit(x^2*exp(-a*x), x == Inf)
>> a=sym('a', 'positive');
>> limit(sym('x^2*exp(-a*x)'), 'x', +inf)
ans = 0
Symbolic package Octave (SymPy)
Код:
>> syms x a
>> limit(x^2*exp(-a*x^2), x, +inf)
error: Python exception: NotImplementedError
occurred at line 12 of the Python code block:
q[i] = _op(*[k[i] if isinstance(k, MatrixBase) else k for k in _ins])
error: called from
python_cmd at line 179 column 7
elementwise_op at line 99 column 5
limit at line 92 column 5
>> assume(a, 'positive')
>> limit(x^2*exp(-a*x^2), x, +inf)
ans = (sym) 0
S.6.3 Различное поведение в случае, если предел не существует. На примере
,
.
SMT Matlab R2013b: если найдено, что придел не существует, то возвращает NaN
Код:
>> limit(sym('2^(1/x)'), 'x',0)
ans = NaN
>> limit(sym('2^(1/x)'), 'x',0, 'left')
ans = 0
>> limit(sym('2^(1/x)'), 'x',0, 'right')
ans = Inf
Symbolic package Octave (SymPy)
Код:
>> limit(sym(2^(1/x)), x,0)
ans = (sym) oo
>> limit(sym(2^(1/x)), x,0, 'left')
ans = (sym) 0
>> limit(sym(2^(1/x)), x,0, 'right')
ans = (sym) oo
S.7 Различное поведение symsum, если не указаны пределы суммирования.
В SMT вычисляется «неопределённая» сумма:
>>symsum(1/k^2, k)
ans = -psi(1, k)В OctSymPy подставляются значения по умолчанию. В качестве нижнего предела используется 0
>> symsum(1/k^2, k)
ans = (sym) nanS.8 Разные формы результатов при вычислении неопределённого интеграла
SMT (по частям)
>> int(t/cos(t)^2, t)
ans =log(cos(t)) + t*tan(t)В OctSymPy (универсальная тригонометрическая подстановка)
Код:
>> int(t/cos(t)^2, t)
ans = (sym)
/t\ / /t\ \ 2/t\ / /t\ \ / /t\ \
2*t*tan|-| log|tan|-| - 1|*tan |-| log|tan|-| - 1| log|tan|-| + 1|*ta
\2/ \ \2/ / \2/ \ \2/ / \ \2/ /
- ----------- + ----------------------- - --------------- + ------------------
2/t\ 2/t\ 2/t\ 2/t\
tan |-| - 1 tan |-| - 1 tan |-| - 1 tan |-| - 1
\2/ \2/ \2/ \2/
2/t\ / /t\ \ / 2/t\ \ 2/t\ / 2/t\ \
n |-| log|tan|-| + 1| log|tan |-| + 1|*tan |-| log|tan |-| + 1|
\2/ \ \2/ / \ \2/ / \2/ \ \2/ /
----- - --------------- - ------------------------ + ----------------
2/t\ 2/t\ 2/t\
tan |-| - 1 tan |-| - 1 tan |-| - 1
\2/ \2/ \2/
S.9 Слегка отличающийся синтаксис
ezcontourf и ошибки в Octave.
В частности в SMT эта функция, как и другие ez-функции, не возвращает указатель на объект, а в OctSymPy — возвращает. Возвращение указателя на объект ez-функциями не критически важно в Matlab и очень важно в Octave: в Matlab есть возможность изменения свойств объектов «вручную» в графическом окне, а в Octave такой возможности нет.
ezcontourf в OctSymPy генерирует ошибку при попытке построить рисунок в случае поверхностей достаточно простого вида, например полусферы
>> p = ezcontourf(sqrt(2^2 -x^2-y^2), [-2, 2, -2, 2])А Matlab (в частности 6.5 или R2013b) строит.
S.10 Ошибки при выполнении функций
ezmesh,
ezsurfS.10.1 График функции двух переменных
С построением верхней полусферы без аргумента 'circ' SMT и OctSymPy справляются одинаково терпимо. Однако SMT строит без грубых недостатков с аргументом 'circ', а OctSymPy строит с грубой ошибкой и в дальнейшем система становится неустойчивой или генерируется ошибка времени выполнения.
>> subplot (1,2,1);
>> ezmesh('sqrt(2^2-x^2-y^2)', [-2, 2, -2, 2]);
>> subplot (1,2,2);
>> ezmesh('sqrt(2^2-x^2-y^2)', [-2, 2, -2, 2], 'circ');Вложение:
ezmesh_err.PNG [ 126.81 Кб | Просмотров: 0 ]
S.10.2 Построение параметрически заданной поверхности
SMT без проблем строит сферу, а в OctSymPy сфера строится только, если первые три аргумента функции.
Ниже приведен текст, а за ним рисунки со строками (слева) и анонимными функциями (справа).
subplot (1,2,1);
ezmesh('2*sin(v).*cos(u)', '2*sin(v).*sin(u)', '2*cos(v)', [0, pi, 0, 2*pi])
pt = get(gca, 'title')
set(pt, 'fontsize', 12)
set(gca, 'fontsize', 12)
subplot (1,2,2);
ezmesh(@(u,v)2*sin(v).*cos(u), @(u,v)2*sin(v).*sin(u), @(u,v)2*cos(v), [0, pi, 0, 2*pi])
pt = get(gca, 'title')
set(pt, 'fontsize', 12)
set(gca, 'fontsize', 12)Вложение:
ezmesh_err2.PNG [ 140.08 Кб | Просмотров: 0 ]
При задании первых трех аргументов в виде функций небольшим недостатком является неправильные подписи осей, но это, конечно, можно преодолеть вызовами
xlabel и
ylabel.
Прим. В Octave ez-функции не входят в пакет Symbolic. Сравнение этих функций помещено в этот раздел в связи с тем, что в Matlab они входят в SMT.
В заключение, OctSymPy (пакет Symbolic на базе SymPy для Octave), на мой взгляд, пока очень сырой и имеются некоторые довольно огорчительные расхождения c синтаксисом или возможностями Symbolic Math toolbox Matlab. Довольно огорчительные ограничения/расхождения это: 1) меньшие возможности по заданию предположений, 2) менее удобное формирование символьных матриц.