2017-02-09 22 views
0

maxima принимает как a^b, так и a**b как вход для экспоненциальности, и всегда будет выводить экспонента с помощью каретки ^.Пусть максимумы отображают возведение в степень как функцию вместо каретки

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

+0

Ваша цель для вас:Вы, случайно, пытаетесь сгенерировать код для другой системы (Python, C, что-то еще)? Вы говорите, что экспоненты выводятся с помощью '^' - вы имеете в виду, что вы смотрите на результат 'grind' или' string' или 'display2d: false'? Или вы хотите сказать, что вы хотите видеть 'pow (a, b)' в любом пользовательском интерфейсе, который вы используете? Если да, какой пользовательский интерфейс вы используете? Спасибо за любую информацию. –

+0

Действительно, мы пытаемся создать синтаксис для другой системы, в данном случае javascript (где это Math.pow (a, b)). В настоящее время мы используем функцию измельчения для вывода. Нам не нужно, чтобы pow (a, b) работал в максимумах, это только для вывода. спасибо Robert – mmzc

ответ

1

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

Это ожидаемый выход?

+0

Спасибо, Роберт, это потрясающе. На данный момент мне нужна только первая часть, но остальное тоже очень интересно! – mmzc

+0

Привет, Роберт. Следуя этому, мы теперь хотели бы изменить% e^​​(что-либо) на exp (что-либо). Я видел, что у максимумов есть пути перехода от exp() к% e ^, но возможно ли это также? Спасибо – mmzc

+0

Да, я добавлю еще один ответ. –

1

ОП спросил о преобразовании %e^x в exp(x). Это легко сделать, но чтобы заставить его придерживаться, нам нужно отключить упрощение, то есть приложение тождеств, которое Maxima использует для нахождения общего представления выражения. По умолчанию 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 вместо .

Я использовал другой механизм для замены здесь, а именно defrule, который определяет правило сопоставления шаблонов. Совпадение шаблонов очень полезно, и я рекомендую вам взглянуть на defrule и matchdeclare в документации Maxima.