Exemplo n.º 1
0
def test():
    """
    Тестирует последовательное планирование
    :return:
    """
    xstart=[1, 100]
    xend=[20,200]


    c={"a":1000}
    funcf=lambda x,b,c: np.array ( [ b[0]+b[1]*x[0]+b[2]*x[1]+b[3]*x[0]*x[1]+b[4]*x[0]*x[0]+b[5]*x[1]*x[1],   b[6]+b[7]*x[0]+b[8]*x[1]+b[9]*x[0]*x[1]+b[10]*x[0]*x[0]+b[11]*x[1]*x[1] ] )




    jacf = lambda x,b,c,y: np.matrix([ [1, x[0], x[1], x[0]*x[1], x[0]*x[0], x[1]*x[1], 0, 0, 0, 0, 0, 0],
                                      [0,0,0,0,0,0,1,x[0], x[1], x[0]*x[1], x[0]*x[0], x[1]*x[1]] ])

    Ve=np.array([ [0.0001, 0],
                  [0, 0.0001]]  )
    btrue=[8,4,2,2,9,3,4,2,2,3,4,5]
    bstart=np.array(btrue)-np.array([2]*len(btrue))
    bend=np.array(btrue)+np.array([2]*len(btrue))
    binit=[1]*len(btrue)
    N=32


    #seqplanb=getbSeqPlanUltra (xstart, xend, N, btrue, binit, c, Ve, jacf, funcf, initplan=o_p.makeRandomUniformExpPlan(xstart, xend, 5), dotlim=500)

    print("performing aprior plan:")
    oplan=o_ap.grandApriornPlanning (xstart, xend, N, bstart, bend, c, Ve, jacf, func=None, Ntries=5)[1]
    measdata = o_p.makeMeasAccToPlan_lognorm(funcf, oplan, btrue, c,Ve )
    gknu=o_e.grandCountGN_UltraX1(funcf, jacf, measdata, binit, c, NSIG=10, implicit=False, verbose=False) #получили оценку b binit=bs
    o_q.printGKNUNeat(gknu)
    o_q.printQualitatNeat(measdata, gknu[0], Ve, funcf, c)



    print("\n\nperforming sequence plan with uniform as seed:")
    seqplanb=o_sp.getbSeqPlanUltra(xstart, xend, N, btrue, binit, c, Ve, jacf, funcf, initplan=o_p.makeUniformExpPlan(xstart, xend, 4), dotlim=200, NSIG=10)
    measdata = o_p.makeMeasAccToPlan(funcf, seqplanb[3], btrue, c,Ve)
    gknu=o_e.grandCountGN_UltraX1(funcf, jacf, measdata, binit, c, NSIG=10, implicit=False, verbose=False) #получили оценку b binit=bs
    o_q.printGKNUNeat(gknu)
    o_q.printQualitatNeat(measdata, gknu[0], Ve, funcf, c)
    o_q.printSeqPlanData(seqplanb)


#И самый огонь - последовательный план с априорным в затравке!
    print("\n\nperforming sequence plan with aprior as seed (hybrid):")

    seqplanb=o_sp.getbSeqPlanUltra(xstart, xend, N, btrue, binit, c, Ve, jacf, funcf, initplan=oplan, dotlim=200, NSIG=10)


    #seqplanb=o_sp.getHybridPlan(xstart, xend, N, btrue, binit, bstart, bend, c, Ve, jacf, funcf)
    measdata = o_p.makeMeasAccToPlan(funcf, seqplanb[3], btrue, c,Ve)
    gknu=o_e.grandCountGN_UltraX1(funcf, jacf, measdata, binit, c, NSIG=10, implicit=False, verbose=False) #получили оценку b binit=bs
    o_q.printGKNUNeat(gknu)
    o_q.printQualitatNeat(measdata, gknu[0], Ve, funcf, c)
    o_q.printSeqPlanData(seqplanb)
Exemplo n.º 2
0
def mainModellingPrc ():
    measdata = mmsd.MMMeasdata('Table.csv')
    pool=['In1.1', 'In1.2', 'In1.3', 'In1.4', 'In2.1', 'In2.2', 'In2.3', 'In5.1', 'In5.2', 'In5.3', 'In5.4']
    modelcls=mmd.MMModel()
    modelcls.makeLinearRegression(len(pool))
    binit=[1]*(len(pool)+1)

    #measdata = op.makeMeasAccToPlan_lognorm(modelcls.solver,plan,btrue,None,Ve)

    measdata.inlist=pool
    measdata.outlist=['O1.1']
    measdata.showReadableNames(1,1)

    rs=o_e.grandCountGN_UltraX1(modelcls.solver,modelcls.jacf,measdata,binit,None,NSIG=10,implicit=1)
    print (rs)


    averages= [134676.99,	20.63,	2.57,	11.44,	25.78,	128,	1134.7,	-9.76,	9.29,	64,	0.315,	11.26,	5.638,	41.6,	34.787	,109.32	,50	,49.4]
def extraction_Diode_Irev_Limited():
    """
    пробуем экстрагировать коэффициенты из модели диода
    коэффициенты модели: Ток утечки Is, коэффициент неидеальности N, омическое сопротивление, параллельное диоду R
    входные параметры: напряжение, приложенное источником к системе резистор-диод
    +-----------|||||---------->|--------- -
    Резистор подключен до диода
    :return:
    """

    global FT
    global foldername

    #возвращает значение y
    funcf=solver_Diode_Irev_Limited
    jacf = jac_Diode_Irev_Limited
    #теперь попробуем сделать эксперимент.
    c={}

    Ve=np.array([ [1.34e-7] ]  ) #согласно погрешности на мультиметре CHROMA 12061
    #btrue=[5.31656e-8,2 ,.0392384] #номинальные значения диода D1N4001
    btrue=[5e-8, 400 ,.0422] #номинальные значения диода D1N4001 с сайта, вроде официальной модели производителя


    # V=x[0] #напряжение на диоде, в данном случае обратное
    # IBV=b[0]
    # BV=b[1]
    # R=b[2]

    bstart=np.array(btrue)-np.array(btrue)*0.1
    bend=np.array(btrue)+np.array(btrue)*0.1


    print('conditions:')
    print(bstart)
    print(bend)


    binit=[5e-8, 400 ,.0422] #номинальные значения диода D1N4001 с сайта, вроде официальной модели производителя



    xstart=[399]
    xend=[401]
    N=30


    print("performing uniform plan:")
    plan = o_p.makeUniformExpPlan(xstart,xend, N)
    measdata = o_p.makeMeasAccToPlan(funcf, plan, btrue, c,None )
    print (measdata)
    plotPlanAndMeas2D(measdata)

    exit(0)







    print("performing aprior plan:")

#примитивная попытка автоматизировать, риальни надо кешировать в файл под хешем параметров

    import os
    filename =foldername+'/'+'RD_11N4004_'+os.path.basename(__file__).replace('.py','_plan')
    try:
        oplan=o_p.readPlanFromFile(filename) #переключение на чтение априорного плана из файла
        print ("Read file successful")
    except BaseException as e:
        oplan=o_ap.grandApriornPlanning (xstart, xend, N, bstart, bend, c, Ve, jacf, funcf, Ntries=6, verbose=True)[1]
        o_p.writePlanToFile(oplan, filename)





#    получаем измеренные данные
    measdata = o_p.makeMeasAccToPlan_lognorm(funcf, oplan, btrue, c,Ve )
#     #чертим эти данные
#     #o_pl.plotPlanAndMeas2D(measdata, 'Aprior Disp{0} measdata'.format(Ve))
#
#     #оценка


    #grandCountGN_UltraX1_Limited_wrapper (funcf, jacf,  measdata:list, binit:list, bstart:list, bend:list, c, A, NSIG=50, NSIGGENERAL=50, implicit=False, verbose=False, verbose_wrapper=False):

    gknuxlim = o_el.grandCountGN_UltraX1_Limited_wrapper(funcf,jacf,measdata,binit,bstart,bend, c, implicit=True, verbose=False, verbose_wrapper=False )
    gknux = o_e.grandCountGN_UltraX1(funcf, jacf, measdata, binit, c, implicit=True)

    gknuxlim2=o_q.convertToQualitatStandart (gknuxlim, funcf, jacf,  measdata, c, Ve, name='Limited Count Aprior')
    gknux2=o_q.convertToQualitatStandart (gknux, funcf, jacf,  measdata, c, Ve, name='Normal Count Aprior')

    o_q.printQualitatStandart (gknuxlim2)
    o_q.printQualitatStandart (gknux2)
