2013-12-22 1 views
4

Есть ли какой-либо алгоритм, который может найти знак произвольного символьного алгебраического выражения, заданного в «Tree-Form»?Знак символического алгебраического выражения

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

Например: sign(sqrt(2)-1) = ?

+0

Когда вы говорите " алгебраический ", содержит ли он неизвестные? – Eric

+0

Нет, он свободен от переменных. Кроме того, когда я сказал «алгебраический», я не имел в виду, что он может содержать только альгероидные числа. Он также может содержать что-то вроде log (2) или atan (2). Но я не ищу общий алгоритм. –

+2

Вы должны оценить выражение с достаточной точностью.Вероятно, вы захотите использовать арифметический пакет с произвольной точностью и, возможно, интервальную арифметику. –

ответ

0

Вычислить значение функции

вам нужна функция оценщик двигатель для этого (это не так сложно кода) есть is нет оценить только если вы хотите поддержка +, - операции !!! Все мои функции оценщики работает следующим образом:

  1. компилировать исходный текст функции

    Сначала нужно создать функции, поддерживаемые таблицы (идентификатор, Num операндов, имя, указатель на функцию), как:

    +,-,*,/,sin,cos,.... 
    

    Это будут строительные блоки для любого поддерживаемого выражения, которое необходимо оценить. Не забудьте также закодировать все функции в вашем коде. Кронштейны для ключей (, ) также как функции (push,pop). Группируйте свои функции по количеству операндов, поэтому +,- с 1 и 2 операндами (две разные функции каждый !!!).

    Теперь из выражения экстракта:

    • имена переменных
    • постоянные имена и значения
    • число значений

    В какой-то таблицы/списка:

    variables[](id,name,value) 
    constants[](id,name,value) 
    numbers [](id, ,value) 
    

    И теперь, наконец, t скомпилированная функциональная строка. Мои строки заданы из двух int. Сначала type (какая таблица использовать), а вторая - id (указатель в таблице).

    , например, выражение:

    sign(sqrt(2)-1) 
    

    типов:

    id type 
    0 function 
    1 number 
    2 constant 
    3 variable 
    

    функции:

    id name pointer 
    0 '(' ??? 
    1 ')' ??? 
    2 '+' ??? 
    3 '-' ??? 
    4 '*' ??? 
    5 '/' ??? 
    6 'sqrt' ??? 
    7 'sign' ??? 
    

    Там нет переменных или константыномера являются:

    id value 
    0 2 
    1 1 
    

    скомпилирован строка:

    type id 
    0 7 // sign(1 operand) 
    0 6 // sqrt(1 operand) 
    1 0 // 2 
    0 3 // - (2 operands) 
    1 1 // 1 
    
  2. После компиляции вы должны интерпретировать строку и оценить его значение.

    1. инициализации переменных

      op1=0`,`op2=0, // set all operands to zero (number depends on supported functions usually 2) 
      opn=0   // actual operands number 
      fx=none  // actual function (for example none=-1) 
      fxn=0   // actual function operands number 
      
    2. прочитал первую запись из скомпилированного строки

      , если это значение (число, константа, переменная) устанавливается соответствующая op? значение с ней и приращение счетчика операнда opn++ ,

      если функция установлена ​​fx,fxn код с его

    3. если opn == fxn

      Вы достигли требуется операнд COUNT так выполнять функцию fx и инициализации следующей функции

      op1=fxtab[fx].pointer(op1,op2,...) 
      fx=none,fxn=1 
      opn=1 (some spec functions can return more operands, then set op1,op2,.. opn=...) 
      
    4. если не конец строки goto # 2 но со следующей строкой запись

    5. в конце op1 должны держать ваше выходное значение

некоторые примеры функции (реализация C++):

double sign(double op1) 
{ 
if (op1>0.0) return +1.0; 
if (op1<0.0) return -1.0; 
return 0.0; 
} 
double sqrt1(double op1) { return sqrt(op1); } 
double plus1(double op1) { return op1; } 
double minus1(double op1) { return -op1; } 
double plus2(double op1,double op2) { return op1+op2; } 
double minus2(double op1,double op2) { return op1-op2; } 

[Примечания]

Вы есть для обработки особых случаев, таких как function = "";. Также будьте осторожны, чувствительность к регистру, потому что любая ошибка в компиляции делает недействительным результат.

Скорость не большая проблема, это интерпретация-оценка не численное решение. Все операции называются в то же время, что и на бумаге.

Вы также должны обрабатывать математические ошибки (переполнение, недействительные операнды NaN, Inf ...)

Я обычно групповые функции с одинаковым числом операндов иметь тип, чтобы упростить вещи

+0

У меня уже есть численный и символический синтаксический анализатор для строковых выражений. Однако я хочу знать, как это делается в компьютерной алгебре (например, Mathematica или Maple). Это действительно сделано с помощью численного значения выражения? –

+0

Я думаю, что ДА, потому что если у вас есть добавление или выражение в формуле, то знак определяется знаками и значениями операндов ... поэтому я не вижу другого способа сделать это определение знака – Spektre

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

  • Нет связанных вопросов^_^