Выражения над физическими величинами и функциями

Неформальное описание и примеры.

Выражение представляется в обычной форме с четырьмя действиями арифметики и операцией возведения в степень (^ или **). Члены можно группировать круглыми или фигурными скобками:

5 - (1+2*2)

3^2+4^2-5**2

Если операнды представляют собой целые числа, то для операций +, -, * и возведения в целую неотрицательную степень ответ тоже будет целым.

Представление нецелых чисел содержит десятичную точку и/или порядок:

-3.1415 * 2.00 + 62830e-3

Необычным является то, как точность представления операндов влияет на точность представления результата:

0.2 + .162345 = 0.4

0.200 + .162345 = 0.362

Фактически эти дробные числа являются безразмерными физвеличинами с погрешностью, определяемой числом знаков.

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

9.82[m/s2] — 9 целых 82 сотых метра на секунду в квадрате

9.82[m*s-2] — то же самое

Пробелы между числом и квадратной скобкой, а также внутри скобок не допускаются. Квадратные скобки можно опустить в случае, когда единицы измерения состоят из одной единицы, обозначаемой латинскими буквами, с метрическим префиксом или без оного:

100ms

15Г - ошибка

15G - можно, эквивалентно 15[G]

Будьте осторожны: эти правила просты и логичны, но иногда порождают нечто не очень простое для восприятия:

9.82[m/s2]*100ms^2/2 — здесь написано ускорение, умножить на квадрат времени, всё делить пополам; результат равен 49.10mm

В выражении можно использовать предопределённые константы и функции:

sin(pi/2)

Множество констант и функций расширяемо — часть из них определена в ядре программы RA (см. ниже), более специфические могут быть определены в плагинах.

Обратите внимание, аргументами некоторых функций могут быть размерные физвеличины:

sin( 30degree ) — синус тридцати градусов, равно 0.5000000

sin( 30 ) — синус тридцати, равно -0.988032

Выражение — это объект, который может иметь арибуты. Значения этих атрибутов можно использовать в выражении. Так, если у выражения

pi*@R^2

имеется атрибут с именем 'R' и со значением 2cm, то значением выражения будет площадь круга с соответствующим радиусом.

Если у выражения есть атрибут с именем 'sample', у которого в свою очередь имеется атрибут с именем 'size', у которого есть атрибуты 'L' и 'W', то можно написать:

@sample@size@L * @sample@size@@W


Выше говорилось о выражениях над скалярными величинами со скалярным результатом. Однако операндами выражения могут быть как скаляры, так и функции одного переменного, в том числе экспериментальные записи, представляющие собой таблично заданные зависимости. Их можно складывать, делить друг на друга, умножать на скалярную физвеличину, и т.п.

Чтобы указать запись в качестве операнда, можно добавить её в качестве именованного атрибута к выражению и сослаться по имени атрибута, или проще — сослаться на неё по уникальному номеру записи:

#2015.01.14.57 - #2014.6.8.1

Здесь из 57ой записи от 14 января 2015 года вычитается первая запись от 8 июня 2014 года. Ссылку на запись можно несколько сократить: не указывать первые две цифры года.

Кроме того, можно сослаться на атрибут записи:

#15.01.14.57 + #15.01.14.57@angle * 5[kphoton/s/degree]

Здесь к кривой #57 прибавляется константная подставка, пропорциональная значению атрибута angle у этой же кривой. Обратите внимание на размерный множитель, который переводит angle в величину, совместимую по размерности с ординатами кривой. (Физического смысла у такого выражения по всей видимости нет, но это позволяет несколько спектров, записанных при разной ориентации образца, показать на одном графике со сдвигом по вертикали.)


Перечень констант и функций, определённых в ядре RA.

Функции над вещественными числами и безразмерными физвеличинами:

exp( аргумент )

sin( аргумент )

cos( аргумент )

tg( аргумент )

ctg( аргумент )

lg( аргумент ) - десятичный логарифм

ln( аргумент ) - натуральный логарифм

log( основание , аргумент )

А также вышеприведённые тригонометрические функции от физвеличин в градусах:

sin(30degree)=sin(30.00[°])=sin(30[°])=0.500000000

Константы:

pi = 3.14159265358979323846

c = 299792458[m/s]


Перечень операций и функционалов, из плагина CommonMath.

Под функционалом здесь понимается такое преобразование, в котором и результат, и аргументы могут быть не только физвеличинами, но и функциями (или кривыми).

