wxMaxima如何对符号变量列表构成的表达式进行赋值求值?
你之前的写法ev(bar, foo:vals)不生效的原因是,bar表达式中不存在foo这个变量,仅包含f[1]、f[2]、f[3]三个下标符号变量,给foo赋值并不会触发这三个变量的替换。
下面是更简洁的实现方法:
方法1:构造替换规则列表传给ev
直接把变量列表和值列表两两配对成变量=值的规则列表,传给ev即可:
ev(bar, map("=", foo, vals));
运行后直接返回计算结果6,不需要编写循环赋值的lambda表达式,逻辑更直观。
方法2:用subst直接做表达式替换
不需要调用ev,直接用subst传入规则列表完成替换求值:
subst(map("=", foo, vals), bar);
和方法1效果一致,同样直接得到计算结果。
方法3:直接构造独立符号变量(无下标)
如果你不需要用到数组下标的特性,也可以生成不带下标的独立符号变量,后续替换逻辑完全一致:
/* 生成不带下标的符号列表 */ foo: makelist(concat('f, i), i, 3); bar: lreduce("*", foo); vals: [1,2,3]; /* 替换求值 */ subst(map("=", foo, vals), bar);
内容的提问来源于stack exchange,提问作者Rax Adaam
相关产品推荐
相关产品推荐

