2016-06-08 81 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