0

我想使用 wxMaxima 重新排列方程,使某些变量仅出现在左侧。

%i: eq: term1 = term2 ;
%i: fun(eq,[v]);
%o: term3 = term4

术语的允许符号如下所示:

  • 术语 1 = 全部
  • 术语 2 = 全部
  • term3 = 只有 [v] 和运算符
  • term4 = 除了 [v]
  • [v] = 我想在左侧的变量(或列表)

我试图完成一些事情matchdeclaredefrule但我什至无法将bofa=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)]

这几乎是我想要的。变量ab位于左侧,但不在右侧。但我必须给出一个明确的左侧。我希望有一个函数可以自行找到任意左侧,这样既不在右侧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)))
)$
4

1 回答 1

0

我认为solve, linsolve, algsys,eliminate或多或少有你正在寻找的效果。

于 2018-07-16T16:15:33.917 回答