def extraction_Diode_Irev_Limited():
    """
    пробуем экстрагировать коэффициенты из модели диода
    коэффициенты модели: Ток утечки Is, коэффициент неидеальности N, омическое сопротивление, параллельное диоду R
    входные параметры: напряжение, приложенное источником к системе резистор-диод
    +-----------|||||---------->|--------- -
    Резистор подключен до диода
    :return:
    """

    global FT
    global foldername

    #возвращает значение y
    funcf = solver_Diode_Irev_Limited
    jacf = jac_Diode_Irev_Limited
    #теперь попробуем сделать эксперимент.
    c = {}

    Ve = np.array([[1.34e-7]
                   ])  #согласно погрешности на мультиметре CHROMA 12061
    #btrue=[5.31656e-8,2 ,.0392384] #номинальные значения диода D1N4001
    btrue = [
        5e-8, 400, .0422
    ]  #номинальные значения диода D1N4001 с сайта, вроде официальной модели производителя

    # V=x[0] #напряжение на диоде, в данном случае обратное
    # IBV=b[0]
    # BV=b[1]
    # R=b[2]

    bstart = np.array(btrue) - np.array(btrue) * 0.1
    bend = np.array(btrue) + np.array(btrue) * 0.1

    print('conditions:')
    print(bstart)
    print(bend)

    binit = [
        5e-8, 400, .0422
    ]  #номинальные значения диода D1N4001 с сайта, вроде официальной модели производителя

    xstart = [399]
    xend = [401]
    N = 30

    print("performing uniform plan:")
    plan = o_p.makeUniformExpPlan(xstart, xend, N)
    measdata = o_p.makeMeasAccToPlan(funcf, plan, btrue, c, None)
    print(measdata)
    plotPlanAndMeas2D(measdata)

    exit(0)

    print("performing aprior plan:")

    #примитивная попытка автоматизировать, риальни надо кешировать в файл под хешем параметров

    import os
    filename = foldername + '/' + 'RD_11N4004_' + os.path.basename(
        __file__).replace('.py', '_plan')
    try:
        oplan = o_p.readPlanFromFile(
            filename)  #переключение на чтение априорного плана из файла
        print("Read file successful")
    except BaseException as e:
        oplan = o_ap.grandApriornPlanning(xstart,
                                          xend,
                                          N,
                                          bstart,
                                          bend,
                                          c,
                                          Ve,
                                          jacf,
                                          funcf,
                                          Ntries=6,
                                          verbose=True)[1]
        o_p.writePlanToFile(oplan, filename)


#    получаем измеренные данные
    measdata = o_p.makeMeasAccToPlan_lognorm(funcf, oplan, btrue, c, Ve)
    #     #чертим эти данные
    #     #o_pl.plotPlanAndMeas2D(measdata, 'Aprior Disp{0} measdata'.format(Ve))
    #
    #     #оценка

    #grandCountGN_UltraX1_Limited_wrapper (funcf, jacf,  measdata:list, binit:list, bstart:list, bend:list, c, A, NSIG=50, NSIGGENERAL=50, implicit=False, verbose=False, verbose_wrapper=False):

    gknuxlim = o_el.grandCountGN_UltraX1_Limited_wrapper(funcf,
                                                         jacf,
                                                         measdata,
                                                         binit,
                                                         bstart,
                                                         bend,
                                                         c,
                                                         implicit=True,
                                                         verbose=False,
                                                         verbose_wrapper=False)
    gknux = o_e.grandCountGN_UltraX1(funcf,
                                     jacf,
                                     measdata,
                                     binit,
                                     c,
                                     implicit=True)

    gknuxlim2 = o_q.convertToQualitatStandart(gknuxlim,
                                              funcf,
                                              jacf,
                                              measdata,
                                              c,
                                              Ve,
                                              name='Limited Count Aprior')
    gknux2 = o_q.convertToQualitatStandart(gknux,
                                           funcf,
                                           jacf,
                                           measdata,
                                           c,
                                           Ve,
                                           name='Normal Count Aprior')

    o_q.printQualitatStandart(gknuxlim2)
    o_q.printQualitatStandart(gknux2)
Exemplo n.º 5
0
def factorSelectionTest():

    measdata = mmsd.MMMeasdata('testData.csv')
    pool=['in1','in2','in3','in4','in5']
    measdata.outlist=['o1']

    modelcls=mmd.MMModel()

    #1 посчитать среднее по выходной переменной
    ylist = measdata.getCut('o1')
    print (ylist)
    avy=mean(ylist)
    #это и является самой примитивной, вырожденной регрессией

    Skinit=sum([(y-avy)**2 for y in ylist])
    print ('Initial Sk: {0}'.format(Skinit))

    for nvars in range(1,len(pool)):
        #для числа переменных от 1 до длины пула
        modelcls.makeLinearRegression(nvars) #построим регрессию с 1 переменной
        binit=[1]*(nvars+1)



        SkCurr=Skinit
        AddingVarcurr=''
        rscurr=None

        #measdata.inlist.append(pool[0]) #сразу всунем первую переменную, чтоб потом вытягивать её, если шо

        for var in pool: #для каждой переменной в пуле
            if measdata.inlist:
                measdata.inlist.pop()
            measdata.inlist.append(var) #заменить последнюю переменную такой

            #вывод отладочных данных
            print ('Model, variables number={0}'.format(nvars))
            measdata.showReadableNames(1,1)

            rs1=o_e.grandCountGN_UltraX1(modelcls.solver,modelcls.jacf,measdata,binit,None,NSIG=5,implicit=1, maxiter=10)
            rs2=o_e.grandCountGN_UltraX1(modelcls.solver,modelcls.jacf,measdata,binit,None,NSIG=5,implicit=0, maxiter=10)
            #здесь присутствует некоторая проблема - implicit может и на explicit поменяться, фиг его
            # объектная (Sk и есть наше MCLL - Maximizing Component of Logarithm of Likelihood function)
            if rs1[4]>rs2[4]: rs=rs2
            else: rs=rs1

            if rs[4]<SkCurr: #если полученная на шаге Sk меньше, чем текущая. Здесь разница должна сравниваться по статистике! В таком исполнении последовательность переменных будет по степени важности
                print ('difference - LR statistics value {0}'.format(SkCurr-rs[4]))
                SkCurr=rs[4]
                AddingVarcurr=var
                rscurr=rs

        measdata.inlist.pop()

        if AddingVarcurr: #если есть, что добавлять
            print ('added a variable in regression')
            measdata.inlist.append(AddingVarcurr)
            pool.remove(AddingVarcurr)
        else:
            print ('finished, no significant variables left')
            print (rscurr)



    print (rs)
Exemplo n.º 6
0
def testDiodeParameterExtractionIMPLICIT(plot=True):
    """
    пробуем экстрагировать коэффициенты из модели диода
    коэффициенты модели: Ток утечки Is, коэффициент неидеальности N, омическое сопротивление, параллельное диоду R
    входные параметры: напряжение, приложенное источником к системе резистор-диод
    +-----------|||||---------->|--------- -
    Резистор подключен до диода
    :return:
    """

    #возвращает значение y
    funcf = diodeResistorIMPLICITfunction
    jacf = diodeResistorIMPLICITJac
    #теперь попробуем сделать эксперимент.
    c = {}
    Ve = np.array([[0.00000001]])
    btrue = [1.238e-14, 1.8, 100]
    #btrue=[1.5e-14, 1.75, 150]

    bstart = np.array(btrue) - np.array(btrue) * 0.3
    bend = np.array(btrue) + np.array(btrue) * 0.3
    binit = [1.0e-14, 1.7, 70]
    #binit=[1.238e-14, 1.8, 100]

    xstart = [0.001]
    #xend=[20,60]
    xend = [2]
    N = 20

    print("performing aprior plan:")

    #примитивная попытка автоматизировать, риальни надо кешировать в файл под хешем параметров
    try:
        oplan = o_p.readPlanFromFile(
        )  #переключение на чтение априорного плана из файла
        print("Read file successful")
    except BaseException as e:
        oplan = o_ap.grandApriornPlanning(xstart,
                                          xend,
                                          N,
                                          bstart,
                                          bend,
                                          c,
                                          Ve,
                                          jacf,
                                          funcf,
                                          Ntries=6,
                                          verbosePlan=True,
                                          verbose=True)[1]
        o_p.writePlanToFile(oplan)

    #получаем измеренные данные
