Exemplo n.º 1
0
def test():
    #dm = TransistorMainScript()
    dm = DiodeMainScript()

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

    with f_sf.Profiler() as p:
        #print (dm.proceed(nocacheplan=False))
        dm.proceed(nocacheplan=False)
Exemplo n.º 2
0
def extraction_Diode_In_mpmath():
    """
    пробуем экстрагировать коэффициенты из модели диода
    коэффициенты модели: Ток утечки Is, коэффициент неидеальности N, омическое сопротивление, параллельное диоду R
    входные параметры: напряжение, приложенное источником к системе резистор-диод
    +-----------|||||---------->|--------- -
    Резистор подключен до диода
    :return:
    """
    btrue = [mpm.mpf('1.238e-14'), mpm.mpf('1.3'), mpm.mpf('10')]
    c = None
    global FT
    funcf = solver_Diode_In_mpmath
    jacf = jac_Diode_In_mpmath
    #теперь попробуем сделать эксперимент.
    Ve = np.array([[1e-7]])
    bstart = [mpm.mpf('1.0e-14'), mpm.mpf('1.0'), mpm.mpf('9')]
    bend = [mpm.mpf('1.5e-14'), mpm.mpf('1.5'), mpm.mpf('14')]
    #binit=[mpm.mpf('1.1e-14'), mpm.mpf('1.1'), mpm.mpf('11')]

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

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

    N = 100
    NAprior = 20

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

    import Fianora.Fianora_static_functions as f_sf

    for dps in [20, 10, 7]:

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

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

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

    for f**k in range(10):
        with f_sf.Profiler():
            print()
            print('mantissa', 'variable')
            gknux = o_empm.grandCountGN_UltraX1_mpmath_mantissa(
                funcf,
                jacf,
                unifmeasdata,
                binit,
                c,
                NSIG=7,
                implicit=True,
                verbose=False,
                mantissa=[4, 5, 6, 7])
            with mpm.workdps(dps):
                print('b', gknux[0])
                print('numiter', gknux[1])
                print('log', gknux[2])
                print('Sk', gknux[4])
Exemplo n.º 3
0
    def estimate_method(self, measdata, options):
        binit = self.binit

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

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

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

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

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

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

        A = self.makeAinit(measdata, isBinitGood)

        log = ''

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

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

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

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

            b = gknux['b']

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

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

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

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

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

        gknux['log'] = log
        return gknux