Esempio n. 1
0
     def __init__(self):
         #     .MODEL KT315 NPN (IS=10F BF=584.517 VAF=100 IKF=29.2714M ISE=131.803P
         # 3:  + NE=2.08337 BR=1.95214 IKR=9.99996M ISC=100.316P RE=0 RC=0 RB=0
         # 4:  + CJE=27.3893P VJE=700.001M MJE=500.287M CJC=27.3893P VJC=700.001M
         # 5:  + MJC=500.287M TF=450.287P XTF=499.984M VTF=10 ITF=10.2268M TR=153.383P)
         #
        Fianora_MainScripts.AbstractMainScript.__init__(self)
        self.options.verbose = 1
        self.options.verbose_wrapper = 1

        inf=10e10
        #числовые значения изменены шоб было по 7 значимых
        IS = 11.23456e-15
        BF = 584.5171
        VAF = 112.3456
        VAR = inf
        IKF =  29.27141e-3     # ток перехода к высококу уровню инжекции inf
        ISE = 131.8031e-12      # генерационно-рекомбинационный ток насыщения  эмиттерного перех 0
        NE = 2.083371       # коэфф. неидеальности ген-рек тока эмиттерного перех   1
        NR = 1       # коэфф неидеальности для диффузного тока в инв режиме  1
        NF = 1       # коэфф неидеальности для диффузионного тока в нормальном режиме        1
        NC = 1       # коэфф неидеальности генерационно-рекомбинацоинного тока коллектора    1
        BR = 1.952141      # инверсный коэфф усиления тока в схеме с ОЭ 1
        IKR = 9.999961e-3     # ток перехода к высокому уровню инжекции в инверсном включении inf
        ISC = 100.3161e-12     # генерационно-рекомбинационный ток насыщения колекторного перех 0
        RE = 1      # сопротивления эмиттера, коллектора, базы 0 0 0
        RC = 5.48635
        RB = 0
        parameter_str_list = ['IS', 'BF', 'NR', 'NF', 'BR']     # список параметров
        btrue = [IS, BF, NR, NF, BR]
        Ve = np.diag([1.9e-5]*3)
        bstart = np.array(btrue)-np.array(btrue)*0.3
        bend = np.array(btrue)+np.array(btrue)*0.3
        binit = f_sf.uniformVector(bstart, bend)
        xstart = np.array([0.001, 0.001])
        xend = np.array([1, 1])
        N = 30

        self.ec = f_sf.EstimationContext(bstart, bend, btrue, binit, xstart, xend, Ve, N) #упаковывание в контекст
        self.model = f_m.StringEMTransistorModel ('Q_NPN_KT513')



        self.measurer = f_me.ModelMeasurer(self.ec.Ve, self.model, self.ec.btrue) # сделали измерителя
        self.plan_measurer = f_me.PlanMeasurer(self.measurer) # сделали измеритель по плану
        self.planner = f_p.UniformPlanner(self.ec)

        #формирование цепочки
        self.estimator = f_e.NGEstimator()

        self.measdata=None

        self.plan = self.planner.give_us_a_plan(nocache = True) # чтоб каждый раз не менять план, как оно делается,
def main_diode():
    """
    Главная функция, осуществляющая эксперимент
    :return:
    """
    bstart = [6.15200000e-08, 1.16000000e00, 3.37600000e-02]  # 20%
    bend = [9.22800000e-08, 1.74000000e00, 5.06400000e-02]  # 20%

    #    bstart = [  4.61400000e-08,   8.70000000e-01,   2.53200000e-02]  # 40%
    #   bend = [  1.07660000e-07,   2.03000000e+00,   5.90800000e-02]  # 40%

    iia = IterationInfoAcceptor("resfiles/M1_Diode.txt", verbose=1)

    msa = DiodeMainScriptMantissaEx1()

    for i in range(50):

        btrue1 = f_sf.rangomNormalvariateVector(bstart, bend)

        # msa.ec.btrue = btrue1
        msa.ec.bstart = bstart
        msa.ec.bend = bend

        try:
            rs = msa.proceed()
            iia.accept(numiter=rs["numiter"], Sk=rs["Sk"], AvDif=rs["AvDif"])

        except:
            print("uno problemo")
            pass

    plt.hist([x["numiter"] for x in iia], 20)
    plt.show()
    plt.savefig("resfiles/MantissaResDiode.png")
Esempio n. 3
0
def test():
    #dm = TransistorMainScript()
    dm = DiodeMainScript()

    #http://habrahabr.ru/post/157537/ - как накрутить производительность с помощью ctypes

    with f_sf.Profiler() as p:
        #print (dm.proceed(nocacheplan=False))
        dm.proceed(nocacheplan=False)
