wxMaxima - решить/переставить для термина, который содержит определенные переменные

Я хотел бы изменить уравнение таким образом, чтобы определенные переменные отображались только слева, используя wxMaxima.

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

Где разрешенные символы для терминов будут примерно такими:

  • срок1 = все
  • термин2 = все
  • term3 = только [v] и операторы
  • term4 = все, кроме [v]
  • [v] = переменная (или список), которую я хочу разместить слева

Я пытался что-то сделать с matchdeclare и defrule, но я даже не смог переместить b из a=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)))
)$

person a5tro    schedule 14.07.2018    source источник


Ответы (1)


Я думаю, что solve, linsolve, algsys и eliminate имеют более или менее эффект, который вы ищете.

person Robert Dodier    schedule 16.07.2018
comment
Я не уверен, как именно они будут полезны для лучшего решения моей проблемы. Я обновил вопрос, чтобы уточнить его немного больше. - person a5tro; 20.07.2018