Octave符号包中的分段函数?

时间:2017-07-01 04:09:30

标签: octave

与Matlab不同,Octave Symbolic没有分段功能。有工作吗?我想做这样的事情:

syms x
y = piecewise(x0, 1)

相关地,如何获得分段函数?我运行了以下内容:

>> int (exp(-a*x), x, 0, t)

显示以下正确答案并存储在变量中:

                                                                                  
      t      for a = 0

       -a*t
  1   e
  - - -----  otherwise
  a     a

但是现在我想访问答案的“其他”部分,以便我可以考虑它。我怎么做?

(是的,我可以把它考虑在脑子里,但我正在练习更复杂的表达方式。我也只是在寻找一种使用符号表达式的方法 - 即使在任何一种情况下,数字也可以正常工作,我想了解符号方法。)

谢谢!

1 个答案:

答案 0 :(得分:0)

Matlab的piecewise函数似乎相当新(在2016b中引入),但它基本上看起来像一个美化的三元运算符。不幸的是,我没有2016年检查它是否对输入执行任何检查,但一般情况下,您可以通过使用逻辑索引索引到单元格来重新创建八度音程中的“三元”运算符。 E.g。

{@() return_A(), @() return_B(), @() return_default()}([test1, test2, true]){1}()

<强>解释

  • 步骤1:将所有感兴趣的值放在单元格数组中。如果要在解析时阻止它们被评估(例如,如果您希望三元运算符的输出产生错误),请将它们包装在函数句柄中。
  • 步骤2:使用逻辑索引对此单元阵列进行索引,其中每个索引都执行逻辑测试
  • 步骤3:如果您需要“默认”案例,请对最后一个元素使用“true”测试。
  • 步骤4:从上面得到的单元(子)数组中,选择第一个元素并“运行”生成的函数句柄。选择第一个元素的效果是,如果多个测试成功,则只选择第一个结果;鉴于'默认'测试将始终成功,这也确保不会选择此项,除非它是第一个也是唯一一个成功的测试(默认情况下这样做)。

以下是在函数中实现的上述步骤(为简洁起见,此处省略了适当的健全性检查),遵循与matlab的piecewise相同的语法:

function Out = piecewise (varargin)
  Conditions = varargin(1:2:end);    % Select all 'odd' inputs
  Values     = varargin(2:2:end);    % Select all 'even' inputs
  N          = length (Conditions);
  if length (Values) ~= N            % 'default' case has been provided
    Values{end+1} = Conditions{end}; % move default return-value to 'Values'
    Conditions{end} = true;          % replace final (ie. default) test with true
  end

  % Wrap return-values into function-handles
  ValFuncs = cell (1, N);
  for n = 1 : N; ValFuncs{n} = @() Values{n}; end

  % Grab funhandle for first successful test and call it to return its value
  Out = ValFuncs([Conditions{:}]){1}();
end

使用示例:

>> syms x t;
>> F = @(a) piecewise(a == 0, t, (1/a)*exp(-a*t)/a);

>> F(0)
ans = (sym) t

>> F(3)
ans = (sym)

   -3⋅t
  ℯ
  ─────
    9