Esempio n. 4
0
    def __init__(self):

        AbstractMainScript.__init__(self)

        _btrue = [
            7.69e-8, 1.45, .0422
        ]  #номинальные значения диода D1N4001 с сайта, вроде официальной модели производителя
        Ve = np.array([[1.9e-5]])
        bstart = np.array(_btrue) - np.array(_btrue) * 0.2
        bend = np.array(_btrue) + np.array(_btrue) * 0.2

        binit = _btrue

        btrue = f_sf.rangomNormalvariateVector(bstart, bend)
        print(btrue)
        #btrue = _btrue

        xstart = [0.001]
        xend = [1]
        N = 100
        self.ec = f_sf.EstimationContext(bstart, bend, btrue, binit, xstart,
                                         xend, Ve, N)

        self.model = f_m.SimpleDiodeModel('Diode_1N')  # сделали модель
        self.ec.model = self.model

        self.measurer = f_me.ModelMeasurer(self.ec.Ve, self.model,
                                           self.ec.btrue)  # сделали измерителя
        self.plan_measurer = f_me.PlanMeasurer(
            self.measurer)  # сделали измеритель по плану
        #self.planner = f_p.DOptimalPlanner(self.ec)
        self.planner = f_p.UniformPlanner(self.ec)
        #self, ec, plancachefoldername='cache', verbose = False)

        self.measdata = None

        #формирование цепочки
        estimator = f_e.NGEstimator()
        estimator.init_parameters(self.ec, self.model)

        self.estimator = f_e.ConsoleEstimatorDecorator(estimator)
    def __init__(self):
        #     .MODEL KT315 NPN (IS=10F BF=584.517 VAF=100 IKF=29.2714M ISE=131.803P
        # 3:  + NE=2.08337 BR=1.95214 IKR=9.99996M ISC=100.316P RE=0 RC=0 RB=0
        # 4:  + CJE=27.3893P VJE=700.001M MJE=500.287M CJC=27.3893P VJC=700.001M
        # 5:  + MJC=500.287M TF=450.287P XTF=499.984M VTF=10 ITF=10.2268M TR=153.383P)
        #
        Fianora_MainScripts.AbstractMainScript.__init__(self)
        self.options.verbose = 1
        self.options.verbose_wrapper = 1

        inf = 10e10
        # числовые значения изменены шоб было по 7 значимых
        IS = 11.23456e-15
        BF = 584.5171
        VAF = 112.3456
        VAR = inf
        IKF = 29.27141e-3  # ток перехода к высококу уровню инжекции inf
        ISE = 131.8031e-12  # генерационно-рекомбинационный ток насыщения  эмиттерного перех 0
        NE = 2.083371  # коэфф. неидеальности ген-рек тока эмиттерного перех   1
        NR = 1  # коэфф неидеальности для диффузного тока в инв режиме  1
        NF = 1  # коэфф неидеальности для диффузионного тока в нормальном режиме        1
        NC = 1  # коэфф неидеальности генерационно-рекомбинацоинного тока коллектора    1
        BR = 1.952141  # инверсный коэфф усиления тока в схеме с ОЭ 1
        IKR = 9.999961e-3  # ток перехода к высокому уровню инжекции в инверсном включении inf
        ISC = 100.3161e-12  # генерационно-рекомбинационный ток насыщения колекторного перех 0
        RE = 1  # сопротивления эмиттера, коллектора, базы 0 0 0
        RC = 5.48635
        RB = 0
        parameter_str_list = ["IS", "BF", "NR", "NF", "BR"]  # список параметров
        btrue = [IS, BF, NR, NF, BR]
        Ve = np.diag([1.9e-5] * 3)
        bstart = np.array(btrue) - np.array(btrue) * 0.3
        bend = np.array(btrue) + np.array(btrue) * 0.3
        binit = f_sf.uniformVector(bstart, bend)
        xstart = np.array([0.001, 0.001])
        xend = np.array([1, 1])
        N = 30

        self.ec = f_sf.EstimationContext(bstart, bend, btrue, binit, xstart, xend, Ve, N)  # упаковывание в контекст
        self.model = f_m.StringEMTransistorModel("Q_NPN_KT513")

        self.measurer = f_me.ModelMeasurer(self.ec.Ve, self.model, self.ec.btrue)  # сделали измерителя
        self.plan_measurer = f_me.PlanMeasurer(self.measurer)  # сделали измеритель по плану
        self.planner = f_p.UniformPlanner(self.ec)

        # формирование цепочки
        self.estimator = f_e.NGEstimator()

        self.measdata = None

        self.plan = self.planner.give_us_a_plan(nocache=True)  # чтоб каждый раз не менять план, как оно делается,
    def countMeanVbForAprior_S4000(self,  expplan:list):
        """


        :return: среднее значение определителя [0] и его дисперсию [1]
        """
        DS=0 #среднее определителя
        SD=0 #дисперсия определителя

        for sss in range(1, 30): #30 - количество  попыток в выборке
            b=o_g.uniformVector (self.bstart, self.bend)
            Vb=self.countVbForPlan(expplan, b)
            D=np.linalg.det(Vb)
            if D:
                DS=(D+(sss-1)*DS)/sss  #среднее определителя
                SD=((DS-D)*(DS-D)+(sss-1)*SD)/sss #дисперсия определителя

        return DS, SD