#     measdata = o_p.makeMeasAccToPlan_lognorm(funcf, oplan, btrue, c,Ve )
#     #чертим эти данные
#     #o_pl.plotPlanAndMeas2D(measdata, 'Aprior Disp{0} measdata'.format(Ve))
#
#     #оценка
#     gknu=o_e.grandCountGN_UltraX1 (funcf, jacf,  measdata, binit, c, NSIG=100, implicit=True)
#
#     #вывод данных оценки - данные, квалитат, дроп
#     o_q.printGKNUNeat(gknu)
#     o_q.printQualitatNeat(measdata, gknu[0], Ve, funcf, c)
#     if plot:
#         o_pl.plotSkGraph(gknu, 'Aprior Research Sk drop')
#
#
    terminationOptDict = {'VdShelfPow': -7}
    #
    #
    #     N=30
    #
    #     print("\n\nperforming sequence plan with random as seed:")
    #     seqplanb=o_sp.getbSeqPlanUltra(xstart, xend, N, btrue, binit, c, Ve, jacf, funcf,  dotlim=100, verbose=False, NSIG=100, implicit=True, lognorm=True, terminationOptDict=terminationOptDict) #создаём последовательный план, с выводом инфо по итерациям
    #     #выводим данные последовательного планирования
    #     o_q.printSeqPlanData(seqplanb)
    #     #получаем данные измерения по этому последовательному плану
    #     measdata = o_p.makeMeasAccToPlan_lognorm(funcf, seqplanb[3], btrue, c,Ve)
    #     #чертим эти  данные
    #     if plot:
    #         o_pl.plotPlanAndMeas2D(measdata, 'Hybrid Disp{0} measdata'.format(Ve))
    #     print("GKNU for plan")
    #     gknu=o_e.grandCountGN_UltraX1 (funcf, jacf,  measdata, binit, c, NSIG=100, implicit=True)
    #     o_q.printGKNUNeat(gknu)
    #     o_q.printQualitatNeat(measdataETALON, gknu[0], Ve, funcf, c)
    #     if plot:
    #         o_pl.plotSkGraph(gknu, 'Hybrid bei plan Sk drop')
    #
    #
    #
    #     print("\n\nperforming sequence plan with uniform as seed:")
    #     unifplan=o_p.makeUniformExpPlan(xstart, xend, N)
    #     seqplanb=o_sp.getbSeqPlanUltra(xstart, xend, N, btrue, binit, c, Ve, jacf, funcf, initplan=unifplan, dotlim=100, verbose=False, NSIG=100, implicit=True, lognorm=True, terminationOptDict=terminationOptDict) #создаём последовательный план, с выводом инфо по итерациям
    #     #выводим данные последовательного планирования
    #     o_q.printSeqPlanData(seqplanb)
    #     #получаем данные измерения по этому последовательному плану
    #     measdata = o_p.makeMeasAccToPlan_lognorm(funcf, seqplanb[3], btrue, c,Ve)
    #     #чертим эти  данные
    #     if plot:
    #         o_pl.plotPlanAndMeas2D(measdata, 'Hybrid Disp{0} measdata'.format(Ve))
    #     print("GKNU for plan")
    #     gknu=o_e.grandCountGN_UltraX1 (funcf, jacf,  measdata, binit, c, NSIG=100, implicit=True)
    #     o_q.printGKNUNeat(gknu)
    #     o_q.printQualitatNeat(measdataETALON, gknu[0], Ve, funcf, c)
    #     if plot:
    #         o_pl.plotSkGraph(gknu, 'Hybrid bei plan Sk drop')
    #
    #

    # print("\n\nperforming sequence plan with aprior as seed (hybrid):")
    # seqplanb=o_sp.getbSeqPlanUltra(xstart, xend, N, btrue, binit, c, Ve, jacf, funcf,  dotlim=100, verbose=False, NSIG=100, implicit=True, lognorm=True, terminationOptDict=terminationOptDict) #создаём последовательный план, с выводом инфо по итерациям
    # # #выводим данные последовательного планирования

    # o_q.printSeqPlanData(seqplanb)
    #получаем данные измерения по этому последовательному плану

    # #пробуем несколько измерений произвести
    # resarr=list()
    # #несколько раз измерения
    # t=PrettyTable (['Среднее логарифма правдоподобия','Сигма логарифма правдоподобия' , 'b','Среднее остатков по модулю'])
    # for i in range(20):
    #     measdata = o_p.makeMeasAccToPlan_lognorm(funcf, oplan, btrue, c,Ve)
    #     gknu=o_e.grandCountGN_UltraX_ExtraStart (funcf, jacf,  measdata, bstart, bend, c, Ve,  NSIG=100, implicit=True, verbose=False, Ntries=10, name='aprior plan plus several measurements')
    #     if (gknu):
    #         resarr.append(gknu)
    # if resarr:
    #     for gknu in resarr:
    #         if (gknu):
    #             t.add_row([gknu['AvLogTruth'],gknu['SigmaLT'], gknu['b'], gknu['AvDif'] ])
    # be=o_e.selectBestEstim (resarr)
    # t.add_row(['*', '*', '*', '*' ])
    # t.add_row([be['AvLogTruth'], be['SigmaLT'], be['b'], be['AvDif'] ])
    # print(t)
    # o_q.analyseDifList(be)

    #Априорный план просто

    startplan = o_p.makeUniformExpPlan(xstart, xend, 150)

    measdata = o_p.makeMeasAccToPlan_lognorm(funcf, startplan, btrue, c, Ve)
    gknu = o_e.grandCountGN_UltraX1(funcf,
                                    jacf,
                                    measdata,
                                    binit,
                                    c,
                                    NSIG=100,
                                    implicit=True)
    o_q.printGKNUNeat(gknu)
    o_q.printQualitatNeat(measdata, gknu[0], Ve, funcf, c, jacf)
def extraction_Kirch_DiodeV2Mod2DirectBranch():
    """
    [Реестровая]

    :return:
    """
    funcf=func_Kirch_DiodeV2Mod2DirectBranch
    jacf = Jac_Kirch_DiodeV2Mod2DirectBranch
    c={}
    Ve=np.array([ [0.0000000000001] ]  )
    btrue=[1.238e-14, 1.8, 1.5e-15, 1.9, 1.2, 0.5]

    bstart=np.array(btrue)-np.array(btrue)*0.1
    bend=np.array(btrue)+np.array(btrue)*0.1
    binit=[1.238e-14, 1.7,  1.1e-20, 1.9, 1.1, 0.5]


    xstart=[0.01]
    #xend=[20,60]
    xend=[1.5]
    N=200 #число точек в плане (для планов, кроме априорного)
    NArprior=30 #число точек в априорном плане




    #Получаем априорный план
    print("performing aprior plan:")
    #блок кеширования априорного плана в файл
    filename = os.path.basename(__file__).replace('.py','_plan1')
    try:

        oplan=o_p.readPlanFromFile(filename) #переключение на чтение априорного плана из файла
        print ("Read file successful")
    except BaseException as e:
        oplan=o_ap.grandApriornPlanning (xstart, xend, NArprior, bstart, bend, c, Ve, jacf, funcf, Ntries=6, verbosePlan=True, verbose=True)[1]
        o_p.writePlanToFile(oplan, filename)

    #Задание опций для последовательного плана
    terminationOptDict={'VdShelfPow':-7}



    #Оценивание параметров с использованием  ряда начальных значений
    # resarr=list() #Список результатов
    # t=PrettyTable (['Среднее логарифма правдоподобия','Сигма логарифма правдоподобия' , 'b','Среднее остатков по модулю'])
    # for i in range(30):
    #     measdata = o_p.makeMeasAccToPlan_lognorm(funcf, oplan, btrue, c,Ve)
    #     gknu=o_e.grandCountGN_UltraX_ExtraStart (funcf, jacf,  measdata, bstart, bend, c, Ve,  NSIG=100, implicit=False, verbose=False, Ntries=10, name='aprior plan plus several measurements')
    #     if (gknu):
    #         resarr.append(gknu)
    # if resarr:
    #     for gknu in resarr:
    #         if (gknu):
    #             t.add_row([gknu['AvLogTruth'],gknu['SigmaLT'], gknu['b'], gknu['AvDif'] ])
    # be=o_e.selectBestEstim (resarr)
    #
    # t.add_row(['*', '*', '*', '*' ])
    # t.add_row([be['AvLogTruth'], be['SigmaLT'], be['b'], be['AvDif'] ])
    # print(t)
    # #o_q.analyseDifList(be)
    # o_q.printGKNUNeat(be)
    # o_q.printQualitatNeat(measdata, be[0], Ve, funcf, c)





    #Оценивание с использованием binit

#    По априорному плану
#     print('Aprior Plan Binit')
#     #данные по новому формату
#
#     measdata = o_p.makeMeasAccToPlan_lognorm(funcf, oplan, btrue, c,Ve)
#     gknu=o_e.grandCountGN_UltraX1 (funcf, jacf,  measdata, binit, c, NSIG=100, implicit=False)
#     #o_q.analyseDifList(gknu)
#     o_q.printGKNUNeat(gknu)
#     o_q.printQualitatNeat(measdata, gknu[0], Ve, funcf, c)


    #
    # #По нормальному плану

    print("performing normal research:")
    startplan =  o_p.makeUniformExpPlan(xstart, xend, 150)
    measdata = o_p.makeMeasAccToPlan_lognorm(funcf, startplan, btrue, c,Ve)
    gknu=o_e.grandCountGN_UltraX1 (funcf, jacf,  measdata, binit, c, NSIG=100, implicit=False)
    if (gknu):
        #o_q.analyseDifList(gknu)
        o_q.printGKNUNeat(gknu)
        o_q.printQualitatNeat(measdata, gknu[0], Ve, funcf, c, jacf)
