exercices/1e/1E12.js

import Exercice from '../Exercice.js'
import { mathalea2d } from '../../modules/2dGeneralites.js'
import { listeQuestionsToContenu, randint, combinaisonListes, rienSi1, ecritureAlgebrique, ecritureAlgebriqueSauf1, ecritureParentheseSiNegatif, texNombrec, lettreMinusculeDepuisChiffre, texNombre, miseEnEvidence, premierMultipleInferieur, premierMultipleSuperieur } from '../../modules/outils.js'
import { repere, courbe } from '../../modules/2d.js'
import { calcule } from '../../modules/fonctionsMaths.js'

export const titre = 'Trouver l\'équation d\'une parabole'

/**
 * @author Jean-Claude Lhote (modifié par EE pour corriger exo et remplacer Repere et Courbe par Repere2 et Courbe2 (juillet 2022))
 * Trois types de questions proposées :
 * 1) passant par trois dont deux d'abscisses opposées et le troisième d'abscisse 0 (pour simplifier la résolution du système)
 * 2) passant par un point et dont on connaît le sommet
 * 3) connaissant les deux racines et un autre point de passage à coordonnées entières
 * référence 1E12
 */
export const uuid = '392b3'
export const ref = '1E12'
export default function TrouverEquationParabole () {
  Exercice.call(this) // Héritage de la classe Exercice()
  this.titre = titre
  this.nbQuestions = 5
  this.nbCols = 1
  this.nbColsCorr = 1
  this.spacingCorr = 3
  this.sup = 4
  this.correctionDetailleeDisponible = true

  this.nouvelleVersion = function () {
    this.consigne = "Trouver l'expression de "
    this.consigne += this.nbQuestions > 1 ? 'chacune des fonctions suivantes.' : 'la fonction suivante.'
    const pixelsParCm = 20
    this.listeQuestions = [] // Liste de questions
    this.listeCorrections = [] // Liste de questions corrigées
    let typesDeQuestionsDisponibles
    if (this.sup < 4) typesDeQuestionsDisponibles = [parseInt(this.sup)]
    else typesDeQuestionsDisponibles = [1, 2, 2, 3, 3]
    const fName = []; let Ymin; let Yscale; let Ymax
    const listeTypeDeQuestions = combinaisonListes(typesDeQuestionsDisponibles, this.nbQuestions)
    for (let i = 0, texte, texteCorr, a, b, c, x1, x2, x3, f, r, svgYmin, svgYmax, F, cpt = 0; i < this.nbQuestions && cpt < 50;) {
      fName.push(lettreMinusculeDepuisChiffre(i + 6))
      texte = `Quelle est l'expression de la fonction polynomiale $\\mathscr{${fName[i]}}$ du second degré `
      texteCorr = ''
      switch (listeTypeDeQuestions[i]) {
        case 1 : // passe par 3 points à coordonnées entières dont -x1, 0 et x1.
          a = randint(-4, 4, 0)
          b = randint(-6, 6, 0)
          c = randint(-10, 10, 0)
          x1 = randint(1, 5)
          x2 = randint(-5, 5, x1)
          x3 = randint(-5, 5, [x1, x2])
          f = function (x) {
            return calcule(a * x ** 2 + b * x + c)
          }
          texte += `qui passe par les points de coordonnées $(${-x1};${f(-x1)})$, $(0;${f(0)})$ et $(${x1};${f(x1)})$ ?<br>`
          texteCorr = `Soit $\\mathscr{${fName[i]}}(x)=ax^2+bx+c$ , l'expression de la fonction cherchée, comme $\\mathscr{${fName[i]}}(0)=${f(0)}$ nous en déduisons que $c=${miseEnEvidence(f(0), 'red')}$.<br>`
          texteCorr += `Donc $\\mathscr{${fName[i]}}(x)=ax^2+bx${miseEnEvidence(ecritureAlgebrique(f(0)), 'red')}$.<br>`
          texteCorr += 'En substituant dans cette expression les valeurs de l\'énoncé, nous obtenons :<br>'
          texteCorr += `$\\begin{cases}
${f(x1)}=a\\times${x1}^2+b\\times${x1}${ecritureAlgebrique(f(0))}=${rienSi1(x1 ** 2)}a ${ecritureAlgebriqueSauf1(x1)}b ${ecritureAlgebrique(f(0))} \\\\
${f(-x1)}=a\\times(${-x1})^2+b\\times(${-x1})${ecritureAlgebrique(f(0))}=${rienSi1(x1 ** 2)}a ${ecritureAlgebriqueSauf1(-x1)}b ${ecritureAlgebrique(f(0))}
 \\end{cases}$<br>`
          if (this.correctionDetaillee) {
            texteCorr += `Ce qui équivaut à <br>$\\begin{cases}
 ${f(x1)}${ecritureAlgebrique(-f(0))}=${f(x1) - f(0)}=${rienSi1(x1 ** 2)}a ${ecritureAlgebriqueSauf1(x1)}b \\\\
 ${f(-x1)}${ecritureAlgebrique(-f(0))}=${f(-x1) - f(0)}=${rienSi1(x1 ** 2)}a ${ecritureAlgebriqueSauf1(-x1)}b
   \\end{cases}$<br>`
            texteCorr += `En ajoutant et en soustrayant les équations membre à membre, on obtient :<br>
$\\begin{cases}
${f(x1) + f(-x1) - 2 * f(0)}=${2 * x1 ** 2}a \\\\
${f(x1) - f(-x1)}=${2 * x1}b
 \\end{cases}$<br>`
          }
          texteCorr += `La résolution de ce système donne $a=${miseEnEvidence(texNombre(a), 'blue')}$ et $b=${miseEnEvidence(texNombre(b), 'green')}$.<br>`
          texteCorr += `D'où $\\mathscr{${fName[i]}}(x)=${miseEnEvidence(rienSi1(a), 'blue')}x^2 ${miseEnEvidence(ecritureAlgebriqueSauf1(b), 'green')}x  ${miseEnEvidence(ecritureAlgebrique(c), 'red')}$<br>`

          break
        case 2 : // Passant par le sommet (x1,y1) et par le point (x2,y2)
          a = randint(-3, 3, 0)
          b = randint(-3, 3, 0) * 2 * a
          c = randint(-10, 10)
          x1 = calcule(-b / (2 * a))
          x2 = randint(-5, 5, x1)
          x3 = randint(-5, 5, [x1, x2])

          f = function (x) {
            return calcule(a * x ** 2 + b * x + c)
          }
          texte += `dont la parabole a pour sommet le point de coordonnées $(${x1};${f(x1)})$ et passe par le point de coordonnées $(${x2};${f(x2)})$ ?<br>`
          texteCorr = `D'après les coordonnées $(${x1};${f(x1)})$ du sommet, $\\mathscr{${fName[i]}}$ a pour forme canonique : $\\mathscr{${fName[i]}}(x)=a(x${ecritureAlgebrique(-x1)})^2${ecritureAlgebrique(f(x1))}$.<br>`
          texteCorr += `De plus $\\mathscr{${fName[i]}}(${x2})=${f(x2)}$`
          if (this.correctionDetaillee) {
            texteCorr += ` donc $a(${x2}${ecritureAlgebrique(-x1)})^2${ecritureAlgebrique(f(x1))}=${f(x2)}$ `
            texteCorr += `soit $${x2 ** 2}a ${ecritureAlgebrique(-2 * x1 * x2)}a ${ecritureAlgebrique(x1 ** 2)}a ${ecritureAlgebrique(f(x1))}=${f(x2)}$.<br>`
            if (x2 ** 2 - 2 * x1 * x2 + x1 ** 2 !== 1) { texteCorr += `On en déduit que $a=\\dfrac{${f(x2)}${ecritureAlgebrique(-f(x1))}}{${(x2 ** 2 - 2 * x1 * x2 + x1 ** 2)}}=${a}$.<br>` } else { texteCorr += `On en déduit que $a=${f(x2)}${ecritureAlgebrique(-f(x1))}=${a}$.<br>` }
          } else texteCorr += ` donc $a=${a}$.<br>`
          if (this.correctionDetaillee) {
            texteCorr += `Développons la forme canonique : $\\mathscr{${fName[i]}}(x)=
  a(x${ecritureAlgebrique(-x1)})^2${ecritureAlgebrique(f(x1))}=
  a(x^2${miseEnEvidence(ecritureAlgebrique(-2 * x1), 'green')}x+${miseEnEvidence(texNombrec(x1 ** 2), 'red')})${miseEnEvidence(ecritureAlgebrique(f(x1)), 'red')}
  =${miseEnEvidence('a', 'blue')}x^2${miseEnEvidence(ecritureAlgebrique(-2 * x1) + 'a', 'green')}x${miseEnEvidence(ecritureAlgebriqueSauf1(x1 ** 2) + 'a' + ecritureAlgebrique(f(x1)), 'red')}$.<br>`
          }
          texteCorr += `En remplaçant $a$ par sa valeur $${a}$ dans l'expression canonique développée $${miseEnEvidence('a', 'blue')}x^2${miseEnEvidence(ecritureAlgebrique(-2 * x1) + 'a', 'green')}x${miseEnEvidence(ecritureAlgebriqueSauf1(x1 ** 2) + 'a' + ecritureAlgebrique(f(x1)), 'red')}$ on obtient :<br>`
          texteCorr += `$\\mathscr{${fName[i]}}(x)=${miseEnEvidence(rienSi1(a), 'blue')}x^2${miseEnEvidence(ecritureAlgebriqueSauf1(b), 'green')}x${miseEnEvidence(ecritureAlgebrique(c), 'red')}$`
          break
        case 3: // on a deux racines x1 et x2 et un troisième point (x3;f(x3))
          x1 = randint(-6, -1)
          x2 = randint(1, 6, -x1)
          x3 = randint(-5, 5, [x1, x2])
          a = randint(-4, 4, 0)
          b = calcule(-a * (x1 + x2))
          c = a * x1 * x2
          f = function (x) {
            return calcule(a * x ** 2 + b * x + c)
          }
          texte += `qui s'annule en $x=${x1}$ et en $x=${x2}$ et dont la parabole passe par le point de coordonnées $(${x3};${f(x3)})$ ?<br>`
          texteCorr += `Comme $${x1}$ et $${x2}$ sont les deux solutions de l'équation $\\mathscr{${fName[i]}}(x)=0$, on peut factoriser $\\mathscr{${fName[i]}}(x)$ :<br>`
          texteCorr += `$\\mathscr{${fName[i]}}(x)=a(x${ecritureAlgebrique(-x1)})(x${ecritureAlgebrique(-x2)})$.<br>`
          texteCorr += `Comme $\\mathscr{${fName[i]}}(${x3})=${f(x3)}$, on en déduit que `
          if (this.correctionDetaillee) {
            texteCorr += `$${f(x3)}=a(${x3}${ecritureAlgebrique(-x1)})(${x3}${ecritureAlgebrique(-x2)})$ `
            texteCorr += `d'où $a=${f(x3)}\\div ${ecritureParentheseSiNegatif((x3 - x1) * (x3 - x2))}=${a}$.<br>`
          } else texteCorr += `$a=${a}$.<br>`
          texteCorr += `On obtient ainsi $\\mathscr{${fName[i]}}(x)=${rienSi1(a)}(x${ecritureAlgebrique(-x1)})(x${ecritureAlgebrique(-x2)})$ ou en développant $\\mathscr{${fName[i]}}(x)=${rienSi1(a)}x^2 ${ecritureAlgebriqueSauf1(b)}x  ${ecritureAlgebrique(c)}$`
          break
      }
      if (a < 0) {
        Ymax = Math.ceil(f(-b / (2 * a)) + 2)
        Ymin = Math.min(f(x1), f(x2), f(x3), f(-x1), f(0), f(-6), f(6))
      } else {
        Ymin = Math.floor(f(-b / (2 * a)) - 2)
        Ymax = Math.max(f(x1), f(x2), f(x3), f(-x1), f(0), f(-6), f(6))
      }

      if (Ymax - Ymin < 10) Yscale = 2
      else Yscale = Math.max(1, calcule(Math.round(Math.ceil((Ymax - Ymin) / 10) / 5) * 5)) * 2
      r = repere({
        xMin: -10,
        yMin: premierMultipleInferieur(Yscale, Ymin) - Yscale,
        yMax: premierMultipleSuperieur(Yscale, Ymax) + Yscale,
        xMax: 10,
        yUnite: 1 / Yscale,
        yThickDistance: Yscale,
        grilleYDistance: Yscale,
        yLabelEcart: 0.8
      })

      svgYmin = Math.min(calcule(Ymin / Yscale), -1)
      svgYmax = Math.max(calcule(Ymax / Yscale), 1)
      F = x => a * x ** 2 + b * x + c
      texte += mathalea2d({ xmin: -10, xmax: 11, ymin: svgYmin, ymax: svgYmax + 2, pixelsParCm: pixelsParCm, scale: 0.6 }, courbe(F, { repere: r, xMin: -10, xMax: 10, color: 'blue', epaisseur: 1.5 }), r)
      if (this.questionJamaisPosee(i, a, b, c)) {
        this.listeQuestions.push(texte)
        this.listeCorrections.push(texteCorr)
        i++
      }
      cpt++
    }
    listeQuestionsToContenu(this)
  }
  this.besoinFormulaireNumerique = ['Type de questions ', 4, '1 : Passant par trois points à coordonnées entières 1\n2 : Connaissant le sommet et un point de passage\n3 : Connaissant les deux racines et un point de passage\n4 : Mélange des trois type de questions']
}