Esempio n. 7
0
    def countMeanVbForAprior_S4000(self, expplan: list):
        """


        :return: среднее значение определителя [0] и его дисперсию [1]
        """
        DS = 0  #среднее определителя
        SD = 0  #дисперсия определителя

        for sss in range(1, 30):  #30 - количество  попыток в выборке
            b = o_g.uniformVector(self.bstart, self.bend)
            Vb = self.countVbForPlan(expplan, b)
            D = np.linalg.det(Vb)
            if D:
                DS = (D + (sss - 1) * DS) / sss  #среднее определителя
                SD = ((DS - D) * (DS - D) +
                      (sss - 1) * SD) / sss  #дисперсия определителя

        return DS, SD
Esempio n. 8
0
def main_diode():
    """
    Главная функция, осуществляющая эксперимент
    :return:
    """
    bstart = [  6.15200000e-08  , 1.16000000e+00,   3.37600000e-02] # 20%
    bend =   [  9.22800000e-08 ,  1.74000000e+00 ,  5.06400000e-02] # 20%


#    bstart = [  4.61400000e-08,   8.70000000e-01,   2.53200000e-02]  # 40%
 #   bend = [  1.07660000e-07,   2.03000000e+00,   5.90800000e-02]  # 40%


    iia = IterationInfoAcceptor ('resfiles/M1_Diode.txt', verbose=1)

    msa = DiodeMainScriptMantissaEx1()

    for i in range (50):

        btrue1 = f_sf.rangomNormalvariateVector(bstart, bend)

        #msa.ec.btrue = btrue1
        msa.ec.bstart = bstart
        msa.ec.bend = bend

        try:
            rs = msa.proceed()
            iia.accept(numiter=rs['numiter'], Sk=rs['Sk'], AvDif=rs['AvDif'])

        except:
            print ('uno problemo')
            pass




    plt.hist ([x['numiter'] for x in iia],20)
    plt.show()
    plt.savefig('resfiles/MantissaResDiode.png')
