|
56 | 56 | # return the coefficient matrix `A` and a
|
57 | 57 | # vector of constants (possibly symbolic) `b` such that
|
58 | 58 | # A \ b will solve the equations for the vars
|
59 |
| -function A_b(eqs::AbstractArray, vars::AbstractArray) |
| 59 | +function A_b(eqs::AbstractArray, vars::AbstractArray, check) |
60 | 60 | exprs = rhss(eqs) .- lhss(eqs)
|
61 |
| - for ex in exprs |
62 |
| - @assert islinear(ex, vars) |
| 61 | + if check |
| 62 | + for ex in exprs |
| 63 | + @assert islinear(ex, vars) |
| 64 | + end |
63 | 65 | end
|
64 | 66 | A = jacobian(exprs, vars)
|
65 | 67 | b = A * vars - exprs
|
66 | 68 | A, b
|
67 | 69 | end
|
68 |
| -function A_b(eq, var) |
| 70 | +function A_b(eq, var, check) |
69 | 71 | ex = eq.rhs - eq.lhs
|
70 |
| - @assert islinear(ex, [var]) |
| 72 | + check && @assert islinear(ex, [var]) |
71 | 73 | a = expand_derivatives(Differential(var)(ex))
|
72 | 74 | b = a * var - ex
|
73 | 75 | a, b
|
74 | 76 | end
|
75 | 77 |
|
76 | 78 | """
|
77 |
| - solve_for(eqs::Vector, vars::Vector) |
| 79 | + solve_for(eqs::Vector, vars::Vector; simplify=true, check=true) |
78 | 80 |
|
79 | 81 | Solve the vector of equations `eqs` for a set of variables `vars`.
|
80 | 82 |
|
81 | 83 | Assumes `length(eqs) == length(vars)`
|
82 | 84 |
|
83 |
| -Currently only works if all equations are linear. |
| 85 | +Currently only works if all equations are linear. `check` if the expr is linear |
| 86 | +w.r.t `vars`. |
84 | 87 | """
|
85 |
| -function solve_for(eqs, vars; simplify=true) |
86 |
| - A, b = A_b(eqs, vars) |
| 88 | +function solve_for(eqs, vars; simplify=true, check=true) |
| 89 | + A, b = A_b(eqs, vars, check) |
87 | 90 | #TODO: we need to make sure that `solve_for(eqs, vars)` contains no `vars`
|
88 | 91 | _solve(A, b, simplify)
|
89 | 92 | end
|
|
0 commit comments