我想使用 wxMaxima 重新排列方程,使某些变量仅出现在左侧。
%i: eq: term1 = term2 ;
%i: fun(eq,[v]);
%o: term3 = term4
术语的允许符号如下所示:
- 术语 1 = 全部
- 术语 2 = 全部
- term3 = 只有 [v] 和运算符
- term4 = 除了 [v]
- [v] = 我想在左侧的变量(或列表)
我试图完成一些事情matchdeclare
,defrule
但我什至无法将b
ofa=b+c
移到左侧。我什至不确定 defrule 是否是正确的方法,因为术语 1 和 2 与 3 和 4 无关。有没有办法解决列表?
更新:
我想出了“某事”。这还不是我最初想要的,但至少更接近。它基本上是一个替代品。我可以提供一个左侧,该函数试图解决它。当然,这个确切的左侧可能是不可能的,因此一些变量保留在右侧。但是可以指定一个应该在右侧消除的变量。
expr: a=b+c*d+e $
left: log(a+b) $
notright: b $
solve_form( expr, left, notright);
结果是:
[log(b+a)=log(-e-c*d+2*a)]
现在,如果我改为选择log(a-b)
左侧,则输出为:
[log(a-b)=log(e+c*d)]
这几乎是我想要的。变量a
和b
位于左侧,但不在右侧。但我必须给出一个明确的左侧。我希望有一个函数可以自行找到任意左侧,这样既不在右侧a
也不b
在右侧。
显而易见的解决方案是:[a-b=e+c*d]
功能:
solve_form(expr,lterm,substvar) := block(
[z],
lterm: z = lterm,
solve(lterm,substvar),
ev(expr,%%),
solve(%%,z),
ev(%%,lterm)
)$
不需要notright
输入的替代功能。
solveform(expr,zz_term) := block(
[z,zz_term_vars,slist],
zz_term: zz = zz_term,
zz_term_vars: listofvars(rhs(zz_term)),
slist:[],
for i:1 thru length(zz_term_vars) do block(
solve(zz_term,zz_term_vars[i]),
ev(expr,%%),
slist: append(slist,solve(%%,zz))
),
listify(setify(ev(slist,zz_term)))
)$