Бывают как аналитические функции, программно определённые на непрерывном интервале изменения физвеличины, так и кривые, заданные конечным набором пар точек {X,Y}. Последние будем называть дискретнозаданными кривыми или, для краткости, дискретными кривыми. В частном случае, если ломанная, проходящая по точкам, представляет собой однозначную функцию, такую кривую будем называть дискретной функцией.

Плагин доопределяет следующие операции:

Четыре действия арифметики, где один из операндов дискретная функция, а другой физвеличина (в любом порядке); результат - дискретная функция.

Четыре действия арифметики, где оба операнда - дискретная функция; результат - дискретная функция. При сложении и вычитании единицы измерения ординат второго операнда должны быть приводимы к единицам первого. Единицы измерения абсцисс тоже должны бы приводимы. Дискретность абсциссы результата соответствует дискретности первого операнда (значения второго берутся интерполяцией в соответствующих точках).

Четыре действия арифметики над дискретными функциями (первый операнд) и аналитическими (второй операнд); результат - дискретнозаданная функция.

Унарный минус для дискретных кривых.

Функционалы:

minX( функция ) ‐ нижняя грань области определения функции

maxX( функция ) ‐ верхняя грань области определения функции

value_at( x , функция ) ‐ значение функции в точке

maximum( дискретная_функция ) ‐ абсолютный максимум дискретной функции

maximum_pos( дискретная_функция ) ‐ положение абсолютного максимума дискретной функции

reverse( дискретная_функция ) ‐ обратная функция

digitize( от , до , шаг , функция ) ‐ оцифровка аналитической или переоцифровка дискретной функции

cut( от , до , дискретная_функция ) ‐ выделение части дискретной функции

shift( сдвиг , дискретная_функция ) ‐ сдвинуть по абсциссе

integral( дискретная_функция ) ‐ первообразная (первая точка имеет нулевую ординату)

Integral( дискретная_функция ) ‐ определённый интеграл по всей области определения

lorentz( медиана , полуширина ) ‐ породить лоренциан (Обратите внимание: это не функция Лоренца, а функционал, её порождающий. Медиана и полуширина - это параметры, здесь могут стоять константы или выражения со значением типа физвеличина в неких единицах, а результатом является функция Лоренца, определённая на интервале от минус до плюс бесконечности в тех же единицах. Полуширина ‐ ширина на половине высоты. Нормировка: интеграл = 1.)

gauss( медиана , полуширина ) ‐ породить гауссиан (аналогично)

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

fold4v( дискретная_функция ) ‐ свернуть в соответствии с симметрией C4v


Синтаксис


Обозначения:

anything ⎜ otherthing ‒ anything или otherthing.

⎡something⎤ ‒ пусто или something.

⎡something⎤┄ ‒ пусто или something или somethingsomething или somethingsomethingsomething и т.д.


Определения:

Expression ::= spacesUnaryOperatorspaces AddendAddingOperator spaces Addend spaces ⎤┄

spaces ::= ⎡⎵⎤┄

UnaryOperator ::= +-

AddingOperator ::= +-

Addend ::= Factor spacesMultiplyingOperator spaces Factor spaces ⎤┄

MultiplyingOperator ::= */

Factor ::= Term spacesPowerSign spaces Term spaces

Term ::= ( Expression )

{ Expression }

@ AttributeName ⎡ @ AttributeName ⎤┄

# RecordReference ⎡ @ AttributeName ⎤┄

FunctionName ( spaces ⎡ Expression ⎡, Expression ⎡, Expression ⎡, Expression⎤⎤⎤⎤ )

ConstantName

Value


Note: Spaces after the function name are not allowed. A function may have 0-4 arguments.








PowerSign ::= **^

Note: Sequential power operators are not allowed unless separated with braces.


FunctionName ::= lnlglogexpsincostgctg ⎜ any_other_registered_identifier


ConstantName ::= pi ⎜ any_other_registered_identifier


Value ::= Number

Number Unit

Number [ Units ]


Number ::= DigitsDecimalDotDigits ⎤ ⎤ ⎡ e ⎡ UnaryOperatorDigits

DecimalDot Digits ⎡ e ⎡ UnaryOperatorDigits


Digits ::= DigitDigit ⎤┄


Digit ::= 0123456789


DecimalDot ::= .

Note: Decimal dot is the dot character, independently on system settings.