mathnet/mathnet-symbolics

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])