Beispiel #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)
def testEstimate():
    """
    Пробуем произвести экстракцию параметров модели по параметрам транзистора Эрли
    :return:
    """
    jacf=lambda x,b,c,y: outTransParamFormatJAC (x,b)
    funcf=lambda x,b,c: outTransParamFormat (x,b)

    c={}
    Ve=np.array([ [0.000001, 0],
                     [0, 0.000001] ]  )

    #BF,BR,IS
    #коэфф передачи по току в схеме с оэ нормальный режим, -//- реверсный, ток утечки
    btrue=[120,1,1.28]
    binit=[110,2,1.28]

    bstart=[100,0.5,1]
    bend=[125,2,2]

    xstart=[0.001,0.001]
    xend=[5,5]

    N=50

    print("performing normal research:")
    startplan =  o_p.makeUniformExpPlan(xstart, xend, N)
    measdata = o_p.makeMeasAccToPlan(funcf, startplan, btrue, c, Ve)
    #надо добавить скажем априорный план, с фильтрованием точек

    print ('Plan optimization: measdatalen={0} optimized={1}'.format(len(measdata), len(list(filter(for_filter, measdata)) )))
    measdata = list(filter(for_filter, measdata))


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

    print (gknu[0])

    return

#     aprior plan
    print("Performing aprior plan:")
    oplan = o_ap.grandApriornPlanning(xstart, xend, 10, bstart, bend, c, Ve, jacf, Ntries=2)
    o_p.writePlanToFile(oplan, 'Aprior_plan')
    measdata = o_p.makeMeasAccToPlan(funcf, oplan, btrue, c, Ve)
    filteredmeasdata=list(filter(for_filter, measdata))
    print ('Plan optimization: measdatalen={0} optimized={1}'.format(len(measdata), len(filteredmeasdata) ))



    gknu=o_e.grandCountGN_UltraX1 (funcf, jacf,  measdata, binit, c, NSIG=10)
    print (gknu)
    print (o_q.getQualitat(measdata, gknu[0], Ve,  funcf, c))
Beispiel #3
0
def test():
    """
    Тестирует априорное планирование
    :return:
    """
    xstart = [1, 100]
    xend = [20, 200]
    N = 10
    c = {"a": 1000}
    funcf = lambda x, b, c: np.array([
        b[1] + b[2] * x[1] + b[3] * x[2] + b[4] * x[1] * x[2] + b[5] * x[1] *
        x[1] + b[6] * x[2] * x[2], b[7] + b[8] * x[1] + b[9] * x[2] + b[
            10] * x[1] * x[2] + b[11] * x[1] * x[1] + b[12] * x[2] * x[2]
    ])
    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]
    ]])

    #убрал .T

    Ve = np.array([[0.1, 0], [0, 0.1]])
    bstart = [0.8, 0.4, 1.4, 0.2, 0.9, 0.3, 1.4, 0.2, 2.1, 3.1, 4.1, 5.1]
    blen = [0.3, 0.2, 0.2, 0.2, 0.2, 0.3, 0.2, 0.2]
    bend = [1.1, 0.6, 1.6, 0.4, 1.1, 0.6, 1.6, 0.4, 2.5, 3.3, 4.6, 5.6]

    #print (doublesearch ([1, 0.5], [10,10], [9,9], lambda x: x[0]*x[0]+2*x[1]*x[1]+10)) #тестирование поиска

    rs = o_ap.grandApriornPlanning(xstart,
                                   xend,
                                   N,
                                   bstart,
                                   bend,
                                   c,
                                   Ve,
                                   jacf,
                                   func=None,
                                   Ntries=1)
    print(rs[0])

    print('Experimental plan')
    for r in rs[1]:
        print(r[0], '\t', r[1])

    print(rs[1])

    measdata = o_p.makeMeasAccToPlan(funcf, rs, bend, c, Ve)
    #надо добавить скажем априорный план, с фильтрованием точек

    gknu = o_e.grandCountGN_UltraX1(funcf, jacf, measdata, bstart, c, NSIG=10)
    print(gknu)
    print(o_q.getQualitat(measdata, gknu[0], Ve, funcf, c))

    print(gknu[0])
