2016-11-16 2 views
0

Je suis en train de remplacer L avec :Substitut variable?

f(x) := c * (x + L); 
c: L; 
f(x), L: Lα; 

Je me attendais à la sortie:

Lα * (x + Lα) 

au lieu j'ai eu

L * (x + Lα) 

Peut-être que je devrais definef(x) à la place?

kill(all); 

define(
    f(x), 
    c * (x + L) 
); 

c: L; 
f(x), L: Lα; 

Nope - même résultat.

Est-ce que je remplace L par dans le mauvais sens?

Modifier:

il est hors Transforme le comportement attendu, comme des maxima ev avluates expression qu'une seule fois. Un can impose "infinite evaluation" via le drapeau infeval:

f(x), L: La, infeval; 
=> La*(x + La) 

Une autre solution consiste à utiliser subst à la place:

subst(
    Lα, L, f(x) 
); 

(source)

Répondre

1

Vous devez ajouter un eval supplémentaire étape pour faire ce travail:

f(x) := c * (x + L); 
c: L; 
f(x), L: Lα, eval; 

Sortie:

Lα (x + Lα) 
+0

Génial, cela fonctionne. Pouvez-vous commenter pourquoi Maxima fonctionne de cette façon? Est-ce lié à l'ordre dans lequel l'expression est évaluée? – Adobe

+0

@Adobe: AFAIK une seule évaluation est faite par défaut ([bien qu'il y ait des exceptions] (http://maxima.sourceforge.net/docs/manual/maxima_8.html#evflag)), ce qui signifie 'c = L', pour aller à 'c = L = La', les maxima nécessitent une seconde évaluation. – Thor

0

Utilisez subst au lieu de ev. Mais n'oubliez pas que la fonction continue d'être c * (x + L). Le symbole c a été lié à L et si vous liez ensuite le symbole L à La, c continuera à être lié à L et non à La. Les variables Maxima fonctionnent comme dans Lisp, ce qui peut être différent de ce que vous avez l'habitude de autres langues.