0

使用 Maxima,可以使用 at() 语句将未知数替换为值。但这使用列表进行替换,并且solve() 语句不返回列表。

代码:

(%i1) g(x):=x^2+a;
                                         2
(%o1)                           g(x) := x  + a
(%i2) g(x),solve(x=3),a=2;
(%o2)                                11

我设法使用逗号计算结果,但我无法创建一个函数来这样做:

(%i3) f(y) := g(x),solve(x=3),a=y;
(%o3)                          f(y) := g(x)
(%i4) f(2);
                                2
(%o4)                          x  + a

是否有一个逗号的行为就像它直接在行中一样?


编辑:
实际上,可以将 at() 与solve() 一起使用来创建函数f(),因为solve() 只返回一个列表列表。所以代码是:

(%i5) f(y) := at(at(g(x), solve(x=3)[1]), a=y);
(%o5)             f(y) := at(at(g(x), solve(x = 3) ), a = y)
(%i6) f(2);
(%o6)                                 11

注意[1]后面solve(x=3)(%i5)。它选择列表的第一项(解决方案)。

4

2 回答 2

2

我不确定您要完成什么 - 如果您备份几个步骤并在此处描述您要解决的更大问题,那可能是最好的。

关于您想要什么,我最好的猜测是您正在尝试使用“解决”的结果来找到一个值来替换某个表达式。如果是这样,您可以像这样实现它:求解的方程f(eq, u) := map (lambda ([e], subst (e, g(u))), solve (eq, x));在哪里,然后代入. 请注意,“解决”可以返回多个解决方案,这就是为什么我使用“地图”将某些内容应用于每个解决方案。这是一个示例输出:eqxg(u)

(%i7) f(eq) := map (lambda ([e], subst (e, g(x))), solve (eq, x));
(%o7)       f(eq) := map(lambda([e], subst(e, g(x))), solve(eq, x))
(%i8) solve (x^2 + 2*x + 2);
(%o8)                     [x = - %i - 1, x = %i - 1]
(%i9) f (x^2 + 2*x + 2);
(%o9)                      [g(- %i - 1), g(%i - 1)]

当然,您可以以任何合适的方式定义“g”。

您的具体问题的答案(我认为实际上并不是很相关,但无论如何)是使用“块”将要评估的表达式组合在一起。例如f(x) := block (...);

于 2013-11-04T03:19:05.627 回答
1

也许我在回答错误的问题。也许您想要的是ev(foo, bar, baz)--是您在控制台输入提示符下ev编写时实际调用的函数。foo, bar, baz所以函数将被编写f(y) := ev (g(x), solve(x=3), a=y)

但是,请记住,内置了多种不同类型的功能ev,因此很难理解(请参阅 文​​档ev)。相反,考虑使用subst哪个更简单。

于 2013-11-11T17:08:26.543 回答