Работа с выражениями
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