objets/CAppelFonctionInterneNVar.js

/*
 * MathGraph32 Javascript : Software for animating online dynamic mathematics figures
 * https://www.mathgraph32.org/
 * @Author Yves Biton (yves.biton@sesamath.net)
 * @License: GNU AGPLv3 https://www.gnu.org/licenses/agpl-3.0.html
 */
import CCb from './CCb'
import CCbGlob from '../kernel/CCbGlob'
import Complexe from 'src/types/Complexe.js'

export default CAppelFonctionInterneNVar
/**
 * @constructor
 * @extends CCb
 * Objet d'un arbre binaire de calcul représentant un appel de fonction interne
 * à n variables.
 * Utilisé dans les calculs de dérivées et dérivées partielles.
 * @param {CCb} fonctionInterne  Pointe sur la fonction à appliquer.
 * @param {CCb[]} operandes  Pointe sur l'opérande
 * @returns {CAppelFonctionInterneNVar}
 */
function CAppelFonctionInterneNVar (fonctionInterne, operandes) {
  CCb.call(this, fonctionInterne.listeProprietaire)
  /** @type {CCb} */
  this.fonctionInterne = fonctionInterne
  /** @type {CCb[]} */
  this.operandes = operandes
}
CAppelFonctionInterneNVar.prototype = new CCb()
CAppelFonctionInterneNVar.prototype.constructor = CAppelFonctionInterneNVar
CAppelFonctionInterneNVar.prototype.superClass = 'CCb'
CAppelFonctionInterneNVar.prototype.className = 'CAppelFonctionInterneNVar'

CAppelFonctionInterneNVar.prototype.nature = function () {
  return CCbGlob.natAppelFonctionInterneNVar
}

CAppelFonctionInterneNVar.prototype.resultat = function (infoRandom) {
  const nvar = this.operandes.length
  const d = new Array(nvar)
  for (let i = 0; i < nvar; i++) d[i] = this.operandes[i].resultat(infoRandom)
  return this.fonctionInterne.resultatFonction(infoRandom, d)
}

CAppelFonctionInterneNVar.prototype.resultatFonction = function (infoRandom, valeurParametre) {
  const nvar = this.operandes.length
  const d = new Array(nvar)
  for (let i = 0; i < nvar; i++) d[i] = this.operandes[i].resultatFonction(infoRandom, valeurParametre)
  return this.fonctionInterne.resultatFonction(infoRandom, d)
}

// Comme une fonction complexe de plusieurs variables peut utiliser la formule d'une fonction réelle d'une variable réelle
// d'une ou plusieurs variables il faut aussi définir les deux fonctions suivantes
CAppelFonctionInterneNVar.prototype.resultatComplexe = function (infoRandom, zRes) {
  const nvar = this.operandes.length
  const z1 = new Array(nvar)
  for (let i = 0; i < nvar; i++) z1[i] = new Complexe()
  for (let i = 0; i < nvar; i++) this.operandes[i].resultatComplexe(infoRandom, z1[i])
  return this.fonctionInterne.resultatComplexe(infoRandom, z1, zRes)
}

CAppelFonctionInterneNVar.prototype.resultatFonctionComplexe = function (infoRandom, valeurParametre, zRes) {
  const nvar = this.operandes.length
  const z1 = new Array(nvar)
  for (let i = 0; i < nvar; i++) z1[i] = new Complexe()
  for (let i = 0; i < nvar; i++) this.operandes[i].resultatFonctionComplexe(infoRandom, valeurParametre, z1[i])
  this.fonctionInterne.resultatFonctionComplexe(infoRandom, z1, zRes)
}

CAppelFonctionInterneNVar.prototype.getCore = function () {
  return this.fonctionInterne.getCore()
}

CAppelFonctionInterneNVar.prototype.getCopie = function () {
  const nvar = this.operandes.length
  const tab = new Array(nvar)
  for (let i = 0; i < nvar; i++) tab[i] = this.operandes[i].getCopie()
  return new CAppelFonctionInterneNVar(this.fonctionInterne.getCopie(), this.operandes)
}

CAppelFonctionInterneNVar.prototype.dependDeVariable = function (ind) {
  let res = false
  const nvar = this.operandes.length
  for (let i = 0; i < nvar; i++) {
    res = res || (this.fonctionInterne.dependDeVariable(i) && this.operandes[i].dependDeVariable(ind))
  }
  return res
}

CAppelFonctionInterneNVar.prototype.estConstant = function () {
  let res = false
  const nvar = this.operandes.length
  for (let i = 0; i < nvar; i++) {
    res = res || this.operandes[i].estConstant()
  }
  return res
}

CAppelFonctionInterneNVar.prototype.deriveePossible = function (indiceVariable) {
  let b = true
  for (let i = 0; (i < this.operandes.length) && b; i++) {
    if (this.operandes[i].dependDeVariable(indiceVariable)) { b = this.fonctionInterne.deriveePossible(i) && this.operandes[i].deriveePossible(indiceVariable) }
  }
  return b
}

CAppelFonctionInterneNVar.prototype.calculAvecValeursRemplacees = function (bfrac) {
  const nbvar = this.fonctionInterne.nombreVariables()
  const tabcal = new Array(this.fonctionInterne.nombreVariables())
  for (let i = 0; i < nbvar; i++) {
    tabcal[i] = this.operandes[i].calculAvecValeursRemplacees(bfrac)
  }
  return new CAppelFonctionInterneNVar(this.fonctionInterne, tabcal)
}

// Pour cette classe, isCalcVect renvoie fausse par défaut
CAppelFonctionInterneNVar.prototype.isCalcOK4Vect = function (tabNames) {
  const nbvar = this.fonctionInterne.nombreVariables()
  for (let i = 0; i < nbvar; i++) {
    if (!this.operandes[i].isCalcVect(tabNames) && !this.operandes[i].isVectNul()) return false
  }
  return true
}