Я хотел бы изменить уравнение таким образом, чтобы определенные переменные отображались только слева, используя 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)))
)$