def testDiodeParameterExtractionIMPLICIT(plot=True):
    """
    пробуем экстрагировать коэффициенты из модели диода
    коэффициенты модели: Ток утечки Is, коэффициент неидеальности N, омическое сопротивление, параллельное диоду R
    входные параметры: напряжение, приложенное источником к системе резистор-диод
    +-----------|||||---------->|--------- -
    Резистор подключен до диода
    :return:
    """

    #возвращает значение y
    funcf=diodeResistorIMPLICITfunction
    jacf = diodeResistorIMPLICITJac
    #теперь попробуем сделать эксперимент.
    c={}
    Ve=np.array([ [0.00000001] ]  )
    btrue=[1.238e-14, 1.8, 100]
    #btrue=[1.5e-14, 1.75, 150]

    bstart=np.array(btrue)-np.array(btrue)*0.3
    bend=np.array(btrue)+np.array(btrue)*0.3
    binit=[1.0e-14, 1.7, 70]
    #binit=[1.238e-14, 1.8, 100]

    xstart=[0.001]
    #xend=[20,60]
    xend=[2 ]
    N=20


    print("performing aprior plan:")

#примитивная попытка автоматизировать, риальни надо кешировать в файл под хешем параметров
    try:
        oplan=o_p.readPlanFromFile() #переключение на чтение априорного плана из файла
        print ("Read file successful")
    except BaseException as e:
        oplan=o_ap.grandApriornPlanning (xstart, xend, N, bstart, bend, c, Ve, jacf, funcf, Ntries=6, verbosePlan=True, verbose=True)[1]
        o_p.writePlanToFile(oplan)

    #получаем измеренные данные
#     measdata = o_p.makeMeasAccToPlan_lognorm(funcf, oplan, btrue, c,Ve )
#     #чертим эти данные
#     #o_pl.plotPlanAndMeas2D(measdata, 'Aprior Disp{0} measdata'.format(Ve))
#
#     #оценка
#     gknu=o_e.grandCountGN_UltraX1 (funcf, jacf,  measdata, binit, c, NSIG=100, implicit=True)
#
#     #вывод данных оценки - данные, квалитат, дроп
#     o_q.printGKNUNeat(gknu)
#     o_q.printQualitatNeat(measdata, gknu[0], Ve, funcf, c)
#     if plot:
#         o_pl.plotSkGraph(gknu, 'Aprior Research Sk drop')
#
#
    terminationOptDict={'VdShelfPow':-7}
#
#
#     N=30
#
#     print("\n\nperforming sequence plan with random as seed:")
#     seqplanb=o_sp.getbSeqPlanUltra(xstart, xend, N, btrue, binit, c, Ve, jacf, funcf,  dotlim=100, verbose=False, NSIG=100, implicit=True, lognorm=True, terminationOptDict=terminationOptDict) #создаём последовательный план, с выводом инфо по итерациям
#     #выводим данные последовательного планирования
#     o_q.printSeqPlanData(seqplanb)
#     #получаем данные измерения по этому последовательному плану
#     measdata = o_p.makeMeasAccToPlan_lognorm(funcf, seqplanb[3], btrue, c,Ve)
#     #чертим эти  данные
#     if plot:
#         o_pl.plotPlanAndMeas2D(measdata, 'Hybrid Disp{0} measdata'.format(Ve))
#     print("GKNU for plan")
#     gknu=o_e.grandCountGN_UltraX1 (funcf, jacf,  measdata, binit, c, NSIG=100, implicit=True)
#     o_q.printGKNUNeat(gknu)
#     o_q.printQualitatNeat(measdataETALON, gknu[0], Ve, funcf, c)
#     if plot:
#         o_pl.plotSkGraph(gknu, 'Hybrid bei plan Sk drop')
#
#
#
#     print("\n\nperforming sequence plan with uniform as seed:")
#     unifplan=o_p.makeUniformExpPlan(xstart, xend, N)
#     seqplanb=o_sp.getbSeqPlanUltra(xstart, xend, N, btrue, binit, c, Ve, jacf, funcf, initplan=unifplan, dotlim=100, verbose=False, NSIG=100, implicit=True, lognorm=True, terminationOptDict=terminationOptDict) #создаём последовательный план, с выводом инфо по итерациям
#     #выводим данные последовательного планирования
#     o_q.printSeqPlanData(seqplanb)
#     #получаем данные измерения по этому последовательному плану
#     measdata = o_p.makeMeasAccToPlan_lognorm(funcf, seqplanb[3], btrue, c,Ve)
#     #чертим эти  данные
#     if plot:
#         o_pl.plotPlanAndMeas2D(measdata, 'Hybrid Disp{0} measdata'.format(Ve))
#     print("GKNU for plan")
#     gknu=o_e.grandCountGN_UltraX1 (funcf, jacf,  measdata, binit, c, NSIG=100, implicit=True)
#     o_q.printGKNUNeat(gknu)
#     o_q.printQualitatNeat(measdataETALON, gknu[0], Ve, funcf, c)
#     if plot:
#         o_pl.plotSkGraph(gknu, 'Hybrid bei plan Sk drop')
#
#




    # print("\n\nperforming sequence plan with aprior as seed (hybrid):")
    # seqplanb=o_sp.getbSeqPlanUltra(xstart, xend, N, btrue, binit, c, Ve, jacf, funcf,  dotlim=100, verbose=False, NSIG=100, implicit=True, lognorm=True, terminationOptDict=terminationOptDict) #создаём последовательный план, с выводом инфо по итерациям
    # # #выводим данные последовательного планирования


    # o_q.printSeqPlanData(seqplanb)
    #получаем данные измерения по этому последовательному плану


    # #пробуем несколько измерений произвести
    # resarr=list()
    # #несколько раз измерения
    # t=PrettyTable (['Среднее логарифма правдоподобия','Сигма логарифма правдоподобия' , 'b','Среднее остатков по модулю'])
    # for i in range(20):
    #     measdata = o_p.makeMeasAccToPlan_lognorm(funcf, oplan, btrue, c,Ve)
    #     gknu=o_e.grandCountGN_UltraX_ExtraStart (funcf, jacf,  measdata, bstart, bend, c, Ve,  NSIG=100, implicit=True, verbose=False, Ntries=10, name='aprior plan plus several measurements')
    #     if (gknu):
    #         resarr.append(gknu)
    # if resarr:
    #     for gknu in resarr:
    #         if (gknu):
    #             t.add_row([gknu['AvLogTruth'],gknu['SigmaLT'], gknu['b'], gknu['AvDif'] ])
    # be=o_e.selectBestEstim (resarr)
    # t.add_row(['*', '*', '*', '*' ])
    # t.add_row([be['AvLogTruth'], be['SigmaLT'], be['b'], be['AvDif'] ])
    # print(t)
    # o_q.analyseDifList(be)




    #Априорный план просто


    startplan =  o_p.makeUniformExpPlan(xstart, xend, 150)

    measdata = o_p.makeMeasAccToPlan_lognorm(funcf, startplan, btrue, c,Ve)
    gknu=o_e.grandCountGN_UltraX1 (funcf, jacf,  measdata, binit, c, NSIG=100, implicit=True)
    o_q.printGKNUNeat(gknu)
    o_q.printQualitatNeat(measdata, gknu[0], Ve, funcf, c, jacf)
def extraction_DiodeV4_partIn_Decimal(plot=True):
    """
    пробуем экстрагировать коэффициенты из модели диода
    коэффициенты модели: Ток утечки Is, коэффициент неидеальности N, омическое сопротивление, параллельное диоду R
    входные параметры: напряжение, приложенное источником к системе резистор-диод
    +-----------|||||---------->|--------- -
    Резистор подключен до диода
    :return:
    """

    #возвращает значение y
    funcf=solver_DiodeV4_partIn_Decimal
    jacf = jac_DiodeV4_partIn_Decimal
    #теперь попробуем сделать эксперимент.
    c={}
    Ve=np.array([ [0.00000001] ]  )
    btrue=[1.238e-14, 1.8, 100]
    #btrue=[1.5e-14, 1.75, 150]

    bstart=np.array(btrue)-np.array(btrue)*0.3
    bend=np.array(btrue)+np.array(btrue)*0.3
    binit=[1.0e-14, 1.7, 70]
    #binit=[1.238e-14, 1.8, 100]

    xstart=[0.001]
    #xend=[20,60]
    xend=[1.5]
    N=100 #для неаприорных планов
    NAprior=20 #для априорных планов


     #Получаем априорный план
    print("performing aprior plan:")
    #блок кеширования априорного плана в файл
    filename ='cachedPlans/'+os.path.basename(__file__).replace('.py','_plan')
    try:
        oplan=o_p.readPlanFromFile(filename) #переключение на чтение априорного плана из файла
        print ("Read file successful")
    except BaseException as e:

        oplan=o_ap.grandApriornPlanning (xstart, xend, NAprior, bstart, bend, c, Ve, jacf, funcf, Ntries=6, verbosePlan=True, verbose=True)[1]
        o_p.writePlanToFile(oplan, filename)
    #}

    unifplan =  o_p.makeUniformExpPlan(xstart, xend, N)

    #получаем измерения с планов
    measdata = o_p.makeMeasAccToPlan_lognorm(funcf, oplan, btrue, c,Ve )


    measdataUnif = o_p.makeMeasAccToPlan_lognorm(funcf, unifplan, btrue, c,Ve )

    filename = os.path.basename(__file__).replace('.py','_results')

    #выполняем оценку
    print ("performing aprior plan")
    gknu=o_e.grandCountGN_UltraX_Qualitat (funcf, jacf,  measdata, binit, c, Ve, NSIG=100, implicit=True)
    o_q.analyseDifList(gknu, imagename='Aprior_Plan')
    o_q.printGKNUNeat(gknu)
    o_q.printQualitatNeat(measdata, gknu['b'], Ve, funcf, c, jacf)


    print ("performing uniform plan")
    gknu=o_e.grandCountGN_UltraX_Qualitat (funcf, jacf,  measdataUnif, binit, c, Ve, NSIG=100, implicit=True)
    o_q.analyseDifList(gknu, imagename='Uniform_Plan')
    o_q.printGKNUNeat(gknu)
    o_q.printQualitatNeat(measdata, gknu['b'], Ve, funcf, c, jacf)
