exercices/3e/3F12-4.js

import Exercice from '../Exercice.js'
import { mathalea2d } from '../../modules/2dGeneralites.js'
import Decimal from 'decimal.js'
import { context } from '../../modules/context.js'
import { listeQuestionsToContenuSansNumero, randint, abs, resolutionSystemeLineaire2x2, resolutionSystemeLineaire3x3, chercheMinMaxFonction, nombreDeChiffresDansLaPartieEntiere } from '../../modules/outils.js'
import { setReponse } from '../../modules/gestionInteractif.js'
import { ajouteChampTexteMathLive } from '../../modules/interactif/questionMathLive.js'
import { courbe, repere } from '../../modules/2d.js'
export const titre = 'Lire l\'image d\'un nombre à partir d\'un graphique'
export const interactifReady = true
export const interactifType = 'mathLive'
export const amcReady = true
export const amcType = 'AMCHybride'

/**
* Un graphique étant tracé, déterminer l'image de nombres donnés.
* La fonction est un polynôme de degré 1, 2 ou 3 et les nombres des questions ne sont que des entiers.
*
* @author Rémi Angot
* 3F12-4
*/
export const uuid = 'b8946'
export const ref = '3F12-4'
export default function ImageGraphique () {
  Exercice.call(this) // Héritage de la classe Exercice()
  this.titre = titre
  this.consigne = ''
  this.sup = 3
  this.spacing = 1
  context.isHtml ? this.spacingCorr = 3 : this.spacingCorr = 1
  this.nbQuestions = 1
  this.pointsParQuestions = 3
  this.nbQuestionsModifiable = false
  this.nbCols = 1

  this.nouvelleVersion = function (numeroExercice) {
    this.listeQuestions = [] // Liste de questions
    this.listeCorrections = [] // Liste de questions corrigées
    this.autoCorrection = []

    this.contenu = '' // Liste de questions
    this.contenuCorrection = '' // Liste de questions corrigées
    this.sup = parseInt(this.sup)
    let a, b, c, d, x1, x2, x3, fx1, fx2, fx3, numa, dena, numb, denb, numc, denc, ymax, f

    function initialiseVariables () {
      x1 = randint(-6, -3)
      x2 = randint(x1 + 3, 2)
      x3 = randint(x2 + 2, 8)
      fx1 = randint(-5, 5)
      fx2 = randint(-6, 6)
      fx3 = randint(-5, 5)
      d = randint(-5, 5)
      c = randint(-5, 5)
      ymax = 7
    };

    initialiseVariables()

    let texte = 'On a tracé ci-dessous la courbe représentative de la fonction $f$.<br>'; let texteCorr = ''
    const r = repere({ xMin: -7, xMax: 9, yMin: -7, yMax: 7 })
    if (this.sup === 1) {
      a = new Decimal(fx2 - fx1).div(x2 - x1)
      b = a.mul(x1).sub(fx1)
      f = x => a * x - b

      texte += `Déterminer par lecture graphique les images de $${x1}$ et de $${x2}$ par cette fonction $f$.<br>`
      texteCorr = `L'image de $${x1}$ est $${fx1}$, on note $f(${x1})=${fx1}$.<br>`
      texteCorr += `L'image de $${x2}$ est $${fx2}$, on note $f(${x2})=${fx2}$.`
    }

    if (this.sup === 2) {
      x1 = randint(-6, -3)
      x3 = randint(1, 6)
      fx1 = randint(-5, 5)
      fx3 = randint(-6, 6, c);
      [[numa, dena], [numb, denb]] = resolutionSystemeLineaire2x2(x1, x3, fx1, fx3, c)
      while (dena === 0 || denb === 0 || numa === 0) {
        x1 = randint(-6, -3)
        x3 = randint(1, 6)
        fx1 = randint(-5, 5)
        fx3 = randint(-6, 6, c)
        ;[[numa, dena], [numb, denb]] = resolutionSystemeLineaire2x2(x1, x3, fx1, fx3, c)
      }
      a = new Decimal(numa).div(dena)
      b = new Decimal(numb).div(denb)
      x2 = 0
      fx2 = c

      f = x => a * x ** 2 + b * x + c
    }

    if (this.sup === 3) {
      [[numa, dena], [numb, denb], [numc, denc]] = resolutionSystemeLineaire3x3(x1, x2, x3, fx1, fx2, fx3, d)
      let [extremum1, extremum2] = chercheMinMaxFonction([numa / dena, numb / denb, numc / denc, d])
      while (dena === 0 || denb === 0 || denc === 0 || abs(extremum1[1]) > ymax || abs(extremum2[1]) > ymax) {
        initialiseVariables();
        [[numa, dena], [numb, denb], [numc, denc]] = resolutionSystemeLineaire3x3(x1, x2, x3, fx1, fx2, fx3, d)
        if (chercheMinMaxFonction([numa / dena, numb / denb, numc / denc, d]) === []) {
          [extremum1, extremum2] = [[0, 999], [0, 999]]
        } else {
          [extremum1, extremum2] = chercheMinMaxFonction([numa / dena, numb / denb, numc / denc, d])
        }
      }
      a = new Decimal(numa).div(dena)
      b = new Decimal(numb).div(denb)
      c = new Decimal(numc).div(denc)

      f = x => a * x ** 3 + b * x ** 2 + c * x + d
    }

    if (this.sup === 2 || this.sup === 3) {
      texte += `Déterminer par lecture graphique les images de $${x1}$, de $${x2}$ et de $${x3}$ par cette fonction $f$.<br>`
      texteCorr = `L'image de $${x1}$ est $${fx1}$, on note $f(${x1})=${fx1}$.<br>`
      texteCorr += `L'image de $${x2}$ est $${fx2}$, on note $f(${x2})=${fx2}$.<br>`
      texteCorr += `L'image de $${x3}$ est $${fx3}$, on note $f(${x3})=${fx3}$.<br>`
    }
    const C = courbe(f, { repere: r, step: 0.25 })
    texte += mathalea2d({ xmin: -7.5, xmax: 9.5, ymin: -7.5, ymax: 7.5, scale: 0.6 }, r, C)

    if (context.isAmc) {
      this.autoCorrection[0] = {
        enonce: texte,
        propositions: [
          {
            type: 'AMCNum',
            propositions: [{
              texte: `L'image de $${x1}$ est $${fx1}$, on note $f(${x1})=${fx1}$.\\\\`,
              statut: '',
              reponse: {
                texte: `$f(${x1})$`,
                valeur: fx1,
                param: {
                  digits: nombreDeChiffresDansLaPartieEntiere(fx1),
                  decimals: 0,
                  signe: true,
                  approx: 0
                }
              }
            }]
          },
          {
            type: 'AMCNum',
            propositions: [{
              texte: `L'image de $${x2}$ est $${fx2}$, on note $f(${x2})=${fx2}$.\\\\`,
              statut: '',
              reponse: {
                texte: `$f(${x2})$`,
                valeur: fx2,
                param: {
                  digits: nombreDeChiffresDansLaPartieEntiere(fx2),
                  decimals: 0,
                  signe: true,
                  approx: 0
                }
              }
            }]
          },
          {
            type: 'AMCNum',
            propositions: [{
              texte: `L'image de $${x3}$ est $${fx3}$, on note $f(${x3})=${fx3}$.\\\\`,
              statut: '',
              reponse: {
                texte: `$f(${x3})$`,
                valeur: fx3,
                param: {
                  digits: nombreDeChiffresDansLaPartieEntiere(fx3),
                  decimals: 0,
                  signe: true,
                  approx: 0
                }
              }
            }]
          }
        ]
      }
    } else if (this.interactif) {
      if (this.sup === 1) {
        texte += `$f(${x1})=$` + ajouteChampTexteMathLive(this, 0, 'largeur25 inline')
        texte += `$f(${x2})=$` + ajouteChampTexteMathLive(this, 1, 'largeur25 inline')
        setReponse(this, 0, f(x1))
        setReponse(this, 1, f(x1))
      } else {
        texte += `<br><br>$f(${x1})=$` + ajouteChampTexteMathLive(this, 0, 'largeur25 inline')
        texte += `<br><br>$f(${x2})=$` + ajouteChampTexteMathLive(this, 1, 'largeur25 inline')
        texte += `<br><br>$f(${x3})=$` + ajouteChampTexteMathLive(this, 2, 'largeur25 inline')
        setReponse(this, 0, f(x1))
        setReponse(this, 1, f(x2))
        setReponse(this, 2, f(x3))
      }
    }
    this.listeQuestions.push(texte)
    this.listeCorrections.push(texteCorr)
    listeQuestionsToContenuSansNumero(this)
  }

  this.besoinFormulaireNumerique = ['Type de fonction', 3, '1 : Affine\n2 : Polynome du 2nd degré\n3 : Polynome du 3e degré']
}