3

如何将符号表达式从符号包转换为 Octave 函数?

在 octave 上安装符号包后pkg install -forge symbolic。使用 octave 上的符号包我可以这样写:

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) ),并调用 result(3) 以在 3 处计算它,即从符号表达式积分中返回数值 11.6463 + 1.5708i a^2 + csc(a)。基本上,如何将符号表达式用作数值可评估的表达式?这是 Matlab 的另一个问题

参考:

  1. http://octave.sourceforge.net/symbolic/index.html
  2. 如何在 Octave 中声明符号矩阵?
  3. 八度符号表达
  4. Julia:如何将符号表达式转换为函数?
  5. 什么是符号计算?
4

2 回答 2

4

您可以使用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
于 2016-11-29T21:41:37.167 回答
2

似乎您通过链接到有关 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

我敢肯定还有其他方法可以实现这一点,但它可以让你避免在函数中硬编码你的方程。

于 2016-12-01T20:07:46.757 回答