Octave符号包中的分段函数?

9
与Matlab不同,Octave符号没有分段函数。有没有一种解决方法?我想做这样的事情:
syms x y = piecewise(x0, 1)
相关地,如何获取分段函数的各个部分?我运行了以下内容:
int (exp(-a*x), x, 0, t)
并得到以下正确答案的显示和存储在变量中:
t    (a = 0) -e*a*t 1 - e       其他情况下 --    ----- a        a
但是现在我想访问答案的“其他”部分,以便可以对其进行因式分解。我该怎么做?
(是的,我可以在脑海中对其进行因式分解,但我正在练习更复杂的表达式出现的情况。我也只是真正寻找使用符号表达式的方法-尽管在任何情况下数值可能很好地工作,但我想理解符号方法。)
谢谢!

是的,我必须使用<pre>sym</pre>。对于仅包含数字的分段函数,我没有任何问题。 - forkandwait
1个回答

1

Matlab的piecewise函数似乎是相当新的(在2016b中引入),但它基本上看起来只是一个被吹嘘的三元运算符。不幸的是,我没有2016年的版本来检查它是否对输入进行任何检查,但通常可以通过使用逻辑索引来索引单元格来重新创建octave中的“三元”运算符。例如:

{@() 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接