Документация Engee

Работа с выражениями

Symbolics.jl предоставляет возможности для удобной работы с выражениями. Большая часть функционала обеспечивается объектами выражений, следующими стандартной математической семантике. Например, если имеется A — матрица символьных выражений, заключенная в Num, — A^2 вычисляет выражения для квадратной матрицы. Поэтому для выполнения многих операций в IR рекомендуется использовать стандартную среду Julia. Например, вычисление разреженной формы матрицы с помощью sparse(A) является корректным, удобным и понятным процессом для всех программистов Julia.

Функциональность, унаследованная от SymbolicUtils.jl

substitute(expr, s)

Выполняет подстановку в expr в соответствии с правилами s.

Примеры

julia> @variables t x y z(t)
4-element Vector{Num}:
    t
    x
    y
 z(t)
julia> ex = x + y + sin(z)
(x + y) + sin(z(t))
julia> substitute(ex, Dict([x => z, sin(z) => z^2]))
(z(t) + y) + (z(t) ^ 2)
simplify(x; expand=false,
            threaded=false,
            thread_subtree_cutoff=100,
            rewriter=nothing)

Упрощает выражение (x), применяя rewriter до тех пор, пока не останется никаких изменений. expand=true применяет expand в начале каждой итерации с фиксированной точкой.

По умолчанию функция simplify предполагает, что знаменатели не равны нулю, и допускает отмену в дробях. Передайте simplify_fractions=false, чтобы избежать этого.

Документацию по rewriter можно найти здесь, используя макрос @rule или макрос @acrule из SymbolicUtils.jl.

Дополнительные функции

Дополнительные функции приведены ниже.

get_variables(O) -> Vector{BasicSymbolic}

Возвращает переменные в выражении. Обратите внимание, что возвращаемые переменные не заключены в тип Num.

Примеры

julia> @variables t x y z(t)
4-element Vector{Num}:
    t
    x
    y
 z(t)

julia> ex = x + y + sin(z)
(x + y) + sin(z(t))

julia> Symbolics.get_variables(ex)
3-element Vector{Any}:
 x
 y
 z(t)
tosymbol(x::Union{Num,Symbolic}; states=nothing, escape=true) -> Symbol

Преобразует x в символ. states — это состояния системы, а escape означает, есть ли у целевого объекта выходы, такие как val"y(t)". Если escape имеет значение false, будет выведен y вместо y(t).

Примеры

julia> @variables t z(t)
2-element Vector{Num}:
    t
 z(t)

julia> Symbolics.tosymbol(z)
Symbol("z(t)")

julia> Symbolics.tosymbol(z; escape=false)
:z
diff2term(x) -> Symbolic

Преобразует дифференциальную переменную в Term. Обратите внимание, что функция принимает только Term, а не Num.

julia> @variables x t u(x, t) z(t)[1:2]; Dt = Differential(t); Dx = Differential(x);

julia> Symbolics.diff2term(Symbolics.value(Dx(Dt(u))))
uˍtx(x, t)

julia> Symbolics.diff2term(Symbolics.value(Dt(z[1])))
var"z(t)[1]ˍt"
solve_for(eq, var; simplify, check) -> Any

Решает уравнения eqs для набора переменных vars.

Предполагается, что length(eqs) == length(vars).

В настоящее время работает только в том случае, если все уравнения линейны. Проверьте (check), является ли выражение линейным относительно vars.

Примеры

julia> @variables x y
2-element Vector{Num}:
 x
 y

julia> Symbolics.solve_for(x + y ~ 0, x)
-y

julia> Symbolics.solve_for([x + y ~ 0, x - y ~ 2], [x, y])
2-element Vector{Float64}:
  1.0
 -1.0
degree(p, sym=nothing)

Извлекает степень p относительно sym.

Примеры

julia> @variables x;

julia> Symbolics.degree(x^0)
0

julia> Symbolics.degree(x)
1

julia> Symbolics.degree(x^2)
2
coeff(p, sym=nothing)

Извлекает коэффициент p относительно sym. Обратите внимание, что может потребоваться разложить и (или) упростить p с помощью expand и (или) simplify.

Примеры

julia> @variables a x y;

julia> Symbolics.coeff(2a, x)
0

julia> Symbolics.coeff(3x + 2y, y)
2

julia> Symbolics.coeff(x^2 + y, x^2)
1