Matrix math
ericremoreynolds opened this issue · 5 comments
Hello Christoph,
From your source code it seems to me that there is no support for matrix algebra and calculus in the library, is this correct?
Introducing matrix algebra is a pain, I have found, because all of a sudden some product expressions are commutative and others aren't.
Regards,
Eric.
Indeed, there is no support for matrix expressions. There was in old Math.NET Classic, but not in Symbolics yet.
I would skip matrices completely and go for tensors (#14) instead.
This would make sense since scalars, vectors, and matrices are just a special kind of tensors.
the lack for matrices and tensors is annoying. it is currently not possible to solve system of equations symbolically:
let burger = symbol "burger"
let pommes = symbol "pommes"
let coke = symbol "coke"
let bill = symbol "bill"
let equations = [
(2*coke) == 30.0
(1*coke + 2*burger) == 20.0 // equals does not exist
(1*burger + 4*pommes) == 9.0
(burger + pommes * coke) == bill
]
linSolve equations bill // not working
the only way i could figure out was the numerical solution:
let M = matrix [[3.0; 0.0; 0.0]
[1.0; 2.0; 0.0]
[0.0; 1.0; 4.0]]
let R = vector [30.0; 20.0; 9.0]
let result = M.Solve(R)
let coke = result.[0]
let burger = result.[1]
let pommes = result.[2]
burger + pommes * coke // 15
maybe we could port Redberry (Sourcecode), since it has great support for tensors.
Matrix multiplication supported with an ugly way
let v = FloatingPoint.RealVector <| vector[1.0;2.0;3.0]
let M = FloatingPoint.RealMatrix <|
matrix [[3.0; 0.0; 0.0]
[1.0; 2.0; 0.0]
[0.0; 1.0; 4.0]]
let symbols2 = dict[ "a", v; "m", M ]
let a0 = SymbolicExpression(Infix.parseOrThrow("a * 2")).Evaluate(symbols2)
printfn "%A" a0.RealVectorValue
let a1 = SymbolicExpression(Infix.parseOrThrow("a + 1")).Evaluate(symbols2)
printfn "%A" a1.RealVectorValue
let a2 = SymbolicExpression(Infix.parseOrThrow("mat_by_row(a, a)")).Evaluate(symbols2)
printfn "%A" a2.RealMatrixValue
let a4 = SymbolicExpression(Infix.parseOrThrow("mat_multiply(m, mat_by_col(a, vec(1.0, 2.0, 3.0), a), a)")).Evaluate(symbols2)
printfn "%A" a4
Result
seq [2.0; 4.0; 6.0]
seq [2.0; 3.0; 4.0]
DenseMatrix 2x3-Double
1 2 3
1 2 3
DenseMatrix 3x2-Double
1 1
2 2
3 3
RealVector (seq [9.0; 13.0; 61.0])