2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 GNU Octave 4 под Windows
Сообщение07.07.2018, 20:55 
Заслуженный участник


12/07/07
4438
На русском языке есть краткий учебный курс по третьей версии:
Алексеев Е.Р., Чеснокова О.В. Введение в Octave для инженеров и математиков. — M.: ALT Linux, 2012.

Загрузить инсталляцию [Octave, версия 4.4] можно с gnu.org.

Ниже при сравнении Octave с Matlab имеется в виду версия Octave 4.4 (под Windows) и Matlab 8 (под Windows).

Буду благодарен за уточнения для текущих версий Matlab под Windows, а также указание других отличий. Указанные в сравнении отличия — это то с чем столкнулся (систематически функции не сравнивались).

Близкие темы и отдельные сообщения на форуме: «Сравнение альтернатив Matlab (Scilab, Octave, FreeMat», «Выбор ПО для численных методов», post ewert, post myhand, post maxal
________________________________________

Сравнение MatLab и Octave 4.4.
I. Среда и базовые возможности


A.1. В Octave «редактор» рисунков имеет значительно меньше возможностей, чем редактор рисунков в MatLab. Перенести при помощи буфера обмена из окна рисунка в сторонний графический редактор рисунок в векторном формате нет возможности. Вставить во внешний редактор можно только Bitmap.

A.2. После установки Octave, открыть сохранённый на диске рисунок (ofig-файл) из меню среды (как в Matlab) напрямую нельзя, но можно открыть из командного окна при помощи функции hload. (Обсуждение)

A.3. Попытка сохранить рисунок в векторный графический файл (ps, eps, ) как из меню окна рисунка (Файл – Сохранить как), так и из командного окна
>> h = plot(X, exp(X), 'r:x'), saveas(h, 'exp_tst.ps', 'ps')
привела к файлу, который открывает Corel Draw Х4, но изображение графика функции не отображается. Из возможных векторных форматов получилось сохранить только в svg и pdf. В Corel Draw Х4 удалось открыть svg и разгруппировать. После отмены группировки можно было убедиться, что тип линии (пунктирная) и цвет воспроизведены корректно. Однако пунктир настолько частый, что выглядит почти как сплошная линия.
(Примечание. Удалось также сохранить график в jpeg, png, tiff.)

A.4. Имеется возможность выбора (возможно нескольких) символов для комментирования (кроме традиционного символа # и совместимого с MatLab %, есть ещё такие варианты ##, %%, %!).

B.1. В Octave есть функция ifelse(mask, TVal, FVal) аналогичная тернарному оператору ? Си, if-функции MathCAD, `if`-функции Maple,… и не имеющая аналога в Matlab.
Если mask скалярное логическое значение, то TVal и FVal могут быть произвольными значениями. Функция возвращает TVal, если mask принимает значение true, либо FVal в противном случае.
Точно тоже выполняет функция merge (mask, tval, fval)

B.2. Функция str2double(S) переводит массив строк (матрицу символов) или массив ячеек, содержащих строки, в действительные или комплексные числа.
Код:
>> S = ['Inf +i'; 'NaN +j']; X = str2double(S)
X = Inf +   1i
    NaN +   1i
Такие расширенные возможности при преобразовании содержащих числа строк не поддерживают, по крайней мере, старые версии Matlab: в Matlab строка должна быть скалярной (не массив строк, т.е. не матрица символов); несколько строк с числами может содержать массив ячеек (например, str2double({'2.71' '3.1415'})).

B.3. В управляющих структурах и функциях появилась возможность уточнить end: endfunction, endif, endswitch, endfor, endwhile.

B.4. В Matlab переменные рабочего пространства и локального рабочего пространства функции недоступны в определении inline-функции.
Код:
>> a=2; f = inline('a*sin(x)', 'x');
>> f(0)
Error using inlineeval (line 15)
Error in inline expression ==> a*sin(x)
Undefined function or variable 'a'.

Error in inline/subsref (line 24)
    INLINE_OUT_ = inlineeval(INLINE_INPUTS_, INLINE_OBJ_.inputExpr,
    INLINE_OBJ_.expr);
В Octave — доступны
Пример 1 (переменные глобального рабочего пространства)
Код:
>> a= 2; f = inline('a*sin(x)', 'x')
f = f(x) = a*sin(x)
>> f(0), f(pi/2)
ans = 0
ans =  2
Пример 2 (локальные переменные функции)
Код:
function res = inline_test
  a = 2;
  f = inline('a*sin(x)', 'x');
  res = f(pi/2);
endfunction
>> inline_test
ans =  2
Пример 3 (входные аргументы)
Код:
function res = inline_test(a)
  f = inline('a*sin(x)', 'x');
  res = f(pi/2);
endfunction
>> inline_test(2)
ans =  2

B.5. Octave поддерживает аргументы со значениями по умолчанию (Default Arguments). Синтаксис:
имя_входного_аргумента = значение.
Если при вызове аргумент не будет передан, то в функцию передается значение, указанное в заголовке определения. Например
Код:
function DefArgDemo(x, opt1=1, opt2=2)
disp(opt1)
disp(opt2)     
endfunction

>> DefArgDemo(0)
1
2
>> DefArgDemo(0, 0)
0
2
>> DefArgDemo(0, 0, 0)
0
0

B.6. Octave поддерживает игнорируемые аргументы (ignoring arguments)
Если некоторый фактический аргумент не должен использоваться в функции, то вместо имени формального аргумента указывается символ “~”. Число передаваемых в функцию (фактических) аргументов, возвращаемое функцией nargin, учитывает игнорируемые аргументы.
Пример
Код:
function res = IgnoringArgDemo(~, x)
  nargin
  res = sin(x);
endfunction
>> Y = IgnoringArgDemo(0, [0, pi/2, pi])
ans =  2
Y =  0.00000   1.00000   0.00000
Если не все возвращаемые функцией результаты нужны, то для игнорирования ненужных выходных аргументов при вызове функции они должны быть заменены на ~. Функция nargout подсчитывает и игнорируемые выходные аргументы.
Пример
Код:
function [x, res] = IgnoringOutDemo(x)
  nargout
  res = sin(x);
endfunction

>> [X, Y] = IgnoringOutDemo([0, pi/2, pi])
ans =  2
X = 0.00000   1.57080   3.14159
Y = 0.00000   1.00000   0.00000
>> [~, Y] = IgnoringOutDemo([0, pi/2, pi])
ans =  2
Y = 0.00000   1.00000   0.00000
В Matlab на уровне синтаксиса функций такого нет.
-= Добавлено 9.07.2018 =-
B.7. В Matlab нет, а в Octave есть
    * расширенный [C-подобный] синтаксис присвоений: +=, -=, *=, /=, \=, ^=, .*=, ./=, .\=, .^=;
    * [C-подобные] инкремент и декремент в префиксной и постфиксной форме;
    * [C-подобный] оператор != («не равно») в дополнение к ~=;
    * возможность определения функций не только в m-файлах, но и в командном окне и сценариях.
    * возможность индексации, в том числе множественной, не только переменных, но и выражений
    Код:
    >> sin([0, pi/6, pi/4, pi/3, pi/2])([1:3, 5])
    ans = 0.00000   0.50000   0.70711   1.00000
    * второй вариант символов для построения последовательности литералов: двойные кавычки. Matlab поддерживает двойные кавычки с R2017.

В старых версиях Matlab, например 6.5, нет, а в новых версиях, например в 8, есть логические операторы «вычисляемые по короткой схеме» (short-circuit boolean operators): && и ||. В Matlab операнды должны быть скалярными выражениями.
&& : если первый операнд равен 0, то второй операнд не вычисляется, а сразу возвращается результата 0.
|| : если первый операнд равен 1, то второй операнд не вычисляется, а сразу возвращается результата 1.

В Octave у этих операторов расширен синтаксис: они обрабатывают не только скаляры, но и массивы.
Если B1 и B2 массивы, то B1 && B2 — это all(B1) && all(B2); B1 || B2 — это all(B1) || all(B2).

B.8. В Matlab нет, а Octave есть цикл do-until.
Тело цикла
Код:
do
    тело
until condition
выполняется пока condition не примет значение true. Если в качестве condition выступает числовое выражение, то оно считается true, если все элементы не нулевые.

B.9. В Octave к механизму try-catch добавляется механизм unwind_protect. Это позволяет создавать конструкции try-catch-finally для обработки ошибок.

B.10. В Octave есть функции, которых нет, по крайней мере, в старых версиях matlab.
columns(X), rows(X) —возвращают число столбцов и строк матрицы X.
sumsq(X) — сумма квадратов;
...

Многие функции допускают указание класса возвращаемого значения, многие функции при получении аргумента типа single, возвращают результат того же типа. В старых версиях Matlab, например 6.5, этого не было, но уже в 8 есть.
В следующем примере X и Y имеют тип single (экземпляры класса single)
>>X = zeros(1, ‘single’), Y = sin(X)
-= Добавлено 10.07.2018 «Графика» (Plotting) =-

C.1. С «фабричными» (см. раздел 15.3.5 Managing Default Properties) значениями свойств по умолчанию текст (в широком смысле слова: подписи осей, заголовок, легенда) выводится очень мелким шрифтом. Это приводит к необходимости часто менять размер на более крупный. Если частое изменение размера и типа шрифта свойственно одному пользователю (см. раздел 2.1.2 Startup Files), то в папке “Documents and Settings \User_Name” создаём (если его там нет) фал .octaverc. [В этой же папке лежит файл .octave_hist. По этому файлу можно проверить в той ли папке создается файл.] В файл .octaverc добавляем строки приводимого ниже вида
set(groot, 'DefaultAxesFontSize', 20);
set(groot, 'DefaultTextFontSize' ,20);

Несмотря на то, что для совместимости с Matlab поддерживается Startup.m, в документации Octave рекомендуется использовать более гибкую «иерархию» .octaverc-файлов.

С.2. В Octave не все заявленные в документации (15.3.5 Managing Default Properties) символы $\TeX$ отображаются в заголовке (функция title). Не отображаются: \surd, \wp, \perp, \langle, \rangle, \mid, \Rightarrow. (Больше символов отображается в подписях. Например отображается \Rightarrow. Но также не все.) Однако в Matlab 8 (например, R2013b) отображаются все. [Используемая ОС: Windows Server 2003; типа серверный аналог XP.] При достаточно больших размерах фонта (особенно с Times, но и с другими, хоть и в меньшей степени) в подписях осей при форматировании курсивом не отображается (в окне рисунка) верхняя правая часть некоторых символов, например W, E, T, U, (слегка)I, F, H, j, J, X, y, Y, Z, X, N, M. Это происходит как в случае присвоения свойству 'fontangle' значения 'italic', так и при использовании команды \it $\TeX$, например ylabel('{\ity}', 'fontname', 'Times').

С.3. В строках str1, str2 формата функции plot(x1, y1, str1, x2, y2, str2,…) в дополнение к указанию цвета, типа линии и типа маркера (что есть и в Matlab) имеется возможность указать подписи графика (элемента легенды) чего в Matlab нет.
X = [0: 0.2: pi];
plot(X, sin(X), '-ro;sin {\itx};', X, cos(X), '-ko;cos {\itx};', 'markersize', 20);

Вложение:
Комментарий к файлу: Изменение одного из свойств линии при помощи аргументов plot
plot.png
plot.png [ 24.94 Кб | Просмотров: 0 ]
В отличие от Matlab изменение свойства (свойств) оказывает эффект только на последнюю линию (в том числе и на её маркеры). Если нужно модифицировать свойство всех линий, то это можно сделать изменением значений свойств по умолчанию или установкой свойств после вызова plot. По первому варианту см. С.1 или вставлять аналог перед вызовом plot. Для второго варианта решения проблемы возможен вариант вида
X = [0: 0.2: pi];
p = plot(X, sin(X), '-ro;sin {\itx};', X, cos(X), '-ko;cos {\itx};');
set(p, 'markersize', 20);

Вложение:
Комментарий к файлу: Изменение одного из свойств линии при помощи set
plot2.png
plot2.png [ 27.54 Кб | Просмотров: 0 ]
В отличие от свежих версий Matlab Octave не поддерживает новый синтаксис изменения значения свойств, т.е. не получится заменить set(p, 'markersize', 20) на p.Markersize = 20.
[Прим. К п. C.2. При экспорте в png все части буковок отображаются.]

 Профиль  
                  
 
 Re: GNU Octave 4 под Windows
Сообщение17.07.2018, 16:46 
Заслуженный участник


12/07/07
4438
Пакеты

Пакет (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)
код: [ скачать ] [ спрятать ]
Используется синтаксис Text
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)
Используется синтаксис Matlab M
 >> 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 (часть текста исправлена)
код: [ скачать ] [ спрятать ]
Используется синтаксис Text
  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 каждый элемент матрицы должен быть преобразован в символьное
код: [ скачать ] [ спрятать ]
Используется синтаксис Matlab M
>> [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 — константы $\pi$, $\infty$, но нет константы 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.7182818284590452353602874713527


S.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)
Примеры. Пусть $x$ целoе и $x < -1$ или $x > 1$
>> 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.6
limit(f, t, t_0)
Здесь f — символьное выражение, содержащее идентификатор t; третий аргумент — точка, в которой должен быть вычислен предел (число/$\infty$/-$\infty$).
Для вычисления предела справа (слева) в точке 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 Различное поведение в случае, если предел не может быть найден. например, не может быть найден придел $\lim\limits_{x \to +\infty}x^2e^{-ax}$, $a>0$ , если не указать системе знак параметра $a$.

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 Различное поведение в случае, если предел не существует. На примере $\lim\limits_{x \to -0} 2^{1/x} = 0$, $\lim\limits_{x \to +0} 2^{1/x} = +\infty$.

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 вычисляется «неопределённая» сумма: $F_{k+1} - F_k = f_k$
>>symsum(1/k^2, k)
ans = -psi(1, k)

В OctSymPy подставляются значения по умолчанию. В качестве нижнего предела используется 0
>> symsum(1/k^2, k)
ans = (sym) nan


S.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, ezsurf

S.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
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
ezmesh_err2.PNG [ 140.08 Кб | Просмотров: 0 ]
При задании первых трех аргументов в виде функций небольшим недостатком является неправильные подписи осей, но это, конечно, можно преодолеть вызовами xlabel и ylabel.

Прим. В Octave ez-функции не входят в пакет Symbolic. Сравнение этих функций помещено в этот раздел в связи с тем, что в Matlab они входят в SMT.

В заключение, OctSymPy (пакет Symbolic на базе SymPy для Octave), на мой взгляд, пока очень сырой и имеются некоторые довольно огорчительные расхождения c синтаксисом или возможностями Symbolic Math toolbox Matlab. Довольно огорчительные ограничения/расхождения это: 1) меньшие возможности по заданию предположений, 2) менее удобное формирование символьных матриц.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group