Maxima:有什么方法可以使在 main 函数中定义的函数成为局部函数,类似于局部变量?

标签 maxima wxmaxima

我想知道是否有任何方法可以使在 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/

相关文章:

maxima - wxMaxima:如何定义函数的反函数?

debugging - Debug模式: MACDOC;TRDEBG USAGE

maxima - 获取最大操作系统

maxima - 多项式最大值的系数

function - Maxima:强制函数仅使用局部变量运行?/如何避免局部操作影响全局变量?

polynomials - 用分子中多项式的和来简化分数

function - Maxima:如何区分矩阵的行和行向量?

python - 如何使用sympy找到生成函数的第n项?

maxima - 方程未完全求解

tex - (wx)最大: texput for powers of expressions