【问题标题】:Can I define a maxima function f(x) which assigns to the argument x我可以定义一个分配给参数 x 的最大值函数 f(x)
【发布时间】:2019-04-25 22:39:15
【问题描述】:

很抱歉这个基本问题,但很难找到太多关于 Maxima 细节的讨论。

我正在尝试学习一些 Maxima 并想使用类似的东西

x:2
x+=2

据我所知,Maxima 中不存在。然后我发现我可以将自己的运算符定义为中缀运算符,所以我尝试这样做

infix("+=");
"+=" (a,b):= a:(a+b);

但是这不起作用,好像我先设置x:1 然后尝试调用x+=2,函数返回3,但如果我检查x 的值,我发现它没有改变。

有没有办法实现我在 Maxima 中尝试做的事情?谁能解释为什么我给出的定义失败了?

谢谢!

【问题讨论】:

    标签: function maxima


    【解决方案1】:

    您的实现的问题是评估太多和太少 - += 函数看不到符号 x 所以它不知道将结果分配给哪个变量,并且分配的左侧没有被评估,所以+= 认为它分配给a,而不是x

    这是获得适量评估的一种方法。 ::= 定义了一个宏,它只是一个引用其参数的函数,并再次对其返回值求值。 buildq 是一个替换函数,它引用您要替换的表达式。所以这里::=buildq的组合就是构造x: x + 2表达式,然后求值。

    (%i1) infix ("+=") $
    (%i2) "+="(a, b) ::= buildq ([a, b], a: a + b) $
    (%i3) x: 100 $
    (%i4) macroexpand (x += 1);
    (%o4)                       x : x + 1
    (%i5) x += 1;
    (%o5)                          101
    (%i6) x;
    (%o6)                          101
    (%i7) x += 1;
    (%o7)                          102
    (%i8) x;
    (%o8)                          102
    

    因此,如果您想这样做,当然可以这样做。但是我可以建议您可能不需要它吗?修改一个变量使得在心理上更难跟踪正在发生的事情。诸如一次性赋值之类的编程策略可以使程序员更容易理解程序。这是一种称为函数式编程的通用方法的一部分;也许你可以看看那个。 Maxima 具有多种功能,可以使用函数式编程,尽管您不需要使用它们。

    【讨论】:

    • 谢谢你,这是一个非常有用的解释。
    • 我同意我不需要该函数,但是一旦我意识到它不存在,尝试编写它似乎是理解如何在 Maxima 中编写函数的好方法。我实际上希望它只是循环内的简写,例如block([count:0], for i:0 thru 4 do count+=1, count);。在您看来,有没有更好的写法?
    • 在循环中修改变量没有任何问题,但它使(任何阅读代码的人,包括原作者)更难理解发生了什么,并且它也打开了如果循环没有完全执行,问题的大门。如果循环没有通过所有迭代怎么办?然后会出现某种不完整的状态,这也是必须要理解的。
    • 一种概念上更简单的方法是将操作声明为一次性执行的操作。例如。 sum(1, k, 1, 4) 产生与 for 循环相同的结果。从阅读代码的人的角度来看,sum 是一个单一的操作。其他常见示例包括将两个列表的乘积之和表示为a . b(使用listarith = true,参见)而不是block([foo: 0], for i thru length(a) do foo: foo + a[i]*b[i], foo),并通过makelistmapsublist 创建一个列表,而不是增量式通过for.
    • 有时没有任何明显的方法可以以功能性的方式做事。没关系,重要的是尽量把事情说清楚。
    猜你喜欢
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 2021-04-03
    • 2019-01-27
    • 2016-04-16
    • 2019-04-16
    相关资源
    最近更新 更多