我想知道是否有任何方法可以使在 main 函数中定义的函数成为局部函数,类似于局部变量。例如,在这个计算标量函数梯度的函数中,
grad(var,f) := block([aux],
aux : [gradient, DfDx[i]],
gradient : [],
DfDx[i] := diff(f(x_1,x_2,x_3),var[i],1),
for i in [1,2,3] do (
gradient : append(gradient, [DfDx[i]])
),
return(gradient)
)$
在主函数 grad(var,f)
中定义的变量 gradient
在主函数之外没有作用,因为它在 中辅助
列表。但是,我观察到 DfDx
函数尽管在 aux
列表中,但确实在 main 函数之外产生了影响。
有什么方法可以使主函数中定义的子函数仅是局部的,类似于局部变量的方法吗? (我知道一旦使用它们就可以kill
,但也许有更优雅的方法)
最佳答案
为了解决您需要在这里解决的问题,另一种计算梯度的方法是说
grad(var, e) := makelist(diff(e, var1), var1, var);
然后你可以说例如
grad([x, y, z], sin(x)*y/z);
得到
cos(x) y sin(x) sin(x) y
[--------, ------, - --------]
z z 2
z
(没有内置的梯度函数;这是一个疏忽。)
关于局部函数,请记住所有函数定义都是全局的。然而,您可以通过 local
近似局部函数定义,它保存和恢复符号的所有属性。由于函数定义是一个属性,local
具有暂时清除现有函数定义并稍后恢复它的效果。在这两者之间,您可以创建一个临时函数定义。例如
foo(x) := 2*x;
bar(y) := block(local(foo), foo(x) := x - 1, foo(y));
bar(100); /* output is 99 */
foo(100); /* output is 200 */
但是,我不认为您需要使用 local
- 只需 makelist
加上 diff
就足以计算梯度。
关于 Maxima 的范围规则、命名和未命名函数等还有更多要说的。明天我会尽量回到这个问题上。
关于Maxima:有什么方法可以使在 main 函数中定义的函数成为局部函数,类似于局部变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68975090/