2017-07-01 1 views
8

Contrairement à Matlab, Octave Symbolic n'a pas de fonction par morceaux. Y at-il un travail autour? Je voudrais faire quelque chose comme ceci:Fonctions par morceaux dans le package symbolique Octave?

 
syms x 
y = piecewise(x0, 1) 

De même, comment obtient-on des pièces d'une fonction par morceaux? Je courus comme suit:

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

et a obtenu la bonne réponse suivante affichée et stockée dans une variable:

                     
     t  for a = 0 

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

Mais maintenant, je voudrais accéder à la partie de la réponse « autrement » si je peux factoriser. Comment je fais ça?

(Oui, je peux le prendre en compte dans ma tête, mais je m'entraîne pour des expressions plus compliquées, je ne cherche vraiment qu'une approche utilisant des expressions symboliques - même si dans un cas les nombres peuvent fonctionner bien, je veux comprendre l'approche symbolique.)

Merci!

+0

Oui , Je dois utiliser

sym
. Je n'ai aucun problème à écrire des fonctions par morceaux qui sont numériques seulement. – forkandwait

Répondre

0

La fonction piecewise de Matlab semble être assez récente (introduite en 2016b), mais elle ressemble fondamentalement à un opérateur ternaire glorifié. Malheureusement, je n'ai pas 2016 pour vérifier si elle effectue des vérifications sur les entrées ou non, mais en général, vous pouvez recréer un opérateur «ternaire» en octave en l'indexant dans une cellule en utilisant l'indexation logique. Par exemple.

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

Explication:

  • Etape 1: Vous mettez toutes les valeurs d'intérêt dans un réseau de cellules. Entourez-les dans les poignées de fonction si vous voulez éviter qu'elles soient évaluées au moment de l'analyse (par exemple si vous voulez que la sortie de l'opérateur ternaire produise une erreur)
  • Etape 2: Indexez cette matrice de cellules en utilisant une indexation logique, où à chaque index vous effectuez un test logique
  • Étape 3: Si vous avez besoin d'un cas "par défaut", utilisez un test "vrai" pour le dernier élément.
  • Étape 4: À partir du (sous-) tableau de cellules résultant de ci-dessus, sélectionnez le premier élément et «exécutez» la poignée de fonction résultante. La sélection du premier élément a pour effet que si plus d'un test réussit, vous ne choisissez que le premier résultat; Étant donné que le test par défaut réussira toujours, cela garantit également que ce test n'est pas sélectionné sauf s'il s'agit du premier et seul test qui réussit (ce qu'il fait par défaut).

Voici les étapes ci-dessus mis en oeuvre dans une fonction (contrôle de santé d'esprit approprié non décrites ici), en suivant la même syntaxe que piecewise Matlab:

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 

Exemple utilisation:

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