Esempio n. 9
0
    def __init__(self):
        Fianora_MainScripts.AbstractMainScript.__init__(self)
        self.options.verbose = 0
        self.options.verbose_wrapper = 0

        btrue = [7.69e-8, 1.45 ,.0422] #номинальные значения диода D1N4001 с сайта, вроде официальной модели производителя
        binit = btrue
        Ve=np.array([[1.9e-4]])
        bstart=np.array(btrue)-np.array(btrue)*0.4
        bend=np.array(btrue)+np.array(btrue)*0.4
        xstart=[0.001]
        xend=[1]
        N=100
        self.ec =f_sf.EstimationContext(bstart, bend, btrue, binit, xstart, xend, Ve, N)

        self.model = f_m.SimpleDiodeModel ('Diode_1N') # сделали модель

        #self.planner = f_p.DOptimalPlanner(self.N, self.xstart, self.xend, self.bstart, self.bend, self.model, verbose=1)
        self.planner = f_p.UniformPlanner(self.ec)
        self.measdata=None
        #формирование цепочки
        self.estimator = f_e.NGEstimator()
        self.plan = self.planner.give_us_a_plan(nocache = True) # чтоб каждый раз не менять план, как оно делается,
    def __init__(self):

        AbstractMainScript.__init__(self)

        _btrue = [7.69e-8, 1.45 ,.0422] #номинальные значения диода D1N4001 с сайта, вроде официальной модели производителя
        Ve=np.array([[1.9e-5]])
        bstart=np.array(_btrue)-np.array(_btrue)*0.2
        bend=np.array(_btrue)+np.array(_btrue)*0.2

        binit=_btrue

        btrue = f_sf.rangomNormalvariateVector(bstart, bend)
        print (btrue)
        #btrue = _btrue

        xstart=[0.001]
        xend=[1]
        N=100
        self.ec =f_sf.EstimationContext(bstart, bend, btrue, binit, xstart, xend, Ve, N)


        self.model = f_m.SimpleDiodeModel ('Diode_1N') # сделали модель
        self.ec.model = self.model

        self.measurer = f_me.ModelMeasurer(self.ec.Ve, self.model, self.ec.btrue) # сделали измерителя
        self.plan_measurer = f_me.PlanMeasurer(self.measurer) # сделали измеритель по плану
        #self.planner = f_p.DOptimalPlanner(self.ec)
        self.planner = f_p.UniformPlanner(self.ec)
        #self, ec, plancachefoldername='cache', verbose = False)

        self.measdata=None

        #формирование цепочки
        estimator = f_e.NGEstimator()
        estimator.init_parameters(self.ec, self.model)

        self.estimator  = f_e.ConsoleEstimatorDecorator(estimator)
    def make_plan(self):

        """
        Реализует априорное планирование эксперимента
        :param xstart: начало диапазона x (вектор)
        :param xend: конец диапазона x  (вектор)
        :param N: размер плана (количество контрольных точек)
        :param bstart: начало диапазона b (вектор)
        :param bend: конец диапазона b (вектор)
        :param c: словарь дополнительных переменных
        :param Ve: Ковариационная матрица y, реально её диагональ (вектор)
        :param jac: Якобиан функции, принимает на вход x,b,c,y
        :param verbosePlan: если true, пишет все планы в файлы, иначе только оптимальный
        :param initplan: начальный план. По умолчанию случаен, но может быть задан (в этом случае делается одна попытка)
        :param verbose: выдавать ли в консоль информацию optimized-original
        :return: кортеж: 0: оптимизированное значение определителя Vb, 1: оптимальный план эксперимента
        """
        verbose = self.verbose
        dopt = 100000000
        planopt = None
        Ntries1 = 2

        if verbose:
            print('\n\nДанные априорного планирования:')
            print('Неоптимизированное-оптимизированное значение среднего det(Vb)')
        prevtime=time.time()

        #ec = o_g.EstimationContext(None,None,None,None,self.xstart, self.xend,None, self.N)
        unifplanner = UniformPlanner(self.ec)
        rndplanner = RandomPlanner(self.ec)

        pln = unifplanner

        for i in range(0,Ntries1):
            try:
                #if i>0:
                if 1:
                    pln = rndplanner # композиция, основанная на полиморфизме - интерфейс один, но объекты подставляются разные
                    # маленькое применение паттерна "стратегия"

                m=len(self.xstart) #длина вектора входных параметров
                plan = pln.give_us_a_plan(nocache=True)

                if verbose:
                    print('plan length:', len(plan))


                unopt=self.countMeanVbForAprior_S4000(plan)[0]
                #оптимизация
                for j in range(self.N):
                    if verbose:
                          print('point:',j)

                    xdot=copy.deepcopy(plan[j])
                    function = lambda x: self.countMeanVbForAprior_S4000(o_g.replaceInList(plan,j,x))[0]

                    boundsarr=list()
                    for k in range(len(self.xstart)):
                        boundsarr.append((self.xstart[k],self.xend[k]))

                    #sol = optimize.minimize (function, xdot, bounds=boundsarr)
                    #plan[j]=sol.x
                    #В этом варианте не работает, хоть результат и проходит быстрее

                    plan[j]=o_g.doublesearch(self.xstart, self.xend, xdot, function)

                dcurr=self.countMeanVbForAprior_S4000(plan)[0]

                if verbose:
                    curtime = time.time() #in seconds
                    st = datetime.datetime.fromtimestamp(time.time()-prevtime).strftime('%H:%M:%S')
                    print ("{0} unoptimized-optimized: {1}   {2} time spent: {3}".format('uniform' if i==0 else '',unopt, dcurr, st))
                    prevtime=copy.copy(curtime)
                    #FIXME починить отображение времени, кривизна ж неимоверная и ниработает!!!!

                if dcurr<dopt or planopt==None:
                    dopt=dcurr
                    planopt=plan




            except BaseException as e:
                print ('This try failed, due to exception e=',e)
                tb = traceback.format_exc()
                print(tb)

        return planopt
