I’m learning how to use Symbolcs.jl.
My current work involves lines and vectors in three dimensional space.
At the suggestion of, I think Shash, at a CAJUN about a month ago, since the Symbolics variables as introduced by @variables
are scalars, I’ve defined
"""
symbolic_vector(name::Symbol, n::Integer)
Define `n` Symbolics variables hose names are based on `name` and
return a vector of those variables.
"""
function symbolic_vector(name::Symbol, n::Integer)
eltname(name, i) = Symbol("($name)_$i")
map(variable, map(i -> eltname(name, i), 1:n))
end
to define “vector variables”, and
"""
vsubs(v::Vector{Symbolics.Num}, values...)
Return a list of `Pair`s suitable for constructing a `Dict` which is
suitable for passing to `Symbolics.substitute`, which
substitues each of `values` with the corresponding variable in `v`.
"""
function vsubs(v::Vector{Symbolics.Num}, values...)
Pair.(v, values)
end
to swubstitute values for them.
I also provide qa cnvenience function for creating the parameteric formula for a line:
"""
line(p1, p2, param)
Return the parametric formula for a point on a line which passes through points `p1` and `p2`, and has `param`.
"""
function line(p1, p2, param)
p1 + param * (p2 - p1)
end
As a simple example, I’m trying to find the point at which two copla\nar lines intersect:
P1 = symbolic_vector(:P1, 3)
P2 = symbolic_vector(:P2, 3)
P3 = symbolic_vector(:P3, 3)
P4 = symbolic_vector(:P4, 3)
@variables r, s
L1 = line(P1, P2, r)
L2 = line(P3, P4, s)
# L1 and L2 intersect at the point where their formulas are equal:
e1 = Equation(L1, L2)
substitutions = OrderedDict(
# expect r = s = 0.5.
vsubs(P1, 0, -1, 0)...,
vsubs(P2, 2, 1, 0)...,
vsubs(P3, 0, 0, 0)...,
vsubs(P4, 2, 0, 0)...)
eq1s = substitute(e1, substitutions)
from which I can solve in my head to r = s = 0.5.
How do I get solve_for
to tell me that though?
solved = solve_for(eq1s, r)
but solved[1]
is
(1//0)*(2r - 2s)
and solved[2]
(1//0)*(-1 + 2r)
show division by zero.
What am I doing wrong?
How do I get solve_for
to give me solutions?
Should I be doing something else instead?