【问题标题】:Piecewise functions in the Octave symbolic package?Octave 符号包中的分段函数?
【发布时间】:2017-12-05 01:12:48
【问题描述】:

与 Matlab 不同,Octave Symbolic 没有分段函数。有解决办法吗?我想做这样的事情:

符号 x y = 分段(x0, 1)

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

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

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

t 对于 a = 0 -在 1e - - - - - 否则 一个

但现在我想访问答案的“否则”部分,以便将其考虑在内。我怎么做?

(是的,我可以在脑海中考虑它,但我正在练习当更复杂的表达式出现时。我也只是在寻找一种使用符号表达式的方法——即使在任何单一情况下数字都可以正常工作,我想了解符号的方法。)

谢谢!

【问题讨论】:

  • 是的,我必须使用
    sym
    。编写纯数字的分段函数没有任何问题。

标签: octave


【解决方案1】:

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

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

说明:

  • 第 1 步:将所有感兴趣的值放入一个元胞数组中。如果您想防止在解析时对它们进行评估(例如,如果您希望三元运算符的输出产生错误),请将它们包装在函数句柄中
  • 第 2 步:使用逻辑索引对该元胞数组进行索引,在每个索引处执行逻辑测试
  • 第 3 步:如果您需要“默认”情况,请对最后一个元素使用“真”测试。
  • 第 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多