Esempio n. 12
0
def main_transistor():
    """
    Главная функция, осуществляющая эксперимент
    :return:
    """
    # bstart = [  6.15200000e-08  , 1.16000000e+00,   3.37600000e-02] # 20%
    # bend =   [  9.22800000e-08 ,  1.74000000e+00 ,  5.06400000e-02] # 20%

    #    bstart = [  4.61400000e-08,   8.70000000e-01,   2.53200000e-02]  # 40%
    #   bend = [  1.07660000e-07,   2.03000000e+00,   5.90800000e-02]  # 40%

    # transistor

    inf = 10e10
    # числовые значения изменены шоб было по 7 значимых

    IS = 11.23456e-15
    BF = 584.5171
    VAF = 112.3456
    VAR = inf
    IKF = 29.27141e-3  # ток перехода к высококу уровню инжекции inf
    ISE = 131.8031e-12  # генерационно-рекомбинационный ток насыщения  эмиттерного перех 0
    NE = 2.083371  # коэфф. неидеальности ген-рек тока эмиттерного перех   1
    NR = 1  # коэфф неидеальности для диффузного тока в инв режиме  1
    NF = 1  # коэфф неидеальности для диффузионного тока в нормальном режиме        1
    NC = 1  # коэфф неидеальности генерационно-рекомбинацоинного тока коллектора    1
    BR = 1.952141  # инверсный коэфф усиления тока в схеме с ОЭ 1
    IKR = 9.999961e-3  # ток перехода к высокому уровню инжекции в инверсном включении inf
    ISC = 100.3161e-12  # генерационно-рекомбинационный ток насыщения колекторного перех 0
    RE = 1  # сопротивления эмиттера, коллектора, базы 0 0 0
    RC = 5.48635
    RB = 0
    btrue = [IS, BF, NR, NF, BR]
    bstart = np.array(btrue) - np.array(btrue) * 0.3
    bend = np.array(btrue) + np.array(btrue) * 0.3

    from Cases.Mantissa2 import IterationInfoAcceptor

    iia = IterationInfoAcceptor("resfiles/M1.txt")

    msa = TransistorMainScriptMantissaEx1()

    for i in range(50):

        btrue1 = f_sf.rangomNormalvariateVector(bstart, bend)

        msa.ec.btrue = btrue1
        msa.ec.bstart = bstart
        msa.ec.bend = bend

        try:
            print("entering")
            rs = msa.proceed()
            iia.accept(numiter=rs["numiter"], Sk=rs["Sk"], AvDif=rs["AvDif"])

        except:
            print("uno problemo")
            pass

        try:
            plt.hist([x[0] for x in iia], 20)
            plt.show()
            plt.savefig("resfiles/MantissaResTransistor.png")
        except:
            pass
Esempio n. 13
0
    def estimate_method(self, measdata, options):
        binit = self.binit

        NSIG = options.NSIG if options.NSIG else 8
        NSIGGENERAL = options.NSIGGENERAL if options.NSIGGENERAL else 8

        #NSIG определяется рабочей точностью вычислителя. Матрицы мы считаем с точностью 9 значащих, возьмём один в запас

        verbose = options.verbose if options.verbose else False
        verbose_wrapper = options.verbose_wrapper if options.verbose_wrapper else False
        isBinitGood = options.isBinitGood if options.isBinitGood else False

        lst_data_abt_iteration = options.list_data_abt_iteration if options.list_data_abt_iteration else None
        # объект, имеющий свойство Accept - туда отправляют нечто, он это записывает в список

        if isinstance(self.model, Fianora.Fianora_Models.ImplicitModel
                      ):  #если модель - это подкласс неявной модели, то...
            implicit = True
        else:
            implicit = False
        """
        Обёртка для grandCountGN_UltraX1_Limited для реализации общего алгоритма
        :param funcf callable функция, параметры по формату x,b,c
        :param jacf callable функция, параметры по формату x,b,c,y
        :param measdata:list список словарей экспериментальных данных [{'x': [] 'y':[])},{'x': [] 'y':[])}]
        :param binit:list начальное приближение b
        :param bstart:list нижняя граница b
        :param bend:list верхняя граница b
        :param c словарь дополнительных постоянных
        :param A матрица коэффициентов a
        :param NSIG=3 точность (кол-во знаков после запятой)
        :param implicit True если функция - неявная, иначе false
        :param verbose Если True, то подробно принтить результаты итераций
        :returns b, numiter, log - вектор оценки коэффициентов, число итераций, сообщения
        """

        maxiter = 50
        b, bpriv = binit, binit
        gknux = None
        gknuxlist = list()

        A = self.makeAinit(measdata, isBinitGood)

        log = ''

        if verbose_wrapper:
            print('==grandCountGN_UltraX1_Limited_wrapper is launched==\n\n')

        maxiter = 1
        for numiter in range(maxiter):
            bpriv = copy.copy(b)

            if verbose_wrapper:
                with f_sf.Profiler() as p:
                    gknux = self.grandCountGN_UltraX1_Limited(
                        A, measdata, NSIG, implicit, verbose,
                        options)  #посчитали b
            else:
                gknux = self.grandCountGN_UltraX1_Limited(
                    A, measdata, NSIG, implicit, verbose,
                    options)  #посчитали b

            if gknux is None:
                print(
                    "grandCountGN_UltraX1_Limited_wrapper crashed on some iteration"
                )
                return None
            gknuxlist.append(gknux)
            if verbose_wrapper:
                print('Iteration \n', numiter, '\n', gknux)

            b = gknux['b']

            if not gknux['log'] == '':
                #log+="On gknux iteration "+numiter+": "+ gknux[2]+"\n"
                log += "On gknux iteration {0}: {1}\n".format(
                    numiter, gknux['log'])

            for j in range(len(binit)):  #уменьшили в два раза
                A[j][0] *= 0.5
                A[j][1] *= 0.5

            condition = False
            for i in range(len(b)):
                if math.fabs((b[i] - bpriv[i]) / bpriv[i]) > math.pow(
                        10, -1 * NSIGGENERAL):
                    condition = True
            if not condition:
                break

            #мол если хоть один компонент вектора b значимо изменился, тогда продолжать. Иначе программа дойдёт до break и цикл прекратится

        if verbose_wrapper:
            print('grandCountGN_UltraX1_Limited_wrapper iterations number:',
                  numiter)
            print(gknux, log)

        gknux['log'] = log
        return gknux
