2016-06-08 4 views
1

ci-dessous J'ai énuméré quelques façons de créer des variables/listes/fonctions via une boucle pour Maxima,
mais comment, par une boucle for, faire:créer plusieurs variables/listes/fonctions via une boucle (Maxima)

f1(x) := x^1$ 
f2(x) := x^2$ 
f3(x) := x^3$ 

exemple code:

for i : 1 thru 10 do 
(x : concat ('a, i), x :: i)$ 
[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10]; 

for i : 1 thru 3 do 
(x : concat ('L, i), x :: [(3*i)-2,(3*i)-1,3*i])$ 
[L1, L2, L3]; 

/* good, but not quite what I want to do */ 
for i : 1 thru 3 do 
f[i](x) := x^i$ 
[f[1](2), f[2](2), f[3](2)]; 

/* is there a way, via a for loop, to create */ 
f1(x) := x^1$ 
f2(x) := x^2$ 
f3(x) := x^3$ 
[f1(2), f2(2), f3(2)]; 

EDIT: Code en outre:

/* is there a way, via a for loop, to create */ 
f(x) := x^1$ 
g(x) := x^2$ 
h(x) := x^3$ 
[f(2), g(2), h(2)]; 

for tmp1 : 1 thru 10 do 
(tmp2 : parse_string(ascii(96+tmp1)), tmp2 :: tmp1)$ 
[a, b, c, d, e, f, g, h, i, j]; 

for tmp1 : 1 thru 10 do 
(tmp2 : concat(parse_string(ascii(96+tmp1)), tmp1), tmp2 :: tmp1)$ 
[a1, b2, c3, d4, e5, f6, g7, h8, i9, j10]; 

EDIT 2: problèmes d'origine résolus (améliorations de code/simplifications bienvenue):

for i : 1 thru 3 do 
eval_string(concat("f", i, "(x) := x^", i))$ 
[f1(2), f2(2), f3(2)]; 

for i : 1 thru 3 do 
eval_string(concat(ascii(96+5+i), "(x) := x^", i))$ 
[f(2), g(2), h(2)]; 

sum:0$ 
for i : 1 thru 3 do 
sum:sum + eval_string(concat("f", i, "(2)"))$ 
sum; 

sum:0$ 
for i : 1 thru 3 do 
sum:sum + eval_string(concat(ascii(96+5+i), "(2)"))$ 
sum; 
+0

A propos de l'édition 2, malheureusement, je dois dire que les opérations de chaînes du genre que vous avez montré sont un très mauvais moyen de s'y prendre. Il peut y avoir des circonstances dans lesquelles ils ne peuvent être évités, mais cela doit être considéré comme une méthode de dernier recours. Travailler avec des expressions au lieu de chaînes est presque toujours plus clair, plus court et plus général. –

Répondre

0

J'ai rassemblé ici, différentes façons de créer plusieurs variables/listes/fonctions via une boucle dans Maxima, comme réponse à la question, '[f1 (2), f2 (2), f3 (2)] 'répond explicitement à la question initiale:

for i : 1 thru 10 do 
(x : concat ('a, i), x :: i)$ 
[a1, a2, a3, a4, a5, a6, a7, a8, a9, a10]; 

for i : 1 thru 3 do 
(x : concat ('L, i), x :: [(3*i)-2,(3*i)-1,3*i])$ 
[L1, L2, L3]; 

for tmp1 : 1 thru 10 do 
(tmp2 : parse_string(ascii(96+tmp1)), tmp2 :: tmp1)$ 
[a, b, c, d, e, f, g, h, i, j]; 

for tmp1 : 1 thru 10 do 
(tmp2 : concat(parse_string(ascii(96+tmp1)), tmp1), tmp2 :: tmp1)$ 
[a1, b2, c3, d4, e5, f6, g7, h8, i9, j10]; 

for i : 1 thru 3 do 
eval_string(concat("f", i, "(x) := x^", i))$ 
[f1(2), f2(2), f3(2)]; 

for i : 1 thru 3 do 
eval_string(concat(ascii(96+5+i), "(x) := x^", i))$ 
[f(2), g(2), h(2)]; 

f[i](x) := x^i$ 
[f[1], f[2], f[3]]; 
[f[1](2), f[2](2), f[3](2)]; 
[f[1](u), f[2](v), f[3](w)]; 
1

Quel est votre objectif le plus large? En général, en utilisant des symboles indicatifs, par ex. a[1] au lieu de a1 doit être préféré. Lorsque vous définissez une fonction indicée, vous ne la définissez qu'une seule fois, pas pour chaque valeur de l'indice. Par exemple.

(%i1) f[i](x) := x^i $ 
(%i2) [f[1], f[2], f[3]]; 
              2    3 
(%o2)   [lambda([x], x), lambda([x], x), lambda([x], x)] 
(%i3) [f[1](u), f[2](v), f[3](w)]; 
             2 3 
(%o3)        [u, v , w ] 

Si cela ne fonctionne pas pour vous, vous pouvez peut-être expliquer ce que vous essayez d'obtenir.

+0

merci, je peux voir que 'f [i] (x): = x^i $' fait plus que j'ai réalisé – vafylec

+0

'f1 (x)' peut être préférable à 'f [1] (x)' parce que il est plus facile à taper, et plus clair à lire, surtout quand x est remplacé par des expressions compliquées ou du texte contenant des crochets (et j'ai peut-être déjà des fonctions sous la forme 'f1, f2, f3' ou 'f, g, h' etc à partir d'une source existante) – vafylec

+0

J'essayais fondamentalement d'établir quelques techniques générales «Maxima 101», dont j'avais besoin à un moment ou à un autre, et tout débutant devrait vouloir savoir (et généralement lorsque vous résolvez un problème que cela aide avec d'autres, eval_string et parse_string sont très utiles) – vafylec