пусть максимумы отображают возведение в степень как функцию вместо каретки

maxima принимает как a^b, так и a**b в качестве входных данных для возведения в степень и всегда будет выводить показатель степени с символом вставки ^.

Можно ли также получить вывод как функцию, например pow(a,b)?


person mmzc    schedule 09.02.2017    source источник
comment
Какова ваша большая цель здесь? Вы случайно не пытаетесь сгенерировать код для другой системы (Python, C, что-то еще)? Вы говорите, что показатели степени выводятся с помощью ^ -- вы имеете в виду, что вы смотрите на результат grind, string или display2d:false? Или вы хотите видеть pow(a, b) в любом пользовательском интерфейсе, который вы используете? Если да, то какой пользовательский интерфейс вы используете? Спасибо за любую информацию.   -  person Robert Dodier    schedule 10.02.2017
comment
Действительно, мы пытаемся сгенерировать синтаксис для другой системы, в данном случае javascript (где это Math.pow(a,b) ). В настоящее время мы используем функцию измельчения для вывода. Нам не нужно, чтобы pow(a,b) работал в максимуме, он нужен только для вывода. спасибо Роберт   -  person mmzc    schedule 10.02.2017


Ответы (2)


Хорошо, как вы сказали, вы хотите вывести 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

Это ожидаемый результат?

person Robert Dodier    schedule 11.02.2017
comment
Спасибо, Роберт, это потрясающе. Пока мне нужна была только первая часть, но и остальные тоже очень интересны! - person mmzc; 13.02.2017
comment
Привет Роберт. Следуя этому, теперь нам нужен способ изменить %e^(что-нибудь) на exp(что-нибудь). Я видел, что максимумы могут пойти другим путем от exp() к %e^, но возможно ли это? Спасибо - person mmzc; 28.02.2017
comment
Да, я добавлю еще один ответ для этого. - person Robert Dodier; 28.02.2017

ОП спросил о преобразовании %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.

person Robert Dodier    schedule 28.02.2017