【问题标题】:creating multiple variables/lists/functions via a loop (Maxima)通过循环创建多个变量/列表/函数(Maxima)
【发布时间】:2016-06-08 01:24:10
【问题描述】:

下面我列出了一些通过 Maxima 中的 for 循环创建变量/列表/函数的方法,
但是如何通过 for 循环来做:

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;

【问题讨论】:

  • 关于编辑 2,不幸的是,我不得不说您所展示的那种字符串操作是一种非常糟糕的方法。可能存在无法避免的情况,但应将其视为最后手段。使用表达式而不是字符串几乎总是更清晰、更短、更通用。

标签: maxima


【解决方案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 ]

如果这对你不起作用,也许你可以解释一下你想要达到的目标。

【讨论】:

  • 谢谢,我可以看到 'f[i](x) := x^i $' 比我想象的要多
  • 'f1(x)' 比 'f[1](x)' 更可取,因为它更容易输入,也更清晰易读,尤其是当 x 被替换为复杂的表达式或包含正方形的文本时方括号(我可能已经拥有来自现有来源的 'f1,f2,f3' 或 'f,g,h' 等形式的函数)
  • 我基本上是在尝试建立一些“Maxima 101”通用技术,其中一些/全部是我在某些时候需要的,任何专家都应该知道,任何初学者都应该想知道(通常当你解决一个问题时,它会帮助其他问题,eval_string 和 parse_string 非常有用)
  • 如果你只有几个函数 f1, f2, f3 那么对我来说一次定义一个是可以的避免构造concat(f, i)。至于通用技术,通常最好避免字符串操作(concateval_stringparse_string)。可能存在一些必须使用它们的特定问题,但总的来说,最好避免它们。
【解决方案2】:

我在这里收集了通过 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)];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多