def extraction_Diode_In_Limited():
    """
    пробуем экстрагировать коэффициенты из модели диода
    коэффициенты модели: Ток утечки Is, коэффициент неидеальности N, омическое сопротивление, параллельное диоду R
    входные параметры: напряжение, приложенное источником к системе резистор-диод
    +-----------|||||---------->|--------- -
    Резистор подключен до диода
    :return:
    """

    global FT
    global foldername

    #возвращает значение y
    funcf=solver_Diode_In_Limited
    jacf = jac_Diode_In_Limited
    #теперь попробуем сделать эксперимент.
    c={}
    Ve=np.array([ [0.00000001] ]  )
    btrue=[1.238e-14, 1.8, 100]
    #btrue=[1.5e-14, 1.75, 150]

    bstart=np.array(btrue)-np.array(btrue)*0.3
    bend=np.array(btrue)+np.array(btrue)*0.3002
    #binit=np.array(btrue)-np.array(btrue)*0.1

    print('conditions:')
    print(bstart)
    print(bend)


    binit=[1.1e-14, 1.5, 90]
    xstart=[0.001]
    xend=[2]
    N=20
    print("performing aprior plan:")

#примитивная попытка автоматизировать, риальни надо кешировать в файл под хешем параметров

    import os
    filename =foldername+'/'+os.path.basename(__file__).replace('.py','_plan')
    try:
        oplan=o_p.readPlanFromFile(filename) #переключение на чтение априорного плана из файла
        print ("Read file successful")
    except BaseException as e:
        oplan=o_ap.grandApriornPlanning (xstart, xend, N, bstart, bend, c, Ve, jacf, funcf, Ntries=6, verbose=True)[1]
        o_p.writePlanToFile(oplan, filename)

#    получаем измеренные данные
    measdata = o_p.makeMeasAccToPlan_lognorm(funcf, oplan, btrue, c,Ve )
#     #чертим эти данные
#     #o_pl.plotPlanAndMeas2D(measdata, 'Aprior Disp{0} measdata'.format(Ve))
#
#     #оценка


    #grandCountGN_UltraX1_Limited_wrapper (funcf, jacf,  measdata:list, binit:list, bstart:list, bend:list, c, A, NSIG=50, NSIGGENERAL=50, implicit=False, verbose=False, verbose_wrapper=False):

    gknuxlim = o_el.grandCountGN_UltraX1_Limited_wrapper(funcf,jacf,measdata,binit,bstart,bend, c, implicit=True, verbose=False, verbose_wrapper=False )
    gknux = o_e.grandCountGN_UltraX1(funcf, jacf, measdata, binit, c, implicit=True)

    gknuxlim2=o_q.convertToQualitatStandart (gknuxlim, funcf, jacf,  measdata, c, Ve, name='Limited Count Aprior')
    gknux2=o_q.convertToQualitatStandart (gknux, funcf, jacf,  measdata, c, Ve, name='Normal Count Aprior')

    o_q.printQualitatStandart (gknuxlim2)
    o_q.printQualitatStandart (gknux2)






#extraction_Diode_Irev_Limited()
def getbSeqPlanUltra (xstart:list, xend:list, N:int, btrue:list, binit:list, c, Ve, jacf, funcf, initplan=None, NSIG=10, smallestdetVb=1e-6, implicit=False, lognorm=False, dotlim=100, verbose=False):
    """
    Осуществляет последовательное планирование и оценку коэффициентов модели
    :param xstart: начало диапазона x
    :param xend: конец диапазона x
    :param N: количество точек в плане эксперимента
    :param binit: стартовое значение вектора коэффициентов
    :param btrue: истинное значение вектора коэффициентов
    :param c: словарь дополнительных переменных
    :param Ve:  ковариационная матрица y
    :param jacf: функция, возвращающая якобиан модели, входящие x,b,c,y
    :param funcf: функция, возвращающая значение модели, входящие x,b,c
    :param initplan: - начальный план
    :param NSIG:
    :param implicit - неявность функции. Если функция неявна, то в gknu sign=0
    :param lognorm - требуется ли использование логнорм для получения измеренных данных
    :return: k, число итераций, лог
    Для переделывания на реальные измерения btrue=None и функции моделирования переводятся на измерительные
    """
    startplan = initplan if initplan else o_p.makeRandomUniformExpPlan(xstart, xend, N)
    origplan = copy.copy(startplan)
    measdata = o_p.makeMeasAccToPlan_lognorm(funcf, startplan, btrue, c, Ve) if lognorm else o_p.makeMeasAccToPlan(funcf, startplan, btrue, c, Ve)
    log=""
    b=binit
    prevdetVb=None
    for numiter in range(dotlim): #ограничитель цикла - если выход произошёл по ограничению, значит, возможна ошибка

        estim=o_e.grandCountGN_UltraX1(funcf, jacf, measdata, b, c, NSIG, implicit=implicit, verbose=False) #получили оценку b binit=b
        #measdata почему-то разная, причины неизвестны.
        b=estim[0]
        Sk=estim[1]
        Vb=o_p.countVbForMeasdata(b,  c, Ve, jacf, measdata)
        #посчитали определитель
        detVb=np.linalg.det(Vb)

        if verbose:
            print ("Sequence Plan Iteration: {0}\nb={1}\ndetVb={2}\nprevdetVb={3} \nSk={4}".format(numiter, b, detVb, prevdetVb, Sk))

        condition=prevdetVb!=None and math.fabs(detVb-prevdetVb)/prevdetVb<math.pow(10,-1) #если вышли на плато
        prevdetVb=detVb

        if condition:
            return b, numiter, Sk, startplan, origplan, log, estim, measdata, detVb #то всё вернуть

        #иначе поиск следующей точки плана

        xdot=copy.copy(xstart) #получили начальную точку начальное значение - ровно пополам диапазона
        for i in range(len(xstart)): #присвоили ей значение
            xdot[i]=xstart[i]+(xend[i]-xstart[i])/2

        #объектная функция
        measure=lambda x,b,c:o_p.makeMeasOneDot_lognorm(funcf, x, b, c, Ve) if lognorm else o_p.makeMeasOneDot(funcf, xdot, b, c, Ve)

        function = lambda x: np.linalg.det(o_p.countVbForPlan(o_g.appendToList(startplan, x),b,c,Ve,jacf, measure))
        #funcf заменено на measure, которая добавляет дисперсию.

        #function и measure есть разные функции - первая даёт идеальный результат, вторая - с дисперсией
        #создать функцию, которая будет возвращать полученные от func данные, налагая дисперсию.
        #каждый раз будет пытаться добавить в план точку и вернуть определитель с добавленной точкой
        #где тут добавлять дисперсию, а где - не добавлять, есть тащем-та вопрос открытый

        xdot=o_g.doublesearch (xstart, xend, xdot, function) #оптимизировали значение точки

        startplan.append(xdot)
        #measdata.append({'x':xdot, 'y':funcf(xdot,b,c)})

        ymeas=o_p.makeMeasOneDot_lognorm(funcf, xdot, btrue, c, Ve) if lognorm else o_p.makeMeasOneDot(funcf, xdot, btrue, c, Ve)
        measdata.append({'x':xdot, 'y':ymeas})
        #measdata = o_p.makeMeasAccToPlan_lognorm(funcf, startplan, btrue, c, Ve) if lognorm else o_p.makeMeasAccToPlan(funcf, startplan, btrue, c, Ve)




    #окончание этого цикла "естественным путём" говорит о том, что превышено максимальное число итераций
    return b, dotlim, Sk, startplan, origplan, log+"ERROR: maximum number of iterations archieved", estim, measdata, detVb