def testNew():

    funstr = [
        "y[0]+y[1]-y[2]", "y[0]*b[0]-y[1]*b[1]-x[0]-x[1]",
        "y[1]*b[1]+y[2]*b[2]+x[1]"
    ]
    updfunstr = list(map(lambda x: x.replace('[', '').replace(']', ''),
                         funstr))
    dfdy = lambda y, x, b, c: np.array([[1, 1, -1], [b[0], -b[1], 0],
                                        [0, b[1], b[2]]])
    dfdb = lambda y, x, b, c: np.array([[0, 0, 0], [y[0], -y[1], 0],
                                        [0, y[1], y[2]]])

    #возвращает функцию
    function = lambda y, x, b, c: [
        y[0] + y[1] - y[2], y[0] * b[0] - y[1] * b[1] - x[0] - x[1], y[1] * b[
            1] + y[2] * b[2] + x[1]
    ]

    #возвращает структурную матрицу
    #jacf=lambda x,b,c,y: jjacf(x,b,c,y,dfdb,dfdy)
    jacf = lambda x, b, c, y: np.dot(np.linalg.inv(dfdy(y, x, b, c)),
                                     dfdb(y, x, b, c))

    #возвращает значение y
    funcf = lambda x, b, c: optimize.root(
        function, [1, 1, 1], args=(x, b, c), method='lm', jac=dfdy).x

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

    btrue = [60, 60, 40]
    bstart = np.array(btrue) - np.array([2] * len(btrue))
    bend = np.array(btrue) + np.array([2] * len(btrue))
    binit = [60, 55, 45]

    xstart = [10, 40]
    #xend=[20,60]
    xend = [210, 340]

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

    #возвращает значение y
    funcf = diodeResistorIMPLICITfunction
    jacf = diodeResistorIMPLICITJac

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

    btrue = [1.238e-14, 1.8, 50]

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

    xstart = [0.01]
    #xend=[20,60]
    xend = [1.1]

    N = 50
    print("performing normal research:")

    global numnone
    numnone = 0
    startplan = o_p.makeUniformExpPlan(xstart, xend, N)
    measdata = o_p.makeMeasAccToPlan(funcf, startplan, btrue, c, Ve)

    print('unsuccessful estimations: ', numnone, 'Проверка отключена')

    gknu = o_empm.grandCountGN_UltraX1_mpmath(funcf,
                                              jacf,
                                              measdata,
                                              binit,
                                              c,
                                              NSIG=6,
                                              sign=0)
    #как мы помним, в случае неявных функций должно ставить sign=0

    print(gknu[0])
def testNew():

    funstr= ["y[0]+y[1]-y[2]", "y[0]*b[0]-y[1]*b[1]-x[0]-x[1]", "y[1]*b[1]+y[2]*b[2]+x[1]"]
    updfunstr=list(map(lambda x: x.replace('[','').replace(']',''),  funstr))
    dfdy=lambda y,x,b,c: np.array( [ [1, 1, -1],
                                     [b[0], -b[1], 0],
                                     [0, b[1], b[2]]
    ])
    dfdb=lambda y,x,b,c: np.array ([[ 0,    0,    0    ],
                                     [y[0],-y[1], 0    ],
                                     [0,    y[1], y[2] ] ])

    #возвращает функцию
    function=lambda y,x,b,c: [y[0]+y[1]-y[2], y[0]*b[0]-y[1]*b[1]-x[0]-x[1], y[1]*b[1]+y[2]*b[2]+x[1]]

    #возвращает структурную матрицу
    #jacf=lambda x,b,c,y: jjacf(x,b,c,y,dfdb,dfdy)
    jacf=lambda x,b,c,y:np.dot(np.linalg.inv(dfdy(y,x,b,c)), dfdb(y,x,b,c))

    #возвращает значение y
    funcf=lambda x,b,c: optimize.root(function, [1, 1, 1], args=(x,b,c),method='lm', jac=dfdy).x

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

    btrue=[60,60,40]
    bstart=np.array(btrue)-np.array([2]*len(btrue))
    bend=np.array(btrue)+np.array([2]*len(btrue))
    binit=[60,55,45]

    xstart=[10,40]
    #xend=[20,60]
    xend=[210,340]

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

    # возвращает значение y
    funcf = diodeResistorIMPLICITfunction
    jacf = diodeResistorIMPLICITJac

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

    btrue = [1.238e-14, 1.8, 50]

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

    xstart = [0.01]
    # xend=[20,60]
    xend = [1.1]

    N = 50
    print("performing normal research:")

    global numnone
    numnone = 0
    startplan = o_p.makeUniformExpPlan(xstart, xend, N)
    measdata = o_p.makeMeasAccToPlan(funcf, startplan, btrue, c, Ve)

    print("unsuccessful estimations: ", numnone, "Проверка отключена")

    gknu = o_empm.grandCountGN_UltraX1_mpmath(funcf, jacf, measdata, binit, c, NSIG=6, sign=0)
    # как мы помним, в случае неявных функций должно ставить sign=0

    print(gknu[0])
