maxima принимает как a^b
, так и a**b
в качестве входных данных для возведения в степень и всегда будет выводить показатель степени с символом вставки ^
.
Можно ли также получить вывод как функцию, например pow(a,b)
?
maxima принимает как a^b
, так и a**b
в качестве входных данных для возведения в степень и всегда будет выводить показатель степени с символом вставки ^
.
Можно ли также получить вывод как функцию, например pow(a,b)
?
Хорошо, как вы сказали, вы хотите вывести Math.pow(a,b)
для Javascript. Подход, который я предлагаю здесь, состоит в том, чтобы заменить a^b
выражений в Maxima на Math.pow(a,b)
выражений и вывести это.
(%i1) e : sqrt(a) + b^(3/2) + 1/c + exp(d^f);
f
d 1 3/2
(%o1) %e + - + b + sqrt(a)
c
(%i2) subst ("^"=lambda([a, b], Math.pow(a, b)), e);
3 1
(%o2) Math . pow(c, - 1) + Math . pow(b, -) + Math . pow(a, -)
2 2
+ Math . pow(%e, Math . pow(d, f))
Итак, это большая часть работы. Некоторые выражения представлены как выражения "^"
, даже если они кажутся чем-то другим, например, sqrt(a)
— это a^(1/2)
, а 1/c
— это c^(-1)
. Если вам нужно, чтобы они были сохранены как sqrt(a)
и 1/c
, нам придется поработать над этим.
Я предполагаю, что лучше иметь значения с плавающей запятой вместо целочисленных отношений. Кроме того, мы заменим %e
его числовым значением. Если вы хотите, чтобы %e^x
отображалось как Math.exp(x)
, мы можем над этим поработать. Или, если вы хотите Math.pow(Math.E, x)
, это относительно просто; просто оцените subst(%e = Math.E, <your expression>)
.
(%i3) float (%);
(%o3) Math . pow(c, - 1.0) + Math . pow(b, 1.5) + Math . pow(a, 0.5)
+ Math . pow(2.718281828459045, Math . pow(d, f))
Maxima считает, что x . y
означает некоммутативное умножение, но здесь это не играет роли, так что все в порядке. По умолчанию он отображается с пробелом по обе стороны от точки, но если вы хотите немного поковыряться с Lisp, мы можем удалить пробел. (Я думаю, это не имеет значения для Javascript, верно? Math . pow
эквивалентно Math.pow
, не так ли?)
(%i4) :lisp (setf (get 'mnctimes 'dissym) '(#\.))
(.)
(%i4) %o3;
(%o4) Math.pow(c, - 1.0) + Math.pow(b, 1.5) + Math.pow(a, 0.5)
+ Math.pow(2.718281828459045, Math.pow(d, f))
Хорошо, теперь мы можем вывести выражение.
(%i5) grind (%o3);
Math.pow(c,-1.0)+Math.pow(b,1.5)+Math.pow(a,0.5)
+Math.pow(2.718281828459045,Math.pow(d,f))$
(%o5) done
Это ожидаемый результат?
ОП спросил о преобразовании %e^x
в exp(x)
. Это легко сделать, но чтобы это закрепилось, мы должны отключить упрощение, то есть применение тождеств, которые Максима использует для поиска общего представления выражения. По умолчанию Maxima упрощает exp(x)
до %e^x
. Мы можем заменить %e^x
на exp(x)
, но нам нужно отключить упрощение, чтобы предотвратить его повторение.
(%i1) simp:false $
(%i2) matchdeclare (xx, all) $
(%i3) defrule (to_exp, %e^xx, Math.exp(xx));
xx
(%o3) to_exp : %e -> Math . exp(xx)
(%i4) apply1 (1 + %e^(x + %e^y), to_exp);
(%o4) 1 + Math . exp(x + Math . exp(y))
Вероятно, вы хотите отключить упрощение (т.е. simp:false
) только тогда, когда будете готовы вывести выражение. Но я могу представить ситуации, в которых вы бы отключили его, например. если важно вывести выражение точно так, как оно было введено, например. x + x
вместо 2*x
.
Здесь я использовал другой механизм замены, а именно defrule
, который определяет правило сопоставления с образцом. Сопоставление с образцом очень полезно, и я рекомендую вам взглянуть на defrule
и matchdeclare
в документации Maxima.
^
-- вы имеете в виду, что вы смотрите на результатgrind
,string
илиdisplay2d:false
? Или вы хотите видетьpow(a, b)
в любом пользовательском интерфейсе, который вы используете? Если да, то какой пользовательский интерфейс вы используете? Спасибо за любую информацию. - person Robert Dodier   schedule 10.02.2017