2017-07-01 10 views
8

Matlabとは異なり、Octave Symbolicには区分的な機能はありません。回避策はありますか?私はこのようなことをしたいと思っています:Octaveシンボリックパッケージの区分機能

 
syms x 
y = piecewise(x0, 1) 

関連して、piecewise関数のピースはどうやって得られますか?

                     
     t  for a = 0 

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

しかし、今、私は答えの「それ以外」の部分にアクセスしたいと思いますので、私は次のことができます。

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

そして、次の正しい答えを得たが表示され、変数に保存されている:私は、次のように走りましたそれを因数分解する。それ、どうやったら出来るの?

(はい、私は頭の中でそれを考慮に入れることができますが、より複雑な表現が出現すると練習しています。また、記号式を使ってアプローチを探しています。良い、私は象徴的なアプローチを理解したい)。

ありがとう!

+0

はい私は

sym
を使用しなければなりません。私は数字だけの区分的な関数を書いても問題はありません。 – forkandwait

答えて

0

Matlabのpiecewise関数はかなり新しい(2016bに導入されました)ようですが、基本的には栄光の三項演算子のように見えます。残念ながら、私は2016で入力をチェックするかどうかをチェックする必要はありませんが、論理インデックスを使用してセルにインデックスを付けることによって、オクターブ単位で '3進'演算子を再作成できます。例えば。

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