def testSimpleFunction ():
    #проходит, 2 итерации, если  b=b+deltab*mu


    funcstrdict= {"y1":"u1* (r2+r3)", "y2":"u1* r3"}
    xstart=[1, 100]
    xend=[20,200]
    N=50
    funcf=lambda x,b,c=None:  [x[1]*x[0]*(b[0]+b[1]), x[0]*b[1]+x[1]*b[0]]
    jacf = lambda x,b,c=None,y=None: np.array([[x[0]*x[1],x[0]*x[1]],[x[1], x[0]]])
    Ve=np.array([ [0.00001, 0],
                  [0, 0.00001]]  )
    btrue=  [20,30]
    binit=[1]*len(btrue)
    print("performing normal research:")
    startplan =  o_p.makeUniformExpPlan(xstart, xend, N)
    measdata = o_p.makeMeasAccToPlan(funcf, startplan, btrue, None, Ve)
    gknu=o_e.grandCountGN_UltraX1 (funcf, jacf,  measdata, binit, None,NSIG=10)
    print (gknu)
    print (o_q.getQualitat(measdata, gknu[0], Ve,  funcf, None))
    print (gknu[0])
def test():
    """
    Тестирует априорное планирование
    :return:
    """
    xstart=[1, 100]
    xend=[20,200]
    N=10
    c={"a":1000}
    funcf=lambda x,b,c: np.array ( [ b[1]+b[2]*x[1]+b[3]*x[2]+b[4]*x[1]*x[2]+b[5]*x[1]*x[1]+b[6]*x[2]*x[2],   b[7]+b[8]*x[1]+b[9]*x[2]+b[10]*x[1]*x[2]+b[11]*x[1]*x[1]+b[12]*x[2]*x[2] ] )
    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]] ])

    #убрал .T

    Ve=np.array([ [0.1, 0],
                  [0, 0.1]]  )
    bstart=[0.8,0.4,1.4,0.2,0.9,0.3,1.4,0.2,2.1,3.1,4.1,5.1]
    blen=  [0.3,0.2,0.2,0.2,0.2,0.3,0.2,0.2]
    bend=  [1.1,0.6,1.6,0.4,1.1,0.6,1.6,0.4,2.5,3.3,4.6,5.6]

    #print (doublesearch ([1, 0.5], [10,10], [9,9], lambda x: x[0]*x[0]+2*x[1]*x[1]+10)) #тестирование поиска

    rs=o_ap.grandApriornPlanning (xstart, xend, N, bstart, bend, c, Ve, jacf, func=None, Ntries=1)
    print (rs[0])

    print ('Experimental plan')
    for r in rs[1]:
        print(r[0], '\t', r[1])

    print(rs[1])

    measdata = o_p.makeMeasAccToPlan(funcf, rs, bend, c, Ve)
    #надо добавить скажем априорный план, с фильтрованием точек

    gknu=o_e.grandCountGN_UltraX1 (funcf, jacf,  measdata, bstart, c,NSIG=10)
    print (gknu)
    print (o_q.getQualitat(measdata, gknu[0], Ve,  funcf, c))

    print (gknu[0])
