2017-07-01 32 views
8

W odróżnieniu od Matlab, Octave Symbolic nie ma funkcji odcinkowych. Czy jest w pobliżu praca? Chciałbym zrobić coś takiego:Kawałki funkcji w pakiecie symbolicznym Octave?

 
syms x 
y = piecewise(x0, 1) 

Podobnie jak uzyskać fragmenty funkcji kawałek? Pobiegłem co następuje:

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

I got następujące poprawna odpowiedź wyświetlane i przechowywane w zmiennej:

                     
     t  for a = 0 

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

Ale teraz chciałbym przejść do „otherwise” część odpowiedzi więc mogę czynnik to. Jak mogę to zrobić?

(Tak, mogę to uwzględnić w mojej głowie, ale ćwiczę, kiedy pojawiają się bardziej skomplikowane wyrażenia, ale tak naprawdę szukam tylko podejścia wykorzystującego wyrażenia symboliczne - mimo że w każdym pojedynczym przypadku mogą działać dane liczbowe dobrze, chcę zrozumieć symboliczne podejście.)

Dzięki!

+0

Tak , Muszę użyć

sym
. Nie mam problemu z pisaniem funkcji fragmentowych, które są tylko numeryczne. – forkandwait

Odpowiedz

0

Funkcja Matlaba piecewise wydaje się całkiem nowa (wprowadzona w 2016b), ale w zasadzie wygląda jak utytułowany operator trójskładnikowy. Niestety nie mam 2016 roku, aby sprawdzić, czy wykonuje on jakiekolwiek kontrole wejść, czy nie, ale ogólnie można odtworzyć "trójkowego" operatora w oktawie poprzez indeksowanie do komórki za pomocą indeksowania logicznego. Na przykład.

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

Objaśnienie:

  • Krok 1: umieścić wszystkie wartości odsetek w tablicy komórek. Zawiń je w uchwyty funkcji, jeśli chcesz zapobiec ich ocenie w czasie analizowania (np. Jeśli chcesz, aby wyjście operatora trójskładnikowego powodowało błąd)
  • Krok 2: Indeksuj tablicę komórek za pomocą indeksowania logicznego, gdzie przy każdym indeksie przeprowadzasz test logiczny Krok 3: Jeśli potrzebujesz "domyślnego" przypadku, użyj "prawdziwego" testu dla ostatniego elementu.
  • Krok 4: Z tablicy komórek (pod), która wynika z powyższego, wybierz pierwszy element i "uruchom" wynikowy uchwyt funkcji. Wybór pierwszego elementu powoduje, że jeśli więcej niż jeden test się powiedzie, wybierzesz tylko pierwszy wynik; biorąc pod uwagę, że "domyślny" test zawsze się powiedzie, to również upewnia się, że nie zostanie wybrany, chyba że jest to pierwszy i jedyny test, który się powiedzie (co robi to domyślnie).

Oto powyższe kroki realizowane w funkcji (kontrole właściwe Sanity pominiętych tutaj dla uproszczenia) po tej samej składni co piecewise Matlaba:

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 

Przykład zastosowania:

>> 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