Esempio n. 14
0
    def __init__(self):
        AbstractMainScript.__init__(self)
        #     .MODEL KT315 NPN (IS=10F BF=584.517 VAF=100 IKF=29.2714M ISE=131.803P
        # 3:  + NE=2.08337 BR=1.95214 IKR=9.99996M ISC=100.316P RE=0 RC=0 RB=0
        # 4:  + CJE=27.3893P VJE=700.001M MJE=500.287M CJC=27.3893P VJC=700.001M
        # 5:  + MJC=500.287M TF=450.287P XTF=499.984M VTF=10 ITF=10.2268M TR=153.383P)
        #
        inf = 10e10

        #IS = 10e-15
        IS = 1
        BF = 584.517
        VAF = 100
        VAR = inf
        IKF = 29.2714e-3  # ток перехода к высококу уровню инжекции inf
        ISE = 131.803e-12  # генерационно-рекомбинационный ток насыщения  эмиттерного перех 0
        NE = 2.08337  # коэфф. неидеальности ген-рек тока эмиттерного перех   1
        NR = 1  # коэфф неидеальности для диффузного тока в инв режиме  1
        NF = 1  # коэфф неидеальности для диффузионного тока в нормальном режиме        1
        NC = 1  # коэфф неидеальности генерационно-рекомбинацоинного тока коллектора    1
        BR = 1.95214  # инверсный коэфф усиления тока в схеме с ОЭ 1
        IKR = 9.99996e-3  # ток перехода к высокому уровню инжекции в инверсном включении inf
        ISC = 100.316e-12  # генерационно-рекомбинационный ток насыщения колекторного перех 0
        RE = 1  # сопротивления эмиттера, коллектора, базы 0 0 0
        RC = 5.48635
        RB = 0

        parameter_str_list = ['IS', 'BF', 'NR', 'NF',
                              'BR']  # список параметров

        b_nominal = [IS, BF, NR, NF, BR]
        bstart = np.array(b_nominal) - np.array(b_nominal) * 0.3
        bend = np.array(b_nominal) + np.array(b_nominal) * 0.3

        #btrue = f_sf.rangomNormalvariateVector(bstart, bend)
        btrue = [
            1.1204058410408533, 587.71110706589764, 1.0110737035569517,
            0.97217262436055318, 1.7709083403162802
        ]

        #btrue  = b_nominal
        binit = b_nominal

        print('Btrue set to:', btrue)

        Ve = np.diag([1.9e-5] * 3)

        xstart = np.array([0.001, 0.001])
        xend = np.array([.6, .6])
        N = 60

        ec = f_sf.EstimationContext(bstart, bend, btrue, binit, xstart, xend,
                                    Ve, N)  #упаковывание в контекст

        self.model = f_m.StringEMTransistorModel('Q_NPN_KT513')

        ec.model = self.model

        self.measurer = f_me.ModelMeasurer(ec.Ve, self.model,
                                           ec.btrue)  # сделали измерителя
        self.plan_measurer = f_me.PlanMeasurer(
            self.measurer)  # сделали измеритель по плану

        #self.planner = f_p.DOptimalPlanner(ec, 'cache', verbose=True)

        self.planner = f_p.UniformPlanner(ec)

        #формирование цепочки
        estimator = f_e.NGEstimator()
        estimator.init_parameters(ec, self.model)

        ce = f_e.ConsoleEstimatorDecorator(estimator)

        self.estimator = f_e.GraphPackEstimatorDecorator(
            ce, '../Cases/resfiles', 'NPN_KT315')
