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)
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])
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