Как преобразовать символическое выражение в функцию Octave из символического пакета?

Как преобразовать символическое выражение в функцию Octave из символического пакета?

После установки символьного пакета на октаву с pkg install -forge symbolic. Используя символический пакет на октаве, я могу написать это:

octave> pkg load symbolic;
octave> a = sym( "a" );
octave> int ( a^2 + csc(a) )

что приведет к:

ans = (sym)

   3
  a    log(cos(a) - 1)   log(cos(a) + 1)
  -- + --------------- - ---------------
  3           2                 2

Но как сделать этот символьный результат Integral (int(1)) чуть выше, чтобы он стал полезной функцией, как показано ниже?

function x = f( x )

    x = x^3/3 + log( cos(x) - 1 )/2 - log( cos(x) + 1 )/2

end

f(3)

# Which evaluates to: 11.6463 +  1.5708i

Я хочу взять символьный результат из int ( a^2 + csc(a) ) и вызвать результат(3), чтобы вычислить его в 3, т. е. вернуть числовое значение 11,6463 + 1,5708i из интеграла символического выражения a^2 + csc(a). В принципе, как использовать символьное выражение в качестве числового выражения? Это как этот другой вопрос для Matlab.

Использованная литература:

  1. http://octave.sourceforge.net/symbolic/index.html
  2. Как объявить символическую матрицу в Octave?
  3. Символическое выражение Octave
  4. Джулия: как преобразовать символическое выражение в функция?
  5. Что такое символьные вычисления?

person user    schedule 29.11.2016    source источник
comment
Это значение f(3) довольно бессмысленно, так как вы не можете контролировать константу интегрирования. Вы также можете получить в результате наиболее реальное выражение x^3/3 + log( 1 - cos(x) )/2 - log( 1 + cos(x) )/2. Только определенные интегралы, такие как разность f(3)-f(0), имеют результаты, не зависящие от капризов алгоритма интегрирования.   -  person Lutz Lehmann    schedule 30.11.2016
comment
Вы правы, это был просто случайный пример, о котором я подумал. Цель состояла в том, чтобы научиться численно оценивать символьные выражения.   -  person user    schedule 30.11.2016


Ответы (2)


Вы можете использовать pretty.

syms x;
x = x^3/3 + log( cos(x) - 1 )/2 - log( cos(x) + 1 )/2;
pretty(x)

что дает это:

                                     3
log(cos(x) - 1)   log(cos(x) + 1)   x
--------------- - --------------- + --
       2                 2           3

Обновление (поскольку вопрос отредактирован):

Сделайте эту функцию:

function x = f(y)
    syms a;
    f(a) = int ( a^2 + csc(a) );
    x = double(f(y));
end

Теперь, когда вы вызываете его с помощью f(3), он дает:

ans =
  11.6463 + 1.5708i
person Sardar Usama    schedule 29.11.2016

похоже, вы ответили на свой вопрос, связавшись с другой вопрос о Matlab.

В Octave есть реализация matlabFunction, которая является оболочкой для function_handle в символическом наборе инструментов.

>> pkg load symbolic;
>> syms x;
>> y = x^3/3 + log( cos(x) - 1 )/2 - log( cos(x) + 1 )/2
y = (sym)

   3
  x    log(cos(x) - 1)   log(cos(x) + 1)
  -- + --------------- - ---------------
  3           2                 2

>> testfun = matlabFunction(y)
testfun =

@(x) x .^ 3 / 3 + log (cos (x) - 1) / 2 - log (cos (x) + 1) / 2

testfun(3)

>> testfun(3)
ans =  11.6463 +  1.5708i

>> testfun([3:1:5]')
ans =

   11.646 +  1.571i
   22.115 +  1.571i
   41.375 +  1.571i

>> testfun2 = matlabFunction(int ( x^2 + csc(x) ))
testfun2 =

@(x) x .^ 3 / 3 + log (cos (x) - 1) / 2 - log (cos (x) + 1) / 2

>> testfun2(3)
ans =  11.6463 +  1.5708i
>> testfun2([3:1:5]')
ans =

   11.646 +  1.571i
   22.115 +  1.571i
   41.375 +  1.571i

Я уверен, что есть и другие способы реализовать это, но это может позволить вам избежать жесткого кодирования вашего уравнения в функции.

person Nick J    schedule 01.12.2016