Equation system solver fails on simple case
WhiteBlackGoose opened this issue · 0 comments
WhiteBlackGoose commented
Reported by Isopropanol from Discord
The version I use: AngouriMath
Doesn't solve unless some simple conversation happens (see the comments).
using PeterO.Numbers;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AngouriMath;
using AngouriMath.Extensions;
using static System.Console;
using static AngouriMath.MathS;
using static AngouriMathTester.GaussianElimination;
namespace AngouriMathTester
{
class Program
{
static void Main(string[] args)
{
#region Gaussian elimination
/*
Entity[,] N = new Entity[3, 4]
{
{ 1, -1, 2, 6},
{ 2, 3, 2, 11},
{ "X", 2, 1, 8}
}; // returns true with and right results;
bool resultBool = LinearEquationSolver.Solve(N);
Entity[,] M = new Entity[25, 26]{
{ 1, 1, 0, 0, 0, 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , "9.80665 * 998.21 * C_1" }, // "X_2 - 9.80665 * 998.21 * C_1 + X_1",
{ 0, "-C_2 * 0.0001", 0, 0, 0, 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,-1 ,0 ,0 ,0 ,0 ,0 ,0 , 0 }, // "-(X_19) - C_2 * 0.0001 * X_2",
{ -1, 0, 1, -1, 0, 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 }, // "X_3 - X_1 - X_4",
{ 0, 0, 0, 1, 0, 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , "(-80000) * n_1" ,0 ,0 ,0 ,0 ,0 ,0 , "(800000) * n_1 ^ 2" }, // "(-80000) * X_19 * n_1 + X_4 + (-800000) * n_1 ^ 2",
{ 0, 0, 0, 0, -1, "-C_3 * 0.0001" ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 }, // "-(X_5) - C_3 * 0.0001 * X_6",
{ 0, 0, 0, 0, 0, 1 ,0 ,0 ,0 ,0 ,"-40743.6654315252" ,0 ,0 ,0 ,0 , -1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 }, // "X_6 - X_16 + -40743.6654315252 * X_11",
{ 0, 0, 0, 0, 0, 0 , -1 , "- C_4 * 0.0001" ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 }, // "-(X_7) - C_4 * 0.0001 * X_8",
{ 0, 0, 0, 0, 0, 0 , 0 , 1 ,0 ,0 ,"-40743.6654315252" ,0 ,0 ,0 ,0 , -1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 }, // "X_8 - X_16 + -40743.6654315252 * X_11",
{ 0, 0, 0, 0, 0, 0 , 0 , 0 ,-1 , "-C_5 * 0.0001",0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 }, // "-(X_9) - C_5 * 0.0001 * X_10",
{ 0, 0, 0, 0, 0, 0 , 0 , 0 , 0 , 1, "-40743.6654315252",0 ,0 ,0 ,0 , -1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 }, // "X_10 - X_16 + -40743.6654315252 * X_11",
{ 0, 0, 0, 0, 1, 0 , 1 , 0 , 1 , 0, -1,0 ,0 ,1 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 }, // "X_5 + X_14 + X_7 - X_11 + X_9",
{ 0, 0, 0, 0, 0, 0 , 0 , 0 , 0 , 0, 0, 1, "40743.6654315252",0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 }, // "40743.6654315252 * X_13 + X_12",
{ 0, 0, 0, 0, -1, 0 , 1, 0 , 1, 0, 0, 0, 1, 1 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 }, // "X_13 - X_5 + X_14 + X_7 + X_9",
{ 0, 0, 0, 0, 0, 0 , 0, 0 , 0, 0, 0, 0, 0, -1, "-C_6 * 0.0001", 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 }, // "-(X_14) - C_6 * 0.0001 * X_15",
{ 0, 0, 0, 0, 0, 0 , 0, 0 , 0, 0, "-40743.6654315252", 0, 0, 0, 1, -1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 }, // "X_15 - X_16 + -40743.6654315252 * X_11",
{ 0, 0, 0, 0, 0, 0 , 0, 0 , 0, 0, 0, 1, 0, 0, 0, 1, -1, 0,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 }, // "X_12 - X_17 + X_16",
{ 0, 0, -1, 0, 0, 0 , 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 }, // "X_18 - X_3 + X_17",
{ 0, 0, 0, 0, 0, 0 , 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, "-C_7 * 0.0001", -1,0 ,0 ,0 ,0 ,0 ,0 , 0 }, // "-(X_19) - C_7 * 0.0001 * X_18",
{ 0, 0, 0, 0, 0, 0 , 0, 0 , 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 0 , -1 ,0 ,0 ,0 , 0 }, // "X_19 - X_22 - X_13",
{ 0, 0, 0, 0, 0, 0 , 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 , "80000 * n_2",0 ,0 ,0 , "(800000) * n_2 ^ 2"}, // "X_20 + 80000 * X_22 * n_2 + (-800000) * n_2 ^ 2",
{ 0, 0, 0, 0, 0, 0 , 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "-C_8 * 0.0001", 1,0 ,0 ,0 , 0 }, // "X_22 - C_8 * 0.0001 * X_21",
{ 0, 0, 0, 0, 0, 0 , 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,"-C_9 * 0.0001" ,0 ,0 , 0 }, // "X_22 - C_9 * 0.0001 * X_23",
{ 0, 0, 0, 0, 0, 0 , 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,1 ,0 , "9.80665 * 998.21 * C_1" }, // "X_23 - 9.80665 * 998.21 * C_1 + X_24",
{ 0, 0, 0, 0, 0, 0 , 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0 ,-1 ,1, 0 }, // "X_25 - X_24 - X_20",
{ 0, 0, 0, 0, 0, 0 , 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 ,0 ,-1, 0 }, // "X_21 - X_25 + X_17",
};
resultBool = LinearEquationSolver.Solve(M);
*/
#endregion
#region AngouriMath
var system_1 = Equations(
"X_8 - v_1 * 0.000100000000000000004792173602385929598312941379845142364501953125 * X_1",
"-X_2 - v_2 * 0.000100000000000000004792173602385929598312941379845142364501953125 * X_6",
"-X_3 - v_3 * 0.000100000000000000004792173602385929598312941379845142364501953125 * X_4",
"X_4 - X_6 + (-40743.6654315252017113380134105682373046875) * X_3",
"-X_5 - v_4 * 0.000100000000000000004792173602385929598312941379845142364501953125 * X_6",
"X_7 - X_6 + X_1",
"X_8 - v_5 * 0.000100000000000000004792173602385929598312941379845142364501953125 * X_7",
"X_8 - X_3 - X_9 - X_2",
"X_9 - X_12 - X_5",
"X_6 - X_10 - X_11",
"X_11 + 80000 * X_12 * n + (-800000) * n * n",
"X_12- v_6 * 0.000100000000000000004792173602385929598312941379845142364501953125 * X_13",
"X_13 - 9789.0960964999997808359069040306866750797257845497032630044387246925907675176858901977539062500000017547 * v_7 + X_10");
// returns right solution
var result_1 = system_1.Solve("X_1", "X_2", "X_3", "X_4", "X_5", "X_6", "X_7", "X_8", "X_9", "X_10",
"X_11", "X_12", "X_13");
Entity y_1 = "-Y_3 - v_3 * 0.000100000000000000004792173602385929598312941379845142364501953125 * Y_4";
Entity y_2 = "-Y_8 - v_1 * 0.000100000000000000004792173602385929598312941379845142364501953125 * Y_1";
Entity y_3 = "-Y_8 - v_5 * 0.000100000000000000004792173602385929598312941379845142364501953125 * Y_7";
Entity y_4 = "Y_7 - Y_6 + Y_1";
Entity y_5 = "-Y_2 - v_2 * 0.000100000000000000004792173602385929598312941379845142364501953125 * Y_6";
Entity y_6 = "-Y_5 - v_4 * 0.000100000000000000004792173602385929598312941379845142364501953125 * Y_6";
Entity y_7 = "Y_4 - Y_6 + (-40743.6654315252017113380134105682373046875) * Y_3";
Entity y_8 = "Y_9 - Y_3 + Y_2 - Y_8";
Entity y_9 = "-(Y_5 + Y_12 + Y_9)"; // -Y_9 - Y_5 - Y_12 != -(Y_5 + Y_12 + Y_9)
Entity y_10 = "Y_6 - Y_10 - Y_11";
Entity y_11 = "Y_11 + 80000 * Y_12 * n + (-800000) * n * n";
Entity y_12 = "Y_12 - v_6 * 0.000100000000000000004792173602385929598312941379845142364501953125 * Y_13";
Entity y_13 = "Y_13 - 9789.0960964999997808359069040306866750797257845497032630044387246925907675176858901977539062500000017547 * v_7 + Y_10";
var _ = y_9.Simplify();
var system_2 = Equations(
y_1, y_2, y_3, y_4, y_5, y_6, y_7, y_8, y_9, y_10, y_11, y_12, y_13);
// returns null
var result_2 = system_2.Solve("Y_4", "Y_1", "Y_8", "Y_7", "Y_2", "Y_5", "Y_6", "Y_3", "Y_9", "Y_10",
"Y_11", "Y_12", "Y_13");
y_9 = "-Y_9 - Y_5 - Y_12"; // -Y_9 - Y_5 - Y_12 != -(Y_5 + Y_12 + Y_9)
var system_3 = Equations(
y_2, y_5, y_1, y_7, y_6, y_4, y_3, y_8, y_9, y_10, y_11, y_12, y_13);
// returns right solution
var result_3 = system_3.Solve("Y_1", "Y_2", "Y_3", "Y_4", "Y_5", "Y_6", "Y_7", "Y_8", "Y_9", "Y_10",
"Y_11", "Y_12", "Y_13");
#endregion
Console.Read();
}
}
}