nub.ts 2.99 KiB
import { Debug, Result, Serie } from "./base"
import { Dichotomie } from "./dichotomie"
import { ComputeNode, ParamDefinition, IParamsEquation } from "./param"
/**
 * Classe abstraite de Noeud de calcul : classe de base pour tous les calculs
 */
export abstract class Nub extends ComputeNode {
    private _dichoStartIntervalMaxSteps: number = 100;
     * paramétrage de la dichotomie
    /**
    * étapes de recherche de l'intervalle de départ
    set dichoStartIntervalMaxSteps(n: number) {
        this._dichoStartIntervalMaxSteps = n;
    private checkParametersCalculability() {
        let res = [];
        for (let ps in this._prms) {
            let p: ParamDefinition = this._prms[ps];
            if (p.calculability == undefined)
                res.push(p.symbol);
        if (res.length > 0)
            throw 'Calculability of parameter(s) ' + res.toString() + ' has not been defined';
    /** 
     * Formule utilisée pour le calcul analytique (solution directe ou méthode de résolution spécifique)
    abstract Equation(sVarCalc: string): Result;
    /** 
     * Calcul d'une équation quelque soit l'inconnue à calculer
     * @param sVarCalc nom de la variable à calculer
     * @param rInit valeur initiale de la variable à calculer dans le cas de la dichotomie
     * @param rPrec précision de calcul
    Calc(sVarCalc: string, rInit: number = 0, rPrec: number = 0.001): Result {
        if (this._prms[sVarCalc].isAnalytical())
            return this.Equation(sVarCalc);
        return this.Solve(sVarCalc, rInit, rPrec);
    CalcSerie(svarCalc: string, serie: Serie): Result[] {
        /** @todo faire une boucle pour appeler this.Calc avec chaque valeur de serie.values
        // let results = [new (Result)];
        let results = [new Result(0)];
        return results;
    public getParameter(name: string): ParamDefinition {
        for (let ps in this._prms) {
            let p: ParamDefinition = this._prms[ps];
            if (p.symbol == name)
                return p;
        throw 'Nub.getParameter() : invalid parameter name ' + name;
71727374757677787980818283848586878889909192939495
} public getFirstAnalyticalParameter(): ParamDefinition { for (let ps in this._prms) { let p: ParamDefinition = this._prms[ps]; if (p.isAnalytical()) return p; } return undefined; } /** * Résoud l'équation par une méthode numérique * @param sVarCalc nom de la variable à calculer * @param rInit valeur initiale de la variable à calculer dans le cas de la dichotomie * @param rPrec précision de calcul */ Solve(sVarCalc: string, rInit: number, rPrec: number): Result { let dicho: Dichotomie = new Dichotomie(this, sVarCalc, this.DBG); dicho.startIntervalMaxSteps = this._dichoStartIntervalMaxSteps; var target = this.getFirstAnalyticalParameter(); return dicho.Dichotomie(target.v, rPrec, rInit); } }