Работа с выражениями
Symbolics.jl предоставляет возможности для удобной работы с выражениями. Большая часть функционала обеспечивается объектами выражений, следующими стандартной математической семантике. Например, если имеется A — матрица символьных выражений, заключенная в Num, — A^2 вычисляет выражения для квадратной матрицы. Поэтому для выполнения многих операций в IR рекомендуется использовать стандартную среду Julia. Например, вычисление разреженной формы матрицы с помощью sparse(A) является корректным, удобным и понятным процессом для всех программистов Julia.
Функциональность, унаследованная от SymbolicUtils.jl
#
SymbolicUtils.substitute — Function
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)
#
SymbolicUtils.simplify — Function
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.
Дополнительные функции
Дополнительные функции приведены ниже.
#
Symbolics.get_variables — Function
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)
#
Symbolics.tosymbol — Function
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
#
Symbolics.diff2term — Function
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"
#
Symbolics.solve_for — Function
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
#
Symbolics.degree — Function
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
#
Symbolics.coeff — Function
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