User Tools

Site Tools


libkin:classes:expr:index

Expression

При анализе текста схемы процесса (см. Schema) выявляются её параметры, прежде всего константы скоростей элементрарных реакций. В кинетических расчётах они не такие уж и константы: как минимум, они зависят от температуры, а температура среды может изменяться (см. раздел Thermochemistry).

Итак, значением переметра может быть выражение, Expression. В ABCKinetics в качестве выражения допустимы математические выражения, включающие арифметические операции (+ - * / ^), стандартные функции (показательная, логарифм, тригонометрические и т.д.), а также ссылки на значения других параметров и на значения концентраций реагентов процесса. Более того, пользователь для своего удобства может объявлять собственные функции.

Подчеркну ещё раз: выражения – это возможные значения параметров, не сами параметры1).

class Expression
{
 public:
  Expression(const Expression&) = delete;
  Expression operator=(const Expression&) = delete;

  Expression();
  Expression(double);
  Expression(const String&);
  ~Expression();

  double evaluate(const CalcContext*) const;
 // for readers' info:
 private:
  const ParsedExpression* pexpr;
};

Для оптимизации вычислений, выражения предварительно компилируются. Если это константное выражение (напр., π/2 или sqrt(2)), то результатом компиляции будет обыкновенное число. Этот результат хранится в приватной части объектов Expression, в члене класса с типом ParsedExpression, с помощью которого и отрабатывает публичный метод evaluate.

В общем случае выражения содержат ссылки на значения параметров и на текущие концентрации реагентов. Поэтому для вычисления выражения методу evaluate нужно сообщить контекст (для какого варианта/инстанса схемы проводить расчёт, то есть где взять конкретные значения параметров и концентраций). Это объект типа CalcContext.

1)
программисты такие объекты называют RValues (right side values), то, что можно использовать в правой части оператора присваивания
libkin/classes/expr/index.txt · Last modified: by 127.0.0.1