Exemplo n.º 12
0
def extraction_DiodeV4_partIn_Decimal(plot=True):
    """
    пробуем экстрагировать коэффициенты из модели диода
    коэффициенты модели: Ток утечки Is, коэффициент неидеальности N, омическое сопротивление, параллельное диоду R
    входные параметры: напряжение, приложенное источником к системе резистор-диод
    +-----------|||||---------->|--------- -
    Резистор подключен до диода
    :return:
    """

    #возвращает значение y
    funcf = solver_DiodeV4_partIn_Decimal
    jacf = jac_DiodeV4_partIn_Decimal
    #теперь попробуем сделать эксперимент.
    c = {}
    Ve = np.array([[0.00000001]])
    btrue = [1.238e-14, 1.8, 100]
    #btrue=[1.5e-14, 1.75, 150]

    bstart = np.array(btrue) - np.array(btrue) * 0.3
    bend = np.array(btrue) + np.array(btrue) * 0.3
    binit = [1.0e-14, 1.7, 70]
    #binit=[1.238e-14, 1.8, 100]

    xstart = [0.001]
    #xend=[20,60]
    xend = [1.5]
    N = 100  #для неаприорных планов
    NAprior = 20  #для априорных планов

    #Получаем априорный план
    print("performing aprior plan:")
    #блок кеширования априорного плана в файл
    filename = 'cachedPlans/' + os.path.basename(__file__).replace(
        '.py', '_plan')
    try:
        oplan = o_p.readPlanFromFile(
            filename)  #переключение на чтение априорного плана из файла
        print("Read file successful")
    except BaseException as e:

        oplan = o_ap.grandApriornPlanning(xstart,
                                          xend,
                                          NAprior,
                                          bstart,
                                          bend,
                                          c,
                                          Ve,
                                          jacf,
                                          funcf,
                                          Ntries=6,
                                          verbosePlan=True,
                                          verbose=True)[1]
        o_p.writePlanToFile(oplan, filename)
    #}

    unifplan = o_p.makeUniformExpPlan(xstart, xend, N)

    #получаем измерения с планов
    measdata = o_p.makeMeasAccToPlan_lognorm(funcf, oplan, btrue, c, Ve)

    measdataUnif = o_p.makeMeasAccToPlan_lognorm(funcf, unifplan, btrue, c, Ve)

    filename = os.path.basename(__file__).replace('.py', '_results')

    #выполняем оценку
    print("performing aprior plan")
    gknu = o_e.grandCountGN_UltraX_Qualitat(funcf,
                                            jacf,
                                            measdata,
                                            binit,
                                            c,
                                            Ve,
                                            NSIG=100,
                                            implicit=True)
    o_q.analyseDifList(gknu, imagename='Aprior_Plan')
    o_q.printGKNUNeat(gknu)
    o_q.printQualitatNeat(measdata, gknu['b'], Ve, funcf, c, jacf)

    print("performing uniform plan")
    gknu = o_e.grandCountGN_UltraX_Qualitat(funcf,
                                            jacf,
                                            measdataUnif,
                                            binit,
                                            c,
                                            Ve,
                                            NSIG=100,
                                            implicit=True)
    o_q.analyseDifList(gknu, imagename='Uniform_Plan')
    o_q.printGKNUNeat(gknu)
    o_q.printQualitatNeat(measdata, gknu['b'], Ve, funcf, c, jacf)
def extraction_func_DiodeV3Approach1_part_In():
    """
    [Реестровая]

    :return:
    """
    funcf = solver_func_DiodeV3Approach1_part_In
    jacf = Jac_func_DiodeV3Approach1_part_In
    c = {}
    Ve = np.array([[0.001]])
    btrue = [1.238e-14, 1.3]
    bstart = np.array(btrue) - np.array(btrue) * 0.1
    bend = np.array(btrue) + np.array(btrue) * 0.1

    binit = np.array(btrue) + np.array(btrue) * 0.05
    xstart = [0.01]
    #xend=[20,60]
    xend = [3]
    N = 300  #число точек в плане (для планов, кроме априорного)
    NArprior = 20  #число точек в априорном плане

    #Получаем априорный план
    print("performing aprior plan:")
    #блок кеширования априорного плана в файл
    filename = os.path.basename(__file__).replace('.py', '_plan')
    try:
        oplan = o_p.readPlanFromFile(
            filename)  #переключение на чтение априорного плана из файла
        print("Read file successful")
    except BaseException as e:
        oplan = o_ap.grandApriornPlanning(xstart,
                                          xend,
                                          NArprior,
                                          bstart,
                                          bend,
                                          c,
                                          Ve,
                                          jacf,
                                          funcf,
                                          Ntries=6,
                                          verbosePlan=True,
                                          verbose=True)[1]
        o_p.writePlanToFile(oplan, filename)
    #}

    unifplan = o_p.makeUniformExpPlan(xstart, xend, N)

    #получаем измерения с планов
    measdata = o_p.makeMeasAccToPlan_lognorm(funcf, oplan, btrue, c, Ve)
    measdataUnif = o_p.makeMeasAccToPlan_lognorm(funcf, unifplan, btrue, c, Ve)

    filename = os.path.basename(__file__).replace('.py', '_results')

    #выполняем оценку
    print("performing aprior plan")
    gknu = o_e.grandCountGN_UltraX_Qualitat(funcf,
                                            jacf,
                                            measdata,
                                            binit,
                                            c,
                                            Ve,
                                            NSIG=100,
                                            implicit=True)
    o_q.analyseDifList(gknu, imagename='Aprior_Plan')
    o_q.printGKNUNeat(gknu)
    o_q.printQualitatNeat(measdata, gknu['b'], Ve, funcf, c, jacf)

    print("performing uniform plan")
    gknu = o_e.grandCountGN_UltraX_Qualitat(funcf,
                                            jacf,
                                            measdataUnif,
                                            binit,
                                            c,
                                            Ve,
                                            NSIG=100,
                                            implicit=True)
    o_q.analyseDifList(gknu, imagename='Uniform_Plan')
    o_q.printGKNUNeat(gknu)
    o_q.printQualitatNeat(measdata, gknu['b'], Ve, funcf, c, jacf)

    print("performing ExtraStart™ method")
    resarr = list()  #Список результатов
    t = PrettyTable([
        'Среднее логарифма правдоподобия', 'Сигма логарифма правдоподобия',
        'b', 'Среднее остатков по модулю'
    ])

    for i in range(30):
        measdata = o_p.makeMeasAccToPlan_lognorm(funcf, oplan, btrue, c, Ve)
        gknu = o_e.grandCountGN_UltraX_ExtraStart(
            funcf,
            jacf,
            measdata,
            bstart,
            bend,
            c,
            Ve,
            NSIG=100,
            implicit=True,
            verbose=False,
            Ntries=10,
            name='aprior plan plus several measurements')
        if (gknu):
            resarr.append(gknu)
    if resarr:
        for gknu in resarr:
            if (gknu):
                t.add_row([
                    gknu['AvLogTruth'], gknu['SigmaLT'], gknu['b'],
                    gknu['AvDif']
                ])
    gknu = o_e.selectBestEstim(resarr)

    t.add_row(['*', '*', '*', '*'])
    t.add_row([gknu['AvLogTruth'], gknu['SigmaLT'], gknu['b'], gknu['AvDif']])
    print(t)

    o_q.analyseDifList(gknu, imagename='ExtraStart_et_Aprior_Plan')
    o_q.printGKNUNeat(gknu)
    o_q.printQualitatNeat(measdata, gknu['b'], Ve, funcf, c, jacf)
Exemplo n.º 14
0
def testDiodeParameterExtraction():
    """
    пробуем экстрагировать коэффициенты из модели диода
    коэффициенты модели: Ток утечки Is, коэффициент неидеальности N, омическое сопротивление, параллельное диоду R
    входные параметры: напряжение, приложенное источником к системе резистор-диод
    +-----------|||||---------->|--------- -
    Резистор подключен до диода
    :return:
    """

    jacf=jacdiode
    funcf=diode

    #теперь попробуем сделать эксперимент.
    c={}
    Ve=np.asmatrix( [0.1]   )

    btrue=[1.238e-14, 1.8]
    bstart=np.array(btrue)-np.array(btrue)*0.2
    bend=np.array(btrue)+np.array(btrue)*0.2
    binit=[1e-10,1.1]


    xstart=[0.01]
    xend=[2]

    N=30
    print("performing normal research:")
    startplan =  o_p.makeUniformExpPlan(xstart, xend, N)
    print(len(startplan))

    measdata = o_p.makeMeasAccToPlan(funcf, startplan, btrue, c, Ve)
    planplot1=[x[0] for x in startplan]
    measplot1=[x['y'][0] for x in measdata]
    plt.plot(planplot1, measplot1,  'bo')
    plt.show()


    gknu=o_e.grandCountGN_UltraX1 (funcf, jacf,  measdata, binit, c, NSIG=6, sign=1)
    #как мы помним, в случае неявных функций должно ставить sign=0
    print (gknu[0])
    print (o_q.getQualitat(measdata, gknu[0], Ve,  funcf, c))

      #plotting Sk graph
    #TODO better organize: this code to estimation or somewhere
    rng=np.arange(0,len(gknu[3]))
    plt.plot(rng , gknu[3], label='Sk drop')
    plt.legend(loc='upper left')
    plt.ylabel('Sk')
    plt.xlabel('Interation')
    plt.grid()
    plt.show()


    N=20
    print("performing aprior plan:")
    oplan=o_ap.grandApriornPlanning (xstart, xend, N, bstart, bend, c, Ve, jacf, funcf, Ntries=6)[1]
    o_p.writePlanToFile(oplan)
    measdata = o_p.makeMeasAccToPlan(funcf, oplan, btrue, c,Ve )



    planplot1=[x[0] for x in oplan]
    measplot1=[x['y'][0] for x in measdata]
    plt.plot(planplot1, measplot1,  'bo')
    plt.show()





    gknu=o_e.grandCountGN_UltraX1 (funcf, jacf,  measdata, binit, c, NSIG=6, sign=1)
    print (gknu[0])
    print (o_q.getQualitat(measdata, gknu[0], Ve,  funcf, c))

         #plotting Sk graph
    #TODO better organize: this code to estimation or somewhere
    rng=np.arange(0,len(gknu[3]))
    plt.plot(rng , gknu[3], label='Sk drop')
    plt.legend(loc='upper left')
    plt.ylabel('Sk')
    plt.xlabel('Interation')
    plt.grid()
    plt.show()