Esempio n. 15
0
def main_transistor ():
    """
    Главная функция, осуществляющая эксперимент
    :return:
    """
     #bstart = [  6.15200000e-08  , 1.16000000e+00,   3.37600000e-02] # 20%
    #bend =   [  9.22800000e-08 ,  1.74000000e+00 ,  5.06400000e-02] # 20%


#    bstart = [  4.61400000e-08,   8.70000000e-01,   2.53200000e-02]  # 40%
 #   bend = [  1.07660000e-07,   2.03000000e+00,   5.90800000e-02]  # 40%

    # transistor

    inf=10e10
    #числовые значения изменены шоб было по 7 значимых

    IS = 11.23456e-15
    BF = 584.5171
    VAF = 112.3456
    VAR = inf
    IKF =  29.27141e-3     # ток перехода к высококу уровню инжекции inf
    ISE = 131.8031e-12      # генерационно-рекомбинационный ток насыщения  эмиттерного перех 0
    NE = 2.083371       # коэфф. неидеальности ген-рек тока эмиттерного перех   1
    NR = 1       # коэфф неидеальности для диффузного тока в инв режиме  1
    NF = 1       # коэфф неидеальности для диффузионного тока в нормальном режиме        1
    NC = 1       # коэфф неидеальности генерационно-рекомбинацоинного тока коллектора    1
    BR = 1.952141      # инверсный коэфф усиления тока в схеме с ОЭ 1
    IKR = 9.999961e-3     # ток перехода к высокому уровню инжекции в инверсном включении inf
    ISC = 100.3161e-12     # генерационно-рекомбинационный ток насыщения колекторного перех 0
    RE = 1      # сопротивления эмиттера, коллектора, базы 0 0 0
    RC = 5.48635
    RB = 0
    btrue = [IS, BF, NR, NF, BR]
    bstart = np.array(btrue)-np.array(btrue)*0.3
    bend = np.array(btrue)+np.array(btrue)*0.3

    from Cases.Mantissa2 import IterationInfoAcceptor

    iia = IterationInfoAcceptor ('resfiles/M1.txt')

    msa = TransistorMainScriptMantissaEx1()

    for i in range (50):

        btrue1 = f_sf.rangomNormalvariateVector(bstart, bend)

        msa.ec.btrue = btrue1
        msa.ec.bstart = bstart
        msa.ec.bend = bend

        try:
            print ('entering')
            rs = msa.proceed()
            iia.accept(numiter=rs['numiter'], Sk=rs['Sk'], AvDif=rs['AvDif'])


        except:
            print ('uno problemo')
            pass

        try:
            plt.hist ([x[0] for x in iia],20)
            plt.show()
            plt.savefig('resfiles/MantissaResTransistor.png')
        except:
            pass
Esempio n. 16
0
 def make_plan(self):
     res = list()
     for i in range(0, self.N):
         res.append(o_g.uniformVector(self.xstart, self.xend))
     return res
Esempio n. 17
0
def extraction_Diode_In_mpmath():
    """
    пробуем экстрагировать коэффициенты из модели диода
    коэффициенты модели: Ток утечки Is, коэффициент неидеальности N, омическое сопротивление, параллельное диоду R
    входные параметры: напряжение, приложенное источником к системе резистор-диод
    +-----------|||||---------->|--------- -
    Резистор подключен до диода
    :return:
    """
    btrue = [mpm.mpf('1.238e-14'), mpm.mpf('1.3'), mpm.mpf('10')]
    c = None
    global FT
    funcf = solver_Diode_In_mpmath
    jacf = jac_Diode_In_mpmath
    #теперь попробуем сделать эксперимент.
    Ve = np.array([[1e-7]])
    bstart = [mpm.mpf('1.0e-14'), mpm.mpf('1.0'), mpm.mpf('9')]
    bend = [mpm.mpf('1.5e-14'), mpm.mpf('1.5'), mpm.mpf('14')]
    #binit=[mpm.mpf('1.1e-14'), mpm.mpf('1.1'), mpm.mpf('11')]

    binit = mpm.matrix([['1.1e-14', '1.1', '11.1']]).T

    xstart = [mpm.mpf('0.0001')]
    xend = [mpm.mpf('2')]

    N = 100
    NAprior = 20

    unifplan = o_pmpm.makeUniformExpPlan(xstart, xend, N)
    unifmeasdata = o_pmpm.makeMeasAccToPlan_lognorm(funcf, unifplan, btrue, c,
                                                    Ve)
    #print (unifmeasdata[0]['y'][0])

    import Fianora.Fianora_static_functions as f_sf

    for dps in [20, 10, 7]:

        with f_sf.Profiler():
            print()
            print('mantissa', dps)
            gknux = o_empm.grandCountGN_UltraX1_mpmath_mantissa(funcf,
                                                                jacf,
                                                                unifmeasdata,
                                                                binit,
                                                                c,
                                                                NSIG=dps,
                                                                implicit=True,
                                                                verbose=False,
                                                                mantissa=[dps])

            with mpm.workdps(dps):
                print('b', gknux[0])

                print('numiter', gknux[1])
                print('log', gknux[2])
                print('Sk', gknux[4])

    for f**k in range(10):
        with f_sf.Profiler():
            print()
            print('mantissa', 'variable')
            gknux = o_empm.grandCountGN_UltraX1_mpmath_mantissa(
                funcf,
                jacf,
                unifmeasdata,
                binit,
                c,
                NSIG=7,
                implicit=True,
                verbose=False,
                mantissa=[4, 5, 6, 7])
            with mpm.workdps(dps):
                print('b', gknux[0])
                print('numiter', gknux[1])
                print('log', gknux[2])
                print('Sk', gknux[4])
