2013-04-09 4 views
0

Ну, у меня есть математическое выражение в строкеMath Выражение «родовое» в Java

String myExpression = "2-3*(cos(x)+sen(x)-exp(-x))*(sen(2x)+1/(cos(x)))"; 

, и я хотел бы знать, как получить выражение (в виде строки):

2-3*cos(x)*sen(2x)-3*cos(x)/cos(x)-3*sen(x)*sen(2x)-3*sen(x)/cos(x)+3*exp(-x)*sen(2x)+3*exp(-x)/cos(x) 

т. Е. Применить дистрибутивное свойство, но без значений вычисления.

Может ли кто-нибудь мне помочь?

+4

Насколько я знаю, нет встроенных функций, которые делают такие вещи. Для этого вам, скорее всего, придется самостоятельно разобрать строку и развернуть выражение. –

+0

Используйте Prolog для этого ... Это можно сделать в нескольких строках. – nhahtdh

+0

Ищите библиотеку синтаксического анализатора java и напишите парсер – Patashu

ответ

0

Если вы хотите преобразовать математическое выражение в другую форму, я рекомендую изменить его на ссылку postfix/prefix expressions (<), а также сначала расскажет вам, как преобразовать обратно в «infix»), а затем попытайтесь с ней поиграть (вы можете обрабатывайте свои функции (например, sin(x)) в качестве констант). Надеюсь, вы можете сделать это сами, много источников, чтобы найти ссылки.

Link to a simple Infix/Postfix Calculator , так что вы можете попробовать, если вы еще не пробовали это раньше.

Далее преобразовать обратно в инфикс, но на этот раз распределяя умножение и деление

например.

* 
/\ 
A + 
    /\ 
    B /
    /\ 
    C D 

Infix: A*(B+C/D) 
Postfix: ABCD/+* 

ABCD/+* 
C and D division first (distribute)    >>> C/D 
B and C/D addition(addition,nothing to distribute) >>> B+C/D 
A and B + C/D multiplication (distribute)   >>> A*B+A*C/D 

Так что, вообще говоря, вы ничего не делаете, кроме как объединяете строки сложения и вычитания.
Но:

  1. Если у вас есть умножение на A затем добавить "A*" строку в самом начале и после каждого '+' или '-'

  2. Когда вы разделите на B затем добавить "/B" строку до самого конца и до каждого '+' или '-'.

Я считаю, что это должно охватывать все простые выражения. Вы можете (или не обязательно) нуждаться в еще нескольких случаях, когда выражение, разветвленное широко, не полностью продумало это. Я буду благодарен за отзывы.

+0

Большое спасибо, SGM1. –

Смежные вопросы