public int Solve_Optimized(out bool complete) { Vector negativeKnown = new Vector(knownForce); negativeKnown.Scale(-1); Matrix matrix = new Matrix(unknowns.Select(edgeTuple => edgeTuple.Item2).ToList(), negativeKnown); int rank = matrix.ReduceToRREF(); complete = true; int numSolved = 0; for (int i = 0; i < rank; ++i) { int pos = FetchSolvedPosition(matrix, i); if (pos > -1) { var solvedInternalForce = matrix[i, matrix.N - 1]; if (!OTruss.ForceIsValid(solvedInternalForce)) { return(-1); } internalForces[unknowns[pos].Item1] = solvedInternalForce; ++numSolved; } } complete = numSolved == unknowns.Count; return(numSolved); }
public OCommandProcessor() { truss = new OTruss(); }