diff --git a/apps/solver/base.de.i18n b/apps/solver/base.de.i18n index ab32b9dce..843c7dea8 100644 --- a/apps/solver/base.de.i18n +++ b/apps/solver/base.de.i18n @@ -4,6 +4,7 @@ AddEquation = "Ajouter une équation" Resolve = "Résoudre l'équation" RequireEquation = "L'entrée doit être une équation" UseEquationModel = "Utiliser le modèle d'équation" +UndefinedEquation = "Une equation est indéfinie" TooManyVariables = "Le système a trop d'inconnus" NonLinearSystem = "Le système n'est pas linéaire" Solution = "Solution" diff --git a/apps/solver/base.en.i18n b/apps/solver/base.en.i18n index ab32b9dce..843c7dea8 100644 --- a/apps/solver/base.en.i18n +++ b/apps/solver/base.en.i18n @@ -4,6 +4,7 @@ AddEquation = "Ajouter une équation" Resolve = "Résoudre l'équation" RequireEquation = "L'entrée doit être une équation" UseEquationModel = "Utiliser le modèle d'équation" +UndefinedEquation = "Une equation est indéfinie" TooManyVariables = "Le système a trop d'inconnus" NonLinearSystem = "Le système n'est pas linéaire" Solution = "Solution" diff --git a/apps/solver/base.es.i18n b/apps/solver/base.es.i18n index ab32b9dce..843c7dea8 100644 --- a/apps/solver/base.es.i18n +++ b/apps/solver/base.es.i18n @@ -4,6 +4,7 @@ AddEquation = "Ajouter une équation" Resolve = "Résoudre l'équation" RequireEquation = "L'entrée doit être une équation" UseEquationModel = "Utiliser le modèle d'équation" +UndefinedEquation = "Une equation est indéfinie" TooManyVariables = "Le système a trop d'inconnus" NonLinearSystem = "Le système n'est pas linéaire" Solution = "Solution" diff --git a/apps/solver/base.fr.i18n b/apps/solver/base.fr.i18n index ab32b9dce..843c7dea8 100644 --- a/apps/solver/base.fr.i18n +++ b/apps/solver/base.fr.i18n @@ -4,6 +4,7 @@ AddEquation = "Ajouter une équation" Resolve = "Résoudre l'équation" RequireEquation = "L'entrée doit être une équation" UseEquationModel = "Utiliser le modèle d'équation" +UndefinedEquation = "Une equation est indéfinie" TooManyVariables = "Le système a trop d'inconnus" NonLinearSystem = "Le système n'est pas linéaire" Solution = "Solution" diff --git a/apps/solver/base.pt.i18n b/apps/solver/base.pt.i18n index ab32b9dce..843c7dea8 100644 --- a/apps/solver/base.pt.i18n +++ b/apps/solver/base.pt.i18n @@ -4,6 +4,7 @@ AddEquation = "Ajouter une équation" Resolve = "Résoudre l'équation" RequireEquation = "L'entrée doit être une équation" UseEquationModel = "Utiliser le modèle d'équation" +UndefinedEquation = "Une equation est indéfinie" TooManyVariables = "Le système a trop d'inconnus" NonLinearSystem = "Le système n'est pas linéaire" Solution = "Solution" diff --git a/apps/solver/equation.cpp b/apps/solver/equation.cpp index 4468d24e2..9f00539ac 100644 --- a/apps/solver/equation.cpp +++ b/apps/solver/equation.cpp @@ -40,10 +40,12 @@ Expression * Equation::standardForm(Context * context) const { Expression * e = expression(context); if (e->type() == Expression::Type::Equal) { m_standardForm = static_cast(e)->standardEquation(*context); - } else { + } else if (e->type() == Expression::Type::Rational && static_cast(e)->isOne()) { // The equality was reduced which means the equality was always true. - assert(e->type() == Expression::Type::Rational && static_cast(e)->isOne()); m_standardForm = new Rational(0); + } else { + // The equality has an undefined operand + assert(e->type() == Expression::Type::Undefined); } } return m_standardForm; diff --git a/apps/solver/equation_store.cpp b/apps/solver/equation_store.cpp index 4733ca683..60298dc40 100644 --- a/apps/solver/equation_store.cpp +++ b/apps/solver/equation_store.cpp @@ -72,6 +72,7 @@ bool EquationStore::haveMoreApproximationSolutions(Context * context) { void EquationStore::approximateSolve(Poincare::Context * context) { assert(m_variables[0] != 0 && m_variables[1] == 0); + assert(m_type == Type::Monovariable); m_numberOfSolutions = 0; double start = m_intervalApproximateSolutions[0]; double step = (m_intervalApproximateSolutions[1]-m_intervalApproximateSolutions[0])*k_precision; @@ -93,6 +94,9 @@ EquationStore::Error EquationStore::exactSolve(Poincare::Context * context) { m_variables[0] = 0; int numberOfVariables = 0; for (int i = 0; i < numberOfDefinedModels(); i++) { + if (definedModelAtIndex(i)->standardForm(context) == nullptr) { + return Error::EquationUndefined; + } numberOfVariables = definedModelAtIndex(i)->standardForm(context)->getVariables(m_variables); if (numberOfVariables < 0) { return Error::TooManyVariables; diff --git a/apps/solver/equation_store.h b/apps/solver/equation_store.h index 03ccdf562..f761c72ab 100644 --- a/apps/solver/equation_store.h +++ b/apps/solver/equation_store.h @@ -16,9 +16,10 @@ public: }; enum class Error : int16_t { NoError = 0, - TooManyVariables = -1, - NonLinearSystem = -2, - RequireApproximateSolution = -3 + EquationUndefined = -1, + TooManyVariables = -2, + NonLinearSystem = -3, + RequireApproximateSolution = -4 }; EquationStore(); ~EquationStore(); diff --git a/apps/solver/list_controller.cpp b/apps/solver/list_controller.cpp index da8f148df..19f7b0022 100644 --- a/apps/solver/list_controller.cpp +++ b/apps/solver/list_controller.cpp @@ -147,6 +147,9 @@ void ListController::resolveEquations() { } EquationStore::Error e = m_equationStore->exactSolve(static_cast(app())->localContext()); switch (e) { + case EquationStore::Error::EquationUndefined: + app()->displayWarning(I18n::Message::UndefinedEquation); + return; case EquationStore::Error::TooManyVariables: app()->displayWarning(I18n::Message::TooManyVariables); return;