def testSquareFunction():
#проходит за 9 итераций b=b+deltab*mu
    xstart=[1, 100]
    xend=[20,200]
    N=10
    c={"a":1000}
    funcf=lambda x,b,c=None:  [ b[0]+b[1]*x[0]+b[2]*x[1]+b[3]*x[0]*x[1]+b[4]*x[0]**2+b[5]*x[1]**2,   b[6]+b[7]*x[0]+b[8]*x[1]+b[9]*x[0]*x[1]+b[10]*x[0]**2+b[11]*x[1]**2 ]
    jacf = lambda x,b,c=None,y=None: np.array([ [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]] ])
    #убрал .T
    Ve=np.array([ [0.0001, 0],
                  [0, 0.0001]]  )
    bstart=[0.8,0.4,1.4,0.2,0.9,0.3,1.4,0.2,2.1,3.1,4.1,5.1]
    btrue=  [1.1,0.6,1.6,0.4,1.1,0.6,1.6,0.4,2.5,3.3,4.6,5.6]

    bend=list(np.array(btrue)+np.array(btrue)-np.array(bstart))
    binit=[1]*len(btrue)

    N=50
    # print("performing normal research:")
    # startplan =  o_p.makeUniformExpPlan(xstart, xend, N)
    # measdata = o_p.makeMeasAccToPlan(funcf, startplan, btrue, c, Ve)
    # gknu=o_e.grandCountGN_UltraX1 (funcf, jacf,  measdata, binit, c,NSIG=10)
    # print (gknu)
    # print (o_q.getQualitat(measdata, gknu[0], Ve,  funcf, c))
    # print (gknu[0])

    print("performing aprior research:")
    oplan = o_ap.grandApriornPlanning (xstart, xend, 10, bstart, bend, c, Ve, jacf, func=None, Ntries=1)[1]
    print(oplan)

    measdata = o_p.makeMeasAccToPlan(funcf, oplan, btrue, c, Ve)
    gknu=o_e.grandCountGN_UltraX1 (funcf, jacf,  measdata, binit, c,NSIG=10)
    print (gknu)
    print (o_q.getQualitat(measdata, gknu[0], Ve,  funcf, c))
    print (gknu[0])
Beispiel #11
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_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)
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
def testEstimateErlie():

    #за 14-16 итераций с единичного вектора к результирующему с нулевой ошибкой, несмотря на разные порядки!!! при дисперсии 0.1 на 50 точках при обычном плане (учитывать большее число точек на самом деле)
    #эпичная победа



    """
    Пробуем произвести экстракцию параметров модели по параметрам транзистора Эрли
    :return:
    """

    jacf=lambda x,b,c,y: outTransParamErlieFormatJAC (x,b)
    funcf=lambda x,b,c: outTransParamErlieFormat (x,b)

    c={}
    Ve=np.array([ [0.1, 0],
                     [0, 0.1] ]  )
    #BF,BR,IS,VA
    #коэфф передачи по току в схеме с оэ нормальный режим, -//- реверсный, ток утечки, напряжение Эрли в активном режиме
    btrue=[120,1,1.28e-15, 10]
    #binit=[115,0.1,1, 11]

    binit=[1]*len(btrue)

    bstart=[100,0.5,1, 5]
    bend=[125,2,2, 15]




    xstart=[0.001,0.001]
    xend=[4,4]

    N=50

    print("performing normal research:")
    startplan =  o_p.makeUniformExpPlan(xstart, xend, N)
    measdata = o_p.makeMeasAccToPlan(funcf, startplan, btrue, c, Ve)
    #надо добавить скажем априорный план, с фильтрованием точек


    optimized_measdata=o_p.filterList(measdata, lim=1e55)
    print ('Plan optimization: measdatalen={0} optimized={1}'.format(len(measdata), len(optimized_measdata )))
    measdata = optimized_measdata


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

    print (gknu[0])



    #aprior plan
    print("Performing aprior plan:")
    oplan = o_ap.grandApriornPlanning(xstart, xend, 10, bstart, bend, c, Ve, jacf, Ntries=5)
    o_p.writePlanToFile(oplan, 'Aprior plan Erlie')
    measdata = o_p.makeMeasAccToPlan(funcf, oplan, btrue, c, Ve)

    optimized_measdata=o_p.filterList(measdata, lim=1e55)
    print ('Plan optimization: measdatalen={0} optimized={1}'.format(len(measdata), len(optimized_measdata )))
    measdata = optimized_measdata


    gknu=o_e.grandCountGN_UltraX1 (funcf, jacf,  measdata, binit, c, NSIG=10)
    print (gknu)
    print (o_q.getQualitat(measdata, gknu[0], Ve,  funcf, c))
Beispiel #16
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()