2016-06-08 83 views
1

下面我已经列出了一些通过Maxima中的for循环创建变量/列表/函数的方法,
但通过for循环如何执行:通过循环创建多个变量/列表/函数(Maxima)

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

示例代码:

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)]; 

编辑:进一步代码:

/* 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]; 

编辑2:解决原始问题(任何代码改进/简化欢迎):

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

关于编辑2,不幸的是我不得不说你已经证明的那种字符串操作是一个非常贫穷的方式去了解它。在某些情况下他们无法避免,但应该将其视为最后手段。使用表达式而不是字符串几乎总是更清晰,更短,更一般。 –

回答

0

我在这里收集了各种通过Maxima中的循环创建多个变量/列表/函数的方法, 作为问题的答案,'[f1(2),f2(2),f3(2)] “明确地回答了原来的问题:

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

这是您的大目标吗?通常使用下标符号例如a[1]而不是a1是优选的。当你定义一个下标函数时,你只定义一次,而不是每个下标的值。例如。

(%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 ] 

如果这不适合你,也许你可以解释你想要达到的目标。

+0

谢谢,我可以看到'f [i](x):= x^i $'比我意识到的更多 – vafylec

+0

'f1(x)'可以优于'f [1](x)' '它更容易输入和更清晰地阅读,尤其是当x被复杂的表达式或含有方括号的文本替换时(并且我可能已经具有'f1,f2,f3'或'f,g,h'等形式的函数从现有的来源) – vafylec

+0

我基本上试图建立一些'千里马101'的一般技术, 某些/我所需要的某些点或其他, 任何专家应该知道,任何初学者应该想知道 (通常当你解决一个问题时,它有助于他人, eval_string和parse_string是非常有用的) – vafylec