[solver] If one equation is undefined, display a warning

This commit is contained in:
Émilie Feral
2018-06-07 10:21:43 +02:00
parent f6bdf56c15
commit bc8dbd85c1
9 changed files with 20 additions and 5 deletions

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -40,10 +40,12 @@ Expression * Equation::standardForm(Context * context) const {
Expression * e = expression(context);
if (e->type() == Expression::Type::Equal) {
m_standardForm = static_cast<const Equal *>(e)->standardEquation(*context);
} else {
} else if (e->type() == Expression::Type::Rational && static_cast<Rational *>(e)->isOne()) {
// The equality was reduced which means the equality was always true.
assert(e->type() == Expression::Type::Rational && static_cast<Rational *>(e)->isOne());
m_standardForm = new Rational(0);
} else {
// The equality has an undefined operand
assert(e->type() == Expression::Type::Undefined);
}
}
return m_standardForm;

View File

@@ -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;

View File

@@ -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();

View File

@@ -147,6 +147,9 @@ void ListController::resolveEquations() {
}
EquationStore::Error e = m_equationStore->exactSolve(static_cast<App *>(app())->localContext());
switch (e) {
case EquationStore::Error::EquationUndefined:
app()->displayWarning(I18n::Message::UndefinedEquation);
return;
case EquationStore::Error::TooManyVariables:
app()->displayWarning(I18n::Message::TooManyVariables);
return;