def extraction_func_DiodeV3Approach1_part_In():
    """
    [Реестровая]

    :return:
    """
    funcf=solver_func_DiodeV3Approach1_part_In
    jacf=Jac_func_DiodeV3Approach1_part_In
    c={}
    Ve=np.array([ [0.001] ]  )
    btrue=[1.238e-14, 1.3]
    bstart=np.array(btrue)-np.array(btrue)*0.1
    bend=np.array(btrue)+np.array(btrue)*0.1

    binit=np.array(btrue)+np.array(btrue)*0.05
    xstart=[0.01]
    #xend=[20,60]
    xend=[3]
    N=300 #число точек в плане (для планов, кроме априорного)
    NArprior=20 #число точек в априорном плане

    #Получаем априорный план
    print("performing aprior plan:")
    #блок кеширования априорного плана в файл
    filename = os.path.basename(__file__).replace('.py','_plan')
    try:
        oplan=o_p.readPlanFromFile(filename) #переключение на чтение априорного плана из файла
        print ("Read file successful")
    except BaseException as e:
        oplan=o_ap.grandApriornPlanning (xstart, xend, NArprior, bstart, bend, c, Ve, jacf, funcf, Ntries=6, verbosePlan=True, verbose=True)[1]
        o_p.writePlanToFile(oplan, filename)
    #}


    unifplan =  o_p.makeUniformExpPlan(xstart, xend, N)


    #получаем измерения с планов
    measdata = o_p.makeMeasAccToPlan_lognorm(funcf, oplan, btrue, c,Ve )
    measdataUnif = o_p.makeMeasAccToPlan_lognorm(funcf, unifplan, btrue, c,Ve )

    filename = os.path.basename(__file__).replace('.py','_results')



    #выполняем оценку
    print ("performing aprior plan")
    gknu=o_e.grandCountGN_UltraX_Qualitat (funcf, jacf,  measdata, binit, c, Ve, NSIG=100, implicit=True)
    o_q.analyseDifList(gknu, imagename='Aprior_Plan')
    o_q.printGKNUNeat(gknu)
    o_q.printQualitatNeat(measdata, gknu['b'], Ve, funcf, c, jacf)


    print ("performing uniform plan")
    gknu=o_e.grandCountGN_UltraX_Qualitat (funcf, jacf,  measdataUnif, binit, c, Ve, NSIG=100, implicit=True)
    o_q.analyseDifList(gknu, imagename='Uniform_Plan')
    o_q.printGKNUNeat(gknu)
    o_q.printQualitatNeat(measdata, gknu['b'], Ve, funcf, c, jacf)


    print ("performing ExtraStart™ method")
    resarr=list() #Список результатов
    t=PrettyTable (['Среднее логарифма правдоподобия','Сигма логарифма правдоподобия' , 'b','Среднее остатков по модулю'])

    for i in range(30):
        measdata = o_p.makeMeasAccToPlan_lognorm(funcf, oplan, btrue, c,Ve)
        gknu=o_e.grandCountGN_UltraX_ExtraStart (funcf, jacf,  measdata, bstart, bend, c, Ve,  NSIG=100, implicit=True, verbose=False, Ntries=10, name='aprior plan plus several measurements')
        if (gknu):
            resarr.append(gknu)
    if resarr:
        for gknu in resarr:
            if (gknu):
                t.add_row([gknu['AvLogTruth'],gknu['SigmaLT'], gknu['b'], gknu['AvDif'] ])
    gknu=o_e.selectBestEstim (resarr)

    t.add_row(['*', '*', '*', '*' ])
    t.add_row([gknu['AvLogTruth'], gknu['SigmaLT'], gknu['b'], gknu['AvDif'] ])
    print(t)

    o_q.analyseDifList(gknu, imagename='ExtraStart_et_Aprior_Plan')
    o_q.printGKNUNeat(gknu)
    o_q.printQualitatNeat(measdata, gknu['b'], Ve, funcf, c, jacf)
def extraction_Diode_In_Limited():
    """
    пробуем экстрагировать коэффициенты из модели диода
    коэффициенты модели: Ток утечки Is, коэффициент неидеальности N, омическое сопротивление, параллельное диоду R
    входные параметры: напряжение, приложенное источником к системе резистор-диод
    +-----------|||||---------->|--------- -
    Резистор подключен до диода
    :return:
    """

    global FT
    global foldername

    #возвращает значение y
    funcf = solver_Diode_In_Limited
    jacf = jac_Diode_In_Limited
    #теперь попробуем сделать эксперимент.
    c = {}
    Ve = np.array([[0.00000001]])
    btrue = [1.238e-14, 1.8, 100]
    #btrue=[1.5e-14, 1.75, 150]

    bstart = np.array(btrue) - np.array(btrue) * 0.3
    bend = np.array(btrue) + np.array(btrue) * 0.3002
    #binit=np.array(btrue)-np.array(btrue)*0.1

    print('conditions:')
    print(bstart)
    print(bend)

    binit = [1.1e-14, 1.5, 90]
    xstart = [0.001]
    xend = [2]
    N = 20
    print("performing aprior plan:")

    #примитивная попытка автоматизировать, риальни надо кешировать в файл под хешем параметров

    import os
    filename = foldername + '/' + os.path.basename(__file__).replace(
        '.py', '_plan')
    try:
        oplan = o_p.readPlanFromFile(
            filename)  #переключение на чтение априорного плана из файла
        print("Read file successful")
    except BaseException as e:
        oplan = o_ap.grandApriornPlanning(xstart,
                                          xend,
                                          N,
                                          bstart,
                                          bend,
                                          c,
                                          Ve,
                                          jacf,
                                          funcf,
                                          Ntries=6,
                                          verbose=True)[1]
        o_p.writePlanToFile(oplan, filename)

#    получаем измеренные данные
    measdata = o_p.makeMeasAccToPlan_lognorm(funcf, oplan, btrue, c, Ve)
    #     #чертим эти данные
    #     #o_pl.plotPlanAndMeas2D(measdata, 'Aprior Disp{0} measdata'.format(Ve))
    #
    #     #оценка

    #grandCountGN_UltraX1_Limited_wrapper (funcf, jacf,  measdata:list, binit:list, bstart:list, bend:list, c, A, NSIG=50, NSIGGENERAL=50, implicit=False, verbose=False, verbose_wrapper=False):

    gknuxlim = o_el.grandCountGN_UltraX1_Limited_wrapper(funcf,
                                                         jacf,
                                                         measdata,
                                                         binit,
                                                         bstart,
                                                         bend,
                                                         c,
                                                         implicit=True,
                                                         verbose=False,
                                                         verbose_wrapper=False)
    gknux = o_e.grandCountGN_UltraX1(funcf,
                                     jacf,
                                     measdata,
                                     binit,
                                     c,
                                     implicit=True)

    gknuxlim2 = o_q.convertToQualitatStandart(gknuxlim,
                                              funcf,
                                              jacf,
                                              measdata,
                                              c,
                                              Ve,
                                              name='Limited Count Aprior')
    gknux2 = o_q.convertToQualitatStandart(gknux,
                                           funcf,
                                           jacf,
                                           measdata,
                                           c,
                                           Ve,
                                           name='Normal Count Aprior')

    o_q.printQualitatStandart(gknuxlim2)
    o_q.printQualitatStandart(gknux2)