Esempio n. 18
0
    def make_plan(self):
        """
        Реализует априорное планирование эксперимента
        :param xstart: начало диапазона x (вектор)
        :param xend: конец диапазона x  (вектор)
        :param N: размер плана (количество контрольных точек)
        :param bstart: начало диапазона b (вектор)
        :param bend: конец диапазона b (вектор)
        :param c: словарь дополнительных переменных
        :param Ve: Ковариационная матрица y, реально её диагональ (вектор)
        :param jac: Якобиан функции, принимает на вход x,b,c,y
        :param verbosePlan: если true, пишет все планы в файлы, иначе только оптимальный
        :param initplan: начальный план. По умолчанию случаен, но может быть задан (в этом случае делается одна попытка)
        :param verbose: выдавать ли в консоль информацию optimized-original
        :return: кортеж: 0: оптимизированное значение определителя Vb, 1: оптимальный план эксперимента
        """
        verbose = self.verbose
        dopt = 100000000
        planopt = None
        Ntries1 = 2

        if verbose:
            print('\n\nДанные априорного планирования:')
            print(
                'Неоптимизированное-оптимизированное значение среднего det(Vb)'
            )
        prevtime = time.time()

        #ec = o_g.EstimationContext(None,None,None,None,self.xstart, self.xend,None, self.N)
        unifplanner = UniformPlanner(self.ec)
        rndplanner = RandomPlanner(self.ec)

        pln = unifplanner

        for i in range(0, Ntries1):
            try:
                #if i>0:
                if 1:
                    pln = rndplanner  # композиция, основанная на полиморфизме - интерфейс один, но объекты подставляются разные
                    # маленькое применение паттерна "стратегия"

                m = len(self.xstart)  #длина вектора входных параметров
                plan = pln.give_us_a_plan(nocache=True)

                if verbose:
                    print('plan length:', len(plan))

                unopt = self.countMeanVbForAprior_S4000(plan)[0]
                #оптимизация
                for j in range(self.N):
                    if verbose:
                        print('point:', j)

                    xdot = copy.deepcopy(plan[j])
                    function = lambda x: self.countMeanVbForAprior_S4000(
                        o_g.replaceInList(plan, j, x))[0]

                    boundsarr = list()
                    for k in range(len(self.xstart)):
                        boundsarr.append((self.xstart[k], self.xend[k]))

                    #sol = optimize.minimize (function, xdot, bounds=boundsarr)
                    #plan[j]=sol.x
                    #В этом варианте не работает, хоть результат и проходит быстрее

                    plan[j] = o_g.doublesearch(self.xstart, self.xend, xdot,
                                               function)

                dcurr = self.countMeanVbForAprior_S4000(plan)[0]

                if verbose:
                    curtime = time.time()  #in seconds
                    st = datetime.datetime.fromtimestamp(
                        time.time() - prevtime).strftime('%H:%M:%S')
                    print(
                        "{0} unoptimized-optimized: {1}   {2} time spent: {3}".
                        format('uniform' if i == 0 else '', unopt, dcurr, st))
                    prevtime = copy.copy(curtime)
                    #FIXME починить отображение времени, кривизна ж неимоверная и ниработает!!!!

                if dcurr < dopt or planopt == None:
                    dopt = dcurr
                    planopt = plan

            except BaseException as e:
                print('This try failed, due to exception e=', e)
                tb = traceback.format_exc()
                print(tb)

        return planopt
 def make_plan(self):
     res=list()
     for i in range(0, self.N):
         res.append(o_g.uniformVector(self.xstart, self.xend))
     return res