exercices/2e/2F10-4.js

import Exercice from '../Exercice.js'
import { mathalea2d } from '../../modules/2dGeneralites.js'

import { listeQuestionsToContenu, randint, choice, quotientier, combinaisonListes, ecritureParentheseSiNegatif, texFractionReduite, ecritureAlgebrique } from '../../modules/outils.js'
import { repere, point, tracePoint, labelPoint } from '../../modules/2d.js'
export const titre = 'Déterminer une fonction affine à partir de deux images'

/**
 * Déterminer une fonction affine à partir de deux images
* @author Stéphane Guyon
* 2F20
*/
export const uuid = 'ef897'
export const ref = '2F10-4'
export default function Determinerfonctionaffine () {
  'use strict'
  Exercice.call(this) // Héritage de la classe Exercice()
  this.titre = titre
  this.consigne = "Déterminer, en expliquant, l'expression de la fonction affine $f$ vérifiant les conditions de l'énoncé :"
  this.nbCols = 1
  this.nbColsCorr = 1
  this.spacing = 1
  this.spacingCorr = 1
  this.nbQuestions = 3
  this.sup = 1
  this.nouvelleVersion = function () {
    this.listeQuestions = [] // Liste de questions
    this.listeCorrections = [] // Liste de questions corrigées
    let typesDeQuestionsDisponibles = []
    if (this.sup === 1) {
      typesDeQuestionsDisponibles = [1] // on donne f(a)=b et f(c)=d
    }
    if (this.sup === 2) {
      typesDeQuestionsDisponibles = [2] // On donne 2 points A(a;b) et B(c;d) avec le graphique
    }
    if (this.sup === 3) {
      typesDeQuestionsDisponibles = [3] // On donne 2 points A(a;b) et B(c;d) sans le graphique
    }
    if (this.sup === 4) {
      typesDeQuestionsDisponibles = [1, 2, 3] // Mélange des cas précédents
    }

    const listeTypeDeQuestions = combinaisonListes(typesDeQuestionsDisponibles, this.nbQuestions)
    for (let i = 0, texte, texteCorr, cpt = 0, A, B, r, f, c, t, l, xA, xB, yA, yB, a, b, d, e, k, typesDeQuestions; i < this.nbQuestions && cpt < 50;) {
      typesDeQuestions = listeTypeDeQuestions[i]
      k = choice([-1, 1])
      a = randint(1, 5)
      a = a * k
      b = randint(1, 5)
      k = choice([-1, 1])
      b = b * k

      c = randint(1, 5, [a])
      k = choice([-1, 1])
      c = c * k
      if (a === c) { c = -c }// on évite deux antécédents identiques
      d = randint(1, 5)
      k = choice([-1, 1])
      d = d * k
      e = a * b - a * d
      f = a - c

      switch (typesDeQuestions) {
        case 1:
          texte = ` Déterminer l'expression algébrique de la fonction affine $f$ définie sur $\\mathbb R$, sachant que
                        $f(${a})=${b}$ et que $f(${c})=${d}$.`
          texteCorr = `On sait que $f$ est une fonction affine qui vérifie 
                        $f(${a})=${b}$ et $f(${c})=${d}$. <br>`
          texteCorr += 'Comme $f$ est une fonction affine, on sait d\'après le cours qu\'elle va s\'écrire sous la forme $f(x)= a x+ b$ avec $a$ et $b$ des nombres réels.<br>'
          texteCorr += 'L\'objectif est donc de déterminer $a$ et $b$.<br>'
          texteCorr += 'Or, on sait d\'après le cours, que dans ces conditions, avec $u\\neq v$, on a : '
          texteCorr += '$a=\\dfrac{f(u)-f(v)}{u-v}.$<br>'
          texteCorr += `On applique cette relation avec les données de l'énoncé : $u=${a}$ et  $v=${c}$ ,<br>`
          texteCorr += 'ce qui donne :  '
          texteCorr += `$a=\\dfrac{f(${a})-f(${c})}{${a}-${ecritureParentheseSiNegatif(c)}}=\\dfrac{${b}-${ecritureParentheseSiNegatif(d)}}{${a}-${ecritureParentheseSiNegatif(c)}}=\\dfrac{${b - d}}{${a - c}}$<br>`
          texteCorr += `d'où : $a=${texFractionReduite(b - d, a - c)}.$<br>`
          if (b === d) { // m=0 ; cas f constante
            texteCorr += '$f$ est une fonction constante, cas particulier des fonctions affines.<br>'
            texteCorr += `On a donc : $f(x)=${b}$`
          } else {
            texteCorr += 'On peut donc déjà déduire que la fonction $f$ s\'écrit sous la forme : '
            if ((b - d) / (a - c) === 1) { // m=1
              texteCorr += '$f(x)= x +b.$<br>'
            }
            if ((b - d) / (a - c) === -1) { // m=-1
              texteCorr += '$f(x)= -x +b.$<br>'
            }
            if (b - d !== a - c && b - d !== -a + c) { // cas général
              texteCorr += `   $f(x)=${texFractionReduite(b - d, a - c)} x +b.$<br>`
            }
            texteCorr += 'On cherche $b$ et pour cela on peut utiliser au choix une des deux données de l\'énoncé :<br>'
            texteCorr += `On prend par exemple : $f(${a})=${b}$  <br>`
            texteCorr += 'Comme'
            if ((b - d) / (a - c) === 1) { // cas où m=1
              texteCorr += '$f(x)= x +b.$<br>'
              texteCorr += `On en déduit que :$f(${a})=${a} +b=${b}$<br>`
              texteCorr += `$\\phantom{On en deduit que :}\\iff b=${b - a}$<br>`
              texteCorr += 'On peut conclure que '
              if (b + a !== 0) { texteCorr += `$f(x)= x ${ecritureAlgebrique(b - a)}.$<br>` } else { texteCorr += '$f(x)= x.$<br>' }
            }
            if ((b - d) / (a - c) === -1) { // m=-1
              texteCorr += '$f(x)= -x +b.$<br>'
              texteCorr += `On en déduit que :$f(${a})=${-a} +b=${b}$<br>`
              texteCorr += `$\\phantom{On en deduit que :}\\iff b=${b + a}$<br>`
              texteCorr += 'On peut conclure que '
              if (b + a !== 0) { texteCorr += `$f(x)= -x ${ecritureAlgebrique(b + a)}.$<br>` } else { texteCorr += '$f(x)= -x.$<br>' }
            }
            if (b - d !== a - c && b - d !== -a + c) { // cas général
              texteCorr += `   $f(x)=${texFractionReduite(b - d, a - c)} x +b.$<br>`
              texteCorr += `On en déduit que :$f(${a})=${texFractionReduite(b - d, a - c)} \\times ${ecritureParentheseSiNegatif(a)} +b=${b}$<br>`
              if (e * f > 0) { // on adapte selon le signe de la fraction, ici positive
                texteCorr += `$\\phantom{On en deduit que :}\\iff b=${b}-${texFractionReduite(e, f)}$<br>`
              } else { // ici négative, pour éviter -- p
                texteCorr += `$\\phantom{On en deduit que :}\\iff b=${b}-(${texFractionReduite(e, f)})$<br>`
              }
              texteCorr += `$\\phantom{On en deduit que :}\\iff b=${texFractionReduite(b * a - b * c - a * b + a * d, a - c)}$<br> `
              texteCorr += '<br>On peut conclure que '
              if ((b * a - b * c - a * b + a * d) * (a - c) > 0) { // cas où p>0
                texteCorr += `$f(x)=${texFractionReduite(b - d, a - c)}x+  ${texFractionReduite(b * a - b * c - a * b + a * d, a - c)}$`
              }
              if ((b * a - b * c - a * b + a * d) * (a - c) < 0) { // cas où p<0
                texteCorr += `$f(x)=${texFractionReduite(b - d, a - c)}x  ${texFractionReduite(b * a - b * c - a * b + a * d, a - c)}$`
              }
              if ((b * a - b * c - a * b + a * d) * (a - c) === 0) { // cas où p<0
                texteCorr += `$f(x)=${texFractionReduite(b - d, a - c)}x.$`
              }
            }
          }

          break
        case 2:

          r = repere()

          xA = randint(0, 3) * choice([-1, 1])// Abscisse de A
          yA = a * xA + b// Ordonnée de A
          xB = randint(0, 3, [xA]) * choice([-1, 1]) // Abscisse de B, différente de celle de A
          if (a * xB + b > 9) { // On évite de trop grandes valeurs pour yA
            xB = quotientier(xB, 2)
          }
          if (a * xB + b < -9) {
            xB = quotientier(xB, 2)
          }
          if (xB === xA) {
            xA = xA + 1
            xB = xB - 1
          }
          yB = a * xB + b// Ordonnée de B
          A = point(xA, yA, 'A', 'left')
          B = point(xB, yB, 'B', 'left')
          if (yA === 0) { A = point(xA, yA, 'A', 'above') }// éviter A sur l'axe des abscisses
          if (xB === 0) { B = point(xB, yB, 'B', 'right') }// éviter A sur l'axe des abscisses
          if (xA === 0) { A = point(xA, yA, 'A', 'right') }// éviter A sur l'axe des abscisses
          if (yB === 0) { B = point(xB, yB, 'B', 'above') }// éviter A sur l'axe des abscisses

          t = tracePoint(A, B, 'red') // Variable qui trace les points avec une croix
          l = labelPoint(A, B, 'red')// Variable qui trace les noms A et B
          texte = 'Déterminer, en détaillant les calculs, l\'expression algébrique de la fonction affine $f$ dont la représentation<br>'
          texte += `graphique passe par les points $A(${xA};${yA})$ et $B(${xB};${yB})$ représentés ci-dessous :<br>`
          texte += mathalea2d({
            xmin: -6,
            ymin: -10,
            xmax: 6,
            ymax: 10
          }, r, t, l)
          a = xA
          b = yA
          c = xB
          d = yB
          texteCorr = `Les points $A(${xA};${yA})$ et $B(${xB};${yB})$ appartiennent à la courbe représentative de $f$<br>`

          texteCorr += `Comme $A(${xA};${yA})\\in \\mathcal{C_f}$, on a  $f(${a})=${b}$  et comme $B(${xB};${yB})\\in \\mathcal{C_f}$, on a $f(${c})=${d}$ <br>`
          texteCorr += 'Comme $f$ est une fonction affine, on sait d\'après le cours qu\'elle va s\'écrire sous la forme $f(x)= a x+ b$ avec $a$ et $b$ des nombres réels.<br>'
          texteCorr += 'L\'objectif est donc de déterminer $a$ et $b$.<br>'
          texteCorr += 'Or, on sait d\'après le cours, que dans ces conditions, avec $u\\neq v$, on a : '
          texteCorr += '$a=\\dfrac{f(u)-f(v)}{u-v}.$<br>'
          texteCorr += `On applique cette relation avec les données de l'énoncé : $u=${a}$ et  $v=${c}$ ,<br>`
          texteCorr += 'ce qui donne : '
          texteCorr += `$a=\\dfrac{f(${a})-f(${c})}{${a}-${ecritureParentheseSiNegatif(c)}}=\\dfrac{${b}-${ecritureParentheseSiNegatif(d)}}{${a}-${ecritureParentheseSiNegatif(c)}}=\\dfrac{${b - d}}{${a - c}}$<br>`
          texteCorr += `d'où : $a=${texFractionReduite(b - d, a - c)}.$<br>`
          if (b === d) {
            texteCorr += '$f$ est une fonction constante, cas particulier des fonctions affines.<br>'
            texteCorr += `On a donc : $f(x)=${b}$`
          } else {
            texteCorr += 'On peut donc déjà déduire que la fonction $f$ s\'écrit sous la forme : '
            if ((b - d) / (a - c) === 1) {
              texteCorr += '$f(x)= x +b.$<br>'
            }
            if ((b - d) / (a - c) === -1) {
              texteCorr += '$f(x)= -x +b.$<br>'
            }
            if (b - d !== a - c && b - d !== -a + c) { // cas général
              texteCorr += `   $f(x)=${texFractionReduite(b - d, a - c)} x +b.$<br>`
            }
            texteCorr += 'On cherche $b$ et pour cela on peut utiliser au choix une des deux données de l\'énoncé :<br>'
            texteCorr += `On prend par exemple : $f(${a})=${b}$  <br>`
            texteCorr += 'Comme'
            if ((b - d) / (a - c) === 1) {
              texteCorr += '$f(x)= x +b.$<br>'
            }
            if ((b - d) / (a - c) === -1) {
              texteCorr += '$f(x)= -x +b.$<br>'
            }
            if (b - d !== a - c && b - d !== -a + c) { // cas général
              texteCorr += `   $f(x)=${texFractionReduite(b - d, a - c)} x +b.$<br>`
            }
            texteCorr += `On en déduit que :$f(${a})=${texFractionReduite(b - d, a - c)} \\times ${a} +b=${b}$<br>`
            texteCorr += `$\\phantom{On en deduit que :}\\iff b=${b}-${texFractionReduite(e, f)}$<br>`
            texteCorr += `$\\phantom{On en deduit que :}\\iff b=${texFractionReduite(b * a - b * c - a * b + a * d, a - c)}$<br> `
            texteCorr += 'On peut conclure que '
            if (b - d === a - c) { // cas où a=1
              if ((b * a - b * c - a * b + a * d) * (a - c) > 0) {
                texteCorr += `$f(x)= x +${texFractionReduite(b * a - b * c - a * b + a * d, a - c)}.$<br>`
              } else {
                if (b * a - b * c === a * b + a * d) { // cas où b=0
                  texteCorr += '$f(x)= x.$<br>'
                }
                texteCorr += `$f(x)= x ${texFractionReduite(b * a - b * c - a * b + a * d, a - c)}.$<br>`
              }
            }
            if (b - d === -a + c) { // cas où a=-1
              if ((b * a - b * c - a * b + a * d) * (a - c) > 0) { // b>0
                texteCorr += `$f(x)= -x +${texFractionReduite(b * a - b * c - a * b + a * d, a - c)}.$<br>`
              } else {
                if (a * d - b * c === 0) { // cas où b=0
                  texteCorr += '$f(x)= -x.$<br>'
                } else texteCorr += `$f(x)= -x ${texFractionReduite(b * a - b * c - a * b + a * d, a - c)}.$<br>`
              }
            }
            if (b - d !== a - c && b - d !== -a + c) { // cas général
              if ((b * a - b * c - a * b + a * d) * (a - c) > 0) { // cas où b>0
                texteCorr += `$f(x)=${texFractionReduite(b - d, a - c)}x+  ${texFractionReduite(b * a - b * c - a * b + a * d, a - c)}$`
              } else { // cas où b<0
                texteCorr += `$f(x)=${texFractionReduite(b - d, a - c)}x  ${texFractionReduite(b * a - b * c - a * b + a * d, a - c)}$`
              }
            }
          }

          break
        case 3:

          xA = randint(0, 3) * choice([-1, 1])// Abscisse de A
          yA = a * xA + b// Ordonnée de A
          xB = randint(0, 3, [xA]) * choice([-1, 1]) // Abscisse de B, différente de celle de A
          if (a * xB + b > 9) { // On évite de trop grandes valeurs pour yA
            xB = quotientier(xB, 2)
          }
          if (a * xB + b < -9) {
            xB = quotientier(xB, 2)
          }
          if (xB === xA) {
            xA = xA + 1
            xB = xB - 1
          }
          yB = a * xB + b// Ordonnée de B
          A = point(xA, yA, 'A', 'left')
          B = point(xB, yB, 'B', 'left')
          if (yA === 0) { A = point(xA, yA, 'A', 'above') }// éviter A sur l'axe des abscisses
          if (xB === 0) { B = point(xB, yB, 'B', 'right') }// éviter A sur l'axe des abscisses
          if (xA === 0) { A = point(xA, yA, 'A', 'right') }// éviter A sur l'axe des abscisses
          if (yB === 0) { B = point(xB, yB, 'B', 'above') }// éviter A sur l'axe des abscisses

          texte = 'Déterminer, en détaillant les calculs, l\'expression algébrique de la fonction affine $f$ dont la représentation<br>'
          texte += `graphique passe par les points $A(${xA};${yA})$ et $B(${xB};${yB})$.<br>`

          texteCorr = `Les points $A(${xA};${yA})$ et $B(${xB};${yB})$ appartiennent à la courbe représentative de $f$<br>`

          texteCorr += `Comme $A(${xA};${yA})\\in \\mathcal{C_f}$, on a  $f(${a})=${b}$  et comme $B(${xB};${yB})\\in \\mathcal{C_f}$, on a $f(${c})=${d}$ <br>`
          texteCorr += 'Comme $f$ est une fonction affine, on sait d\'après le cours qu\'elle va s\'écrire sous la forme $f(x)= a x+ b$ avec $a$ et $b$ des nombres réels.<br>'
          texteCorr += 'L\'objectif est donc de déterminer $a$ et $b$.<br>'
          texteCorr += 'Or, on sait d\'après le cours, que dans ces conditions, avec $u\\neq v$, on a :'
          texteCorr += '$a=\\dfrac{f(u)-f(v)}{u-v}.$<br>'
          texteCorr += `On applique cette relation avec les données de l'énoncé : $u=${a}$ et  $v=${c}$ ,<br>`
          texteCorr += 'ce qui donne :'
          texteCorr += `$a=\\dfrac{f(${a})-f(${c})}{${a}-${ecritureParentheseSiNegatif(c)}}=\\dfrac{${b}-${ecritureParentheseSiNegatif(d)}}{${a}-${ecritureParentheseSiNegatif(c)}}=\\dfrac{${b - d}}{${a - c}}$<br>`
          texteCorr += `d'où : $a=${texFractionReduite(b - d, a - c)}.$<br>`
          if (b === d) {
            texteCorr += '$f$ est une fonction constante, cas particulier des fonctions affines.<br>'
            texteCorr += `On a donc : $f(x)=${b}$`
          } else {
            texteCorr += 'On peut donc déjà déduire que la fonction $f$ s\'écrit sous la forme : '
            if ((b - d) / (a - c) === 1) {
              texteCorr += '$f(x)= x +b.$<br>'
            }
            if ((b - d) / (a - c) === -1) {
              texteCorr += '$f(x)= -x +b.$<br>'
            }
            if (b - d !== a - c && b - d !== -a + c) { // cas général
              texteCorr += `   $f(x)=${texFractionReduite(b - d, a - c)} x +b.$<br>`
            }
            texteCorr += 'On cherche $b$ et pour cela on peut utiliser au choix une des deux données de l\'énoncé :<br>'
            texteCorr += `On prend par exemple : $f(${a})=${b}$  <br>`
            texteCorr += 'Comme'
            if ((b - d) / (a - c) === 1) {
              texteCorr += '$f(x)= x +b.$<br>'
            }
            if ((b - d) / (a - c) === -1) {
              texteCorr += '$f(x)= -x +b.$<br>'
            }
            if (b - d !== a - c && b - d !== -a + c) { // cas général
              texteCorr += `   $f(x)=${texFractionReduite(b - d, a - c)} x +b.$<br>`
            }
            texteCorr += `On en déduit que :$f(${a})=${texFractionReduite(b - d, a - c)} \\times ${a} +b=${b}$<br>`
            texteCorr += `$\\phantom{On en deduit que :}\\iff b=${b}-${texFractionReduite(e, f)}$<br>`
            texteCorr += `$\\phantom{On en deduit que :}\\iff b=${texFractionReduite(b * a - b * c - a * b + a * d, a - c)}$<br> `
            texteCorr += 'On peut conclure que '
            if (b - d === a - c) { // cas où a=1
              if ((b * a - b * c - a * b + a * d) * (a - c) > 0) {
                texteCorr += `$f(x)= x +${texFractionReduite(b * a - b * c - a * b + a * d, a - c)}.$<br>`
              } else {
                if (b * a - b * c === a * b + a * d) { // cas où b=0
                  texteCorr += '$f(x)= x.$<br>'
                }
                texteCorr += `$f(x)= x ${texFractionReduite(b * a - b * c - a * b + a * d, a - c)}.$<br>`
              }
            }
            if (b - d === -a + c) { // cas où a=-1
              if ((b * a - b * c - a * b + a * d) * (a - c) > 0) { // b>0
                texteCorr += `$f(x)= -x +${texFractionReduite(b * a - b * c - a * b + a * d, a - c)}.$<br>`
              } else {
                if (a * d - b * c === 0) { // cas où b=0
                  texteCorr += '$f(x)= -x.$<br>'
                } else texteCorr += `$f(x)= -x ${texFractionReduite(b * a - b * c - a * b + a * d, a - c)}.$<br>`
              }
            }
            if (b - d !== a - c && b - d !== -a + c) { // cas général
              if ((b * a - b * c - a * b + a * d) * (a - c) > 0) { // cas où b>0
                texteCorr += `$f(x)=${texFractionReduite(b - d, a - c)}x+  ${texFractionReduite(b * a - b * c - a * b + a * d, a - c)}$`
              } else { // cas où b<0
                texteCorr += `$f(x)=${texFractionReduite(b - d, a - c)}x  ${texFractionReduite(b * a - b * c - a * b + a * d, a - c)}$`
              }
            }
          }

          break
      }
      if (this.questionJamaisPosee(i, k, a, b, c, d, e)) {
        // Si la question n'a jamais été posée, on en créé une autre
        this.listeQuestions.push(texte)
        this.listeCorrections.push(texteCorr)
        i++
      }
      cpt++
    }
    listeQuestionsToContenu(this)
  }
  this.besoinFormulaireNumerique = ['Niveau de difficulté', 4, '1 :Avec deux images\n 2 : Avec deux points et un repère\n 3 : Avec deux points sans repère\n 4 : Mélange des cas précédents']
}