#extraction_Diode_Irev_Limited()
Exemplo n.º 17
0
def getbSeqPlanUltra(xstart: list,
                     xend: list,
                     N: int,
                     btrue: list,
                     binit: list,
                     c,
                     Ve,
                     jacf,
                     funcf,
                     initplan=None,
                     NSIG=10,
                     smallestdetVb=1e-6,
                     implicit=False,
                     lognorm=False,
                     dotlim=500,
                     verbose=False,
                     terminationOptDict={}):
    """
    Осуществляет последовательное планирование и оценку коэффициентов модели
    :param xstart: начало диапазона x
    :param xend: конец диапазона x
    :param N: количество точек в плане эксперимента
    :param binit: стартовое значение вектора коэффициентов
    :param btrue: истинное значение вектора коэффициентов
    :param c: словарь дополнительных переменных
    :param Ve:  ковариационная матрица y
    :param jacf: функция, возвращающая якобиан модели, входящие x,b,c,y
    :param funcf: функция, возвращающая значение модели, входящие x,b,c
    :param initplan: - начальный план
    :param NSIG:
    :param implicit - неявность функции. Если функция неявна, то в gknu sign=0
    :param lognorm - требуется ли использование логнорм для получения измеренных данных
    :param dotlim - предел добавленных точек
    :param verbose - выводить ли информацию по итерациям
    :param terminationOptDict - словарь опций завершения итеративного процесса:
        VdShelfPow - по умолчанию -1 math.fabs(detVb-prevdetVb)/prevdetVb<math.pow(10,-VdShelfPow) NSIG для полки по detVb

    :return: k, число итераций, лог
    Для переделывания на реальные измерения btrue=None и функции моделирования переводятся на измерительные // btrue вообще должен бы быть исключен из всех функций ofiura
    """

    startplan = initplan if initplan else o_p.makeRandomUniformExpPlan(
        xstart, xend, N)
    origplan = copy.copy(startplan)
    measdata = o_p.makeMeasAccToPlan_lognorm(
        funcf, startplan, btrue, c, Ve) if lognorm else o_p.makeMeasAccToPlan(
            funcf, startplan, btrue, c, Ve)
    log = ""
    b = binit
    prevdetVb = None
    for numiter in range(
            dotlim
    ):  #ограничитель цикла - если выход произошёл по ограничению, значит, возможна ошибка
        estim = o_e.grandCountGN_UltraX1(
            funcf,
            jacf,
            measdata,
            b,
            c,
            NSIG,
            implicit=implicit,
            verbose=False)  #получили оценку b binit=b
        #measdata почему-то разная, причины неизвестны.
        b = estim[0]
        Sk = estim[1]
        Vb = o_p.countVbForMeasdata(b, c, Ve, jacf, measdata)
        #посчитали определитель
        detVb = np.linalg.det(Vb)

        if verbose:
            print(
                "Sequence Plan Iteration: {0}\nb={1}\ndetVb={2}\nprevdetVb={3} \nSk={4}"
                .format(numiter, b, detVb, prevdetVb, Sk))

        VdShelfPow = terminationOptDict[
            'VdShelfPow'] if 'VdShelfPow' in terminationOptDict else -1

        condition = prevdetVb != None and math.fabs(
            detVb - prevdetVb) / prevdetVb < math.pow(
                10, VdShelfPow)  #если вышли на плато

        prevdetVb = detVb

        if condition:
            return b, numiter, Sk, startplan, origplan, log, estim, measdata, detVb  #то всё вернуть

        #иначе поиск следующей точки плана

        xdot = copy.copy(
            xstart
        )  #получили начальную точку начальное значение - ровно пополам диапазона
        for i in range(len(xstart)):  #присвоили ей значение
            xdot[i] = xstart[i] + (xend[i] - xstart[i]) / 2

        #объектная функция
        measure = lambda x, b, c: o_p.makeMeasOneDot_lognorm(
            funcf, x, b, c, Ve) if lognorm else o_p.makeMeasOneDot(
                funcf, xdot, b, c, Ve)

        function = lambda x: np.linalg.det(
            o_p.countVbForPlan(o_g.appendToList(startplan, x), b, c, Ve, jacf,
                               measure))
        #function = lambda x: np.linalg.det(o_p.countVbForPlan(o_g.appendToList(startplan, x),b,c,Ve,jacf, funcf))
        #funcf заменено на measure, которая добавляет дисперсию.

        #function и measure есть разные функции - первая даёт идеальный результат, вторая - с дисперсией
        #создать функцию, которая будет возвращать полученные от func данные, налагая дисперсию.
        #каждый раз будет пытаться добавить в план точку и вернуть определитель с добавленной точкой
        #где тут добавлять дисперсию, а где - не добавлять, есть тащем-та вопрос открытый

        xdot = o_g.doublesearch(xstart, xend, xdot,
                                function)  #оптимизировали значение точки

        startplan.append(xdot)
        #measdata.append({'x':xdot, 'y':funcf(xdot,b,c)})

        ymeas = o_p.makeMeasOneDot_lognorm(
            funcf, xdot, btrue, c, Ve) if lognorm else o_p.makeMeasOneDot(
                funcf, xdot, btrue, c, Ve)

        #примитивная защита от кривых результатов измерения
        if ymeas != None:
            measdata.append({'x': xdot, 'y': ymeas})

        #measdata = o_p.makeMeasAccToPlan_lognorm(funcf, startplan, btrue, c, Ve) if lognorm else o_p.makeMeasAccToPlan(funcf, startplan, btrue, c, Ve)

    #окончание этого цикла "естественным путём" говорит о том, что превышено максимальное число итераций
    return b, dotlim, Sk, startplan, origplan, log + "ERROR: maximum number of iterations archieved", estim, measdata, detVb
def extraction_Kirch_DiodeV2Mod2DirectBranch():
    """
    [Реестровая]

    :return:
    """
    funcf = func_Kirch_DiodeV2Mod2DirectBranch
    jacf = Jac_Kirch_DiodeV2Mod2DirectBranch
    c = {}
    Ve = np.array([[0.0000000000001]])
    btrue = [1.238e-14, 1.8, 1.5e-15, 1.9, 1.2, 0.5]

    bstart = np.array(btrue) - np.array(btrue) * 0.1
    bend = np.array(btrue) + np.array(btrue) * 0.1
    binit = [1.238e-14, 1.7, 1.1e-20, 1.9, 1.1, 0.5]

    xstart = [0.01]
    #xend=[20,60]
    xend = [1.5]
    N = 200  #число точек в плане (для планов, кроме априорного)
    NArprior = 30  #число точек в априорном плане

    #Получаем априорный план
    print("performing aprior plan:")
    #блок кеширования априорного плана в файл
    filename = os.path.basename(__file__).replace('.py', '_plan1')
    try:

        oplan = o_p.readPlanFromFile(
            filename)  #переключение на чтение априорного плана из файла
        print("Read file successful")
    except BaseException as e:
        oplan = o_ap.grandApriornPlanning(xstart,
                                          xend,
                                          NArprior,
                                          bstart,
                                          bend,
                                          c,
                                          Ve,
                                          jacf,
                                          funcf,
                                          Ntries=6,
                                          verbosePlan=True,
                                          verbose=True)[1]
        o_p.writePlanToFile(oplan, filename)

    #Задание опций для последовательного плана
    terminationOptDict = {'VdShelfPow': -7}

    #Оценивание параметров с использованием  ряда начальных значений
    # resarr=list() #Список результатов
    # t=PrettyTable (['Среднее логарифма правдоподобия','Сигма логарифма правдоподобия' , 'b','Среднее остатков по модулю'])
    # for i in range(30):
    #     measdata = o_p.makeMeasAccToPlan_lognorm(funcf, oplan, btrue, c,Ve)
    #     gknu=o_e.grandCountGN_UltraX_ExtraStart (funcf, jacf,  measdata, bstart, bend, c, Ve,  NSIG=100, implicit=False, verbose=False, Ntries=10, name='aprior plan plus several measurements')
    #     if (gknu):
    #         resarr.append(gknu)
    # if resarr:
    #     for gknu in resarr:
    #         if (gknu):
    #             t.add_row([gknu['AvLogTruth'],gknu['SigmaLT'], gknu['b'], gknu['AvDif'] ])
    # be=o_e.selectBestEstim (resarr)
    #
    # t.add_row(['*', '*', '*', '*' ])
    # t.add_row([be['AvLogTruth'], be['SigmaLT'], be['b'], be['AvDif'] ])
    # print(t)
    # #o_q.analyseDifList(be)
    # o_q.printGKNUNeat(be)
    # o_q.printQualitatNeat(measdata, be[0], Ve, funcf, c)

    #Оценивание с использованием binit

    #    По априорному плану
    #     print('Aprior Plan Binit')
    #     #данные по новому формату
    #
    #     measdata = o_p.makeMeasAccToPlan_lognorm(funcf, oplan, btrue, c,Ve)
    #     gknu=o_e.grandCountGN_UltraX1 (funcf, jacf,  measdata, binit, c, NSIG=100, implicit=False)
    #     #o_q.analyseDifList(gknu)
    #     o_q.printGKNUNeat(gknu)
    #     o_q.printQualitatNeat(measdata, gknu[0], Ve, funcf, c)

    #
    # #По нормальному плану

    print("performing normal research:")
    startplan = o_p.makeUniformExpPlan(xstart, xend, 150)
    measdata = o_p.makeMeasAccToPlan_lognorm(funcf, startplan, btrue, c, Ve)
    gknu = o_e.grandCountGN_UltraX1(funcf,
                                    jacf,
                                    measdata,
                                    binit,
                                    c,
                                    NSIG=100,
                                    implicit=False)
    if (gknu):
        #o_q.analyseDifList(gknu)
        o_q.printGKNUNeat(gknu)
        o_q.printQualitatNeat(measdata, gknu[0], Ve, funcf, c, jacf)