def __init__(self): # .MODEL KT315 NPN (IS=10F BF=584.517 VAF=100 IKF=29.2714M ISE=131.803P # 3: + NE=2.08337 BR=1.95214 IKR=9.99996M ISC=100.316P RE=0 RC=0 RB=0 # 4: + CJE=27.3893P VJE=700.001M MJE=500.287M CJC=27.3893P VJC=700.001M # 5: + MJC=500.287M TF=450.287P XTF=499.984M VTF=10 ITF=10.2268M TR=153.383P) # Fianora_MainScripts.AbstractMainScript.__init__(self) self.options.verbose = 1 self.options.verbose_wrapper = 1 inf=10e10 #числовые значения изменены шоб было по 7 значимых IS = 11.23456e-15 BF = 584.5171 VAF = 112.3456 VAR = inf IKF = 29.27141e-3 # ток перехода к высококу уровню инжекции inf ISE = 131.8031e-12 # генерационно-рекомбинационный ток насыщения эмиттерного перех 0 NE = 2.083371 # коэфф. неидеальности ген-рек тока эмиттерного перех 1 NR = 1 # коэфф неидеальности для диффузного тока в инв режиме 1 NF = 1 # коэфф неидеальности для диффузионного тока в нормальном режиме 1 NC = 1 # коэфф неидеальности генерационно-рекомбинацоинного тока коллектора 1 BR = 1.952141 # инверсный коэфф усиления тока в схеме с ОЭ 1 IKR = 9.999961e-3 # ток перехода к высокому уровню инжекции в инверсном включении inf ISC = 100.3161e-12 # генерационно-рекомбинационный ток насыщения колекторного перех 0 RE = 1 # сопротивления эмиттера, коллектора, базы 0 0 0 RC = 5.48635 RB = 0 parameter_str_list = ['IS', 'BF', 'NR', 'NF', 'BR'] # список параметров btrue = [IS, BF, NR, NF, BR] Ve = np.diag([1.9e-5]*3) bstart = np.array(btrue)-np.array(btrue)*0.3 bend = np.array(btrue)+np.array(btrue)*0.3 binit = f_sf.uniformVector(bstart, bend) xstart = np.array([0.001, 0.001]) xend = np.array([1, 1]) N = 30 self.ec = f_sf.EstimationContext(bstart, bend, btrue, binit, xstart, xend, Ve, N) #упаковывание в контекст self.model = f_m.StringEMTransistorModel ('Q_NPN_KT513') self.measurer = f_me.ModelMeasurer(self.ec.Ve, self.model, self.ec.btrue) # сделали измерителя self.plan_measurer = f_me.PlanMeasurer(self.measurer) # сделали измеритель по плану self.planner = f_p.UniformPlanner(self.ec) #формирование цепочки self.estimator = f_e.NGEstimator() self.measdata=None self.plan = self.planner.give_us_a_plan(nocache = True) # чтоб каждый раз не менять план, как оно делается,
def main_diode(): """ Главная функция, осуществляющая эксперимент :return: """ bstart = [6.15200000e-08, 1.16000000e00, 3.37600000e-02] # 20% bend = [9.22800000e-08, 1.74000000e00, 5.06400000e-02] # 20% # bstart = [ 4.61400000e-08, 8.70000000e-01, 2.53200000e-02] # 40% # bend = [ 1.07660000e-07, 2.03000000e+00, 5.90800000e-02] # 40% iia = IterationInfoAcceptor("resfiles/M1_Diode.txt", verbose=1) msa = DiodeMainScriptMantissaEx1() for i in range(50): btrue1 = f_sf.rangomNormalvariateVector(bstart, bend) # msa.ec.btrue = btrue1 msa.ec.bstart = bstart msa.ec.bend = bend try: rs = msa.proceed() iia.accept(numiter=rs["numiter"], Sk=rs["Sk"], AvDif=rs["AvDif"]) except: print("uno problemo") pass plt.hist([x["numiter"] for x in iia], 20) plt.show() plt.savefig("resfiles/MantissaResDiode.png")
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 __init__(self): AbstractMainScript.__init__(self) _btrue = [ 7.69e-8, 1.45, .0422 ] #номинальные значения диода D1N4001 с сайта, вроде официальной модели производителя Ve = np.array([[1.9e-5]]) bstart = np.array(_btrue) - np.array(_btrue) * 0.2 bend = np.array(_btrue) + np.array(_btrue) * 0.2 binit = _btrue btrue = f_sf.rangomNormalvariateVector(bstart, bend) print(btrue) #btrue = _btrue xstart = [0.001] xend = [1] N = 100 self.ec = f_sf.EstimationContext(bstart, bend, btrue, binit, xstart, xend, Ve, N) self.model = f_m.SimpleDiodeModel('Diode_1N') # сделали модель self.ec.model = self.model self.measurer = f_me.ModelMeasurer(self.ec.Ve, self.model, self.ec.btrue) # сделали измерителя self.plan_measurer = f_me.PlanMeasurer( self.measurer) # сделали измеритель по плану #self.planner = f_p.DOptimalPlanner(self.ec) self.planner = f_p.UniformPlanner(self.ec) #self, ec, plancachefoldername='cache', verbose = False) self.measdata = None #формирование цепочки estimator = f_e.NGEstimator() estimator.init_parameters(self.ec, self.model) self.estimator = f_e.ConsoleEstimatorDecorator(estimator)
def __init__(self): # .MODEL KT315 NPN (IS=10F BF=584.517 VAF=100 IKF=29.2714M ISE=131.803P # 3: + NE=2.08337 BR=1.95214 IKR=9.99996M ISC=100.316P RE=0 RC=0 RB=0 # 4: + CJE=27.3893P VJE=700.001M MJE=500.287M CJC=27.3893P VJC=700.001M # 5: + MJC=500.287M TF=450.287P XTF=499.984M VTF=10 ITF=10.2268M TR=153.383P) # Fianora_MainScripts.AbstractMainScript.__init__(self) self.options.verbose = 1 self.options.verbose_wrapper = 1 inf = 10e10 # числовые значения изменены шоб было по 7 значимых IS = 11.23456e-15 BF = 584.5171 VAF = 112.3456 VAR = inf IKF = 29.27141e-3 # ток перехода к высококу уровню инжекции inf ISE = 131.8031e-12 # генерационно-рекомбинационный ток насыщения эмиттерного перех 0 NE = 2.083371 # коэфф. неидеальности ген-рек тока эмиттерного перех 1 NR = 1 # коэфф неидеальности для диффузного тока в инв режиме 1 NF = 1 # коэфф неидеальности для диффузионного тока в нормальном режиме 1 NC = 1 # коэфф неидеальности генерационно-рекомбинацоинного тока коллектора 1 BR = 1.952141 # инверсный коэфф усиления тока в схеме с ОЭ 1 IKR = 9.999961e-3 # ток перехода к высокому уровню инжекции в инверсном включении inf ISC = 100.3161e-12 # генерационно-рекомбинационный ток насыщения колекторного перех 0 RE = 1 # сопротивления эмиттера, коллектора, базы 0 0 0 RC = 5.48635 RB = 0 parameter_str_list = ["IS", "BF", "NR", "NF", "BR"] # список параметров btrue = [IS, BF, NR, NF, BR] Ve = np.diag([1.9e-5] * 3) bstart = np.array(btrue) - np.array(btrue) * 0.3 bend = np.array(btrue) + np.array(btrue) * 0.3 binit = f_sf.uniformVector(bstart, bend) xstart = np.array([0.001, 0.001]) xend = np.array([1, 1]) N = 30 self.ec = f_sf.EstimationContext(bstart, bend, btrue, binit, xstart, xend, Ve, N) # упаковывание в контекст self.model = f_m.StringEMTransistorModel("Q_NPN_KT513") self.measurer = f_me.ModelMeasurer(self.ec.Ve, self.model, self.ec.btrue) # сделали измерителя self.plan_measurer = f_me.PlanMeasurer(self.measurer) # сделали измеритель по плану self.planner = f_p.UniformPlanner(self.ec) # формирование цепочки self.estimator = f_e.NGEstimator() self.measdata = None self.plan = self.planner.give_us_a_plan(nocache=True) # чтоб каждый раз не менять план, как оно делается,
def countMeanVbForAprior_S4000(self, expplan:list): """ :return: среднее значение определителя [0] и его дисперсию [1] """ DS=0 #среднее определителя SD=0 #дисперсия определителя for sss in range(1, 30): #30 - количество попыток в выборке b=o_g.uniformVector (self.bstart, self.bend) Vb=self.countVbForPlan(expplan, b) D=np.linalg.det(Vb) if D: DS=(D+(sss-1)*DS)/sss #среднее определителя SD=((DS-D)*(DS-D)+(sss-1)*SD)/sss #дисперсия определителя return DS, SD
def countMeanVbForAprior_S4000(self, expplan: list): """ :return: среднее значение определителя [0] и его дисперсию [1] """ DS = 0 #среднее определителя SD = 0 #дисперсия определителя for sss in range(1, 30): #30 - количество попыток в выборке b = o_g.uniformVector(self.bstart, self.bend) Vb = self.countVbForPlan(expplan, b) D = np.linalg.det(Vb) if D: DS = (D + (sss - 1) * DS) / sss #среднее определителя SD = ((DS - D) * (DS - D) + (sss - 1) * SD) / sss #дисперсия определителя return DS, SD
def main_diode(): """ Главная функция, осуществляющая эксперимент :return: """ bstart = [ 6.15200000e-08 , 1.16000000e+00, 3.37600000e-02] # 20% bend = [ 9.22800000e-08 , 1.74000000e+00 , 5.06400000e-02] # 20% # bstart = [ 4.61400000e-08, 8.70000000e-01, 2.53200000e-02] # 40% # bend = [ 1.07660000e-07, 2.03000000e+00, 5.90800000e-02] # 40% iia = IterationInfoAcceptor ('resfiles/M1_Diode.txt', verbose=1) msa = DiodeMainScriptMantissaEx1() for i in range (50): btrue1 = f_sf.rangomNormalvariateVector(bstart, bend) #msa.ec.btrue = btrue1 msa.ec.bstart = bstart msa.ec.bend = bend try: rs = msa.proceed() iia.accept(numiter=rs['numiter'], Sk=rs['Sk'], AvDif=rs['AvDif']) except: print ('uno problemo') pass plt.hist ([x['numiter'] for x in iia],20) plt.show() plt.savefig('resfiles/MantissaResDiode.png')
def __init__(self): Fianora_MainScripts.AbstractMainScript.__init__(self) self.options.verbose = 0 self.options.verbose_wrapper = 0 btrue = [7.69e-8, 1.45 ,.0422] #номинальные значения диода D1N4001 с сайта, вроде официальной модели производителя binit = btrue Ve=np.array([[1.9e-4]]) bstart=np.array(btrue)-np.array(btrue)*0.4 bend=np.array(btrue)+np.array(btrue)*0.4 xstart=[0.001] xend=[1] N=100 self.ec =f_sf.EstimationContext(bstart, bend, btrue, binit, xstart, xend, Ve, N) self.model = f_m.SimpleDiodeModel ('Diode_1N') # сделали модель #self.planner = f_p.DOptimalPlanner(self.N, self.xstart, self.xend, self.bstart, self.bend, self.model, verbose=1) self.planner = f_p.UniformPlanner(self.ec) self.measdata=None #формирование цепочки self.estimator = f_e.NGEstimator() self.plan = self.planner.give_us_a_plan(nocache = True) # чтоб каждый раз не менять план, как оно делается,
def __init__(self): AbstractMainScript.__init__(self) _btrue = [7.69e-8, 1.45 ,.0422] #номинальные значения диода D1N4001 с сайта, вроде официальной модели производителя Ve=np.array([[1.9e-5]]) bstart=np.array(_btrue)-np.array(_btrue)*0.2 bend=np.array(_btrue)+np.array(_btrue)*0.2 binit=_btrue btrue = f_sf.rangomNormalvariateVector(bstart, bend) print (btrue) #btrue = _btrue xstart=[0.001] xend=[1] N=100 self.ec =f_sf.EstimationContext(bstart, bend, btrue, binit, xstart, xend, Ve, N) self.model = f_m.SimpleDiodeModel ('Diode_1N') # сделали модель self.ec.model = self.model self.measurer = f_me.ModelMeasurer(self.ec.Ve, self.model, self.ec.btrue) # сделали измерителя self.plan_measurer = f_me.PlanMeasurer(self.measurer) # сделали измеритель по плану #self.planner = f_p.DOptimalPlanner(self.ec) self.planner = f_p.UniformPlanner(self.ec) #self, ec, plancachefoldername='cache', verbose = False) self.measdata=None #формирование цепочки estimator = f_e.NGEstimator() estimator.init_parameters(self.ec, self.model) self.estimator = f_e.ConsoleEstimatorDecorator(estimator)
def make_plan(self): """ Реализует априорное планирование эксперимента :param xstart: начало диапазона x (вектор) :param xend: конец диапазона x (вектор) :param N: размер плана (количество контрольных точек) :param bstart: начало диапазона b (вектор) :param bend: конец диапазона b (вектор) :param c: словарь дополнительных переменных :param Ve: Ковариационная матрица y, реально её диагональ (вектор) :param jac: Якобиан функции, принимает на вход x,b,c,y :param verbosePlan: если true, пишет все планы в файлы, иначе только оптимальный :param initplan: начальный план. По умолчанию случаен, но может быть задан (в этом случае делается одна попытка) :param verbose: выдавать ли в консоль информацию optimized-original :return: кортеж: 0: оптимизированное значение определителя Vb, 1: оптимальный план эксперимента """ verbose = self.verbose dopt = 100000000 planopt = None Ntries1 = 2 if verbose: print('\n\nДанные априорного планирования:') print('Неоптимизированное-оптимизированное значение среднего det(Vb)') prevtime=time.time() #ec = o_g.EstimationContext(None,None,None,None,self.xstart, self.xend,None, self.N) unifplanner = UniformPlanner(self.ec) rndplanner = RandomPlanner(self.ec) pln = unifplanner for i in range(0,Ntries1): try: #if i>0: if 1: pln = rndplanner # композиция, основанная на полиморфизме - интерфейс один, но объекты подставляются разные # маленькое применение паттерна "стратегия" m=len(self.xstart) #длина вектора входных параметров plan = pln.give_us_a_plan(nocache=True) if verbose: print('plan length:', len(plan)) unopt=self.countMeanVbForAprior_S4000(plan)[0] #оптимизация for j in range(self.N): if verbose: print('point:',j) xdot=copy.deepcopy(plan[j]) function = lambda x: self.countMeanVbForAprior_S4000(o_g.replaceInList(plan,j,x))[0] boundsarr=list() for k in range(len(self.xstart)): boundsarr.append((self.xstart[k],self.xend[k])) #sol = optimize.minimize (function, xdot, bounds=boundsarr) #plan[j]=sol.x #В этом варианте не работает, хоть результат и проходит быстрее plan[j]=o_g.doublesearch(self.xstart, self.xend, xdot, function) dcurr=self.countMeanVbForAprior_S4000(plan)[0] if verbose: curtime = time.time() #in seconds st = datetime.datetime.fromtimestamp(time.time()-prevtime).strftime('%H:%M:%S') print ("{0} unoptimized-optimized: {1} {2} time spent: {3}".format('uniform' if i==0 else '',unopt, dcurr, st)) prevtime=copy.copy(curtime) #FIXME починить отображение времени, кривизна ж неимоверная и ниработает!!!! if dcurr<dopt or planopt==None: dopt=dcurr planopt=plan except BaseException as e: print ('This try failed, due to exception e=',e) tb = traceback.format_exc() print(tb) return planopt
def main_transistor(): """ Главная функция, осуществляющая эксперимент :return: """ # bstart = [ 6.15200000e-08 , 1.16000000e+00, 3.37600000e-02] # 20% # bend = [ 9.22800000e-08 , 1.74000000e+00 , 5.06400000e-02] # 20% # bstart = [ 4.61400000e-08, 8.70000000e-01, 2.53200000e-02] # 40% # bend = [ 1.07660000e-07, 2.03000000e+00, 5.90800000e-02] # 40% # transistor inf = 10e10 # числовые значения изменены шоб было по 7 значимых IS = 11.23456e-15 BF = 584.5171 VAF = 112.3456 VAR = inf IKF = 29.27141e-3 # ток перехода к высококу уровню инжекции inf ISE = 131.8031e-12 # генерационно-рекомбинационный ток насыщения эмиттерного перех 0 NE = 2.083371 # коэфф. неидеальности ген-рек тока эмиттерного перех 1 NR = 1 # коэфф неидеальности для диффузного тока в инв режиме 1 NF = 1 # коэфф неидеальности для диффузионного тока в нормальном режиме 1 NC = 1 # коэфф неидеальности генерационно-рекомбинацоинного тока коллектора 1 BR = 1.952141 # инверсный коэфф усиления тока в схеме с ОЭ 1 IKR = 9.999961e-3 # ток перехода к высокому уровню инжекции в инверсном включении inf ISC = 100.3161e-12 # генерационно-рекомбинационный ток насыщения колекторного перех 0 RE = 1 # сопротивления эмиттера, коллектора, базы 0 0 0 RC = 5.48635 RB = 0 btrue = [IS, BF, NR, NF, BR] bstart = np.array(btrue) - np.array(btrue) * 0.3 bend = np.array(btrue) + np.array(btrue) * 0.3 from Cases.Mantissa2 import IterationInfoAcceptor iia = IterationInfoAcceptor("resfiles/M1.txt") msa = TransistorMainScriptMantissaEx1() for i in range(50): btrue1 = f_sf.rangomNormalvariateVector(bstart, bend) msa.ec.btrue = btrue1 msa.ec.bstart = bstart msa.ec.bend = bend try: print("entering") rs = msa.proceed() iia.accept(numiter=rs["numiter"], Sk=rs["Sk"], AvDif=rs["AvDif"]) except: print("uno problemo") pass try: plt.hist([x[0] for x in iia], 20) plt.show() plt.savefig("resfiles/MantissaResTransistor.png") except: pass
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
def __init__(self): AbstractMainScript.__init__(self) # .MODEL KT315 NPN (IS=10F BF=584.517 VAF=100 IKF=29.2714M ISE=131.803P # 3: + NE=2.08337 BR=1.95214 IKR=9.99996M ISC=100.316P RE=0 RC=0 RB=0 # 4: + CJE=27.3893P VJE=700.001M MJE=500.287M CJC=27.3893P VJC=700.001M # 5: + MJC=500.287M TF=450.287P XTF=499.984M VTF=10 ITF=10.2268M TR=153.383P) # inf = 10e10 #IS = 10e-15 IS = 1 BF = 584.517 VAF = 100 VAR = inf IKF = 29.2714e-3 # ток перехода к высококу уровню инжекции inf ISE = 131.803e-12 # генерационно-рекомбинационный ток насыщения эмиттерного перех 0 NE = 2.08337 # коэфф. неидеальности ген-рек тока эмиттерного перех 1 NR = 1 # коэфф неидеальности для диффузного тока в инв режиме 1 NF = 1 # коэфф неидеальности для диффузионного тока в нормальном режиме 1 NC = 1 # коэфф неидеальности генерационно-рекомбинацоинного тока коллектора 1 BR = 1.95214 # инверсный коэфф усиления тока в схеме с ОЭ 1 IKR = 9.99996e-3 # ток перехода к высокому уровню инжекции в инверсном включении inf ISC = 100.316e-12 # генерационно-рекомбинационный ток насыщения колекторного перех 0 RE = 1 # сопротивления эмиттера, коллектора, базы 0 0 0 RC = 5.48635 RB = 0 parameter_str_list = ['IS', 'BF', 'NR', 'NF', 'BR'] # список параметров b_nominal = [IS, BF, NR, NF, BR] bstart = np.array(b_nominal) - np.array(b_nominal) * 0.3 bend = np.array(b_nominal) + np.array(b_nominal) * 0.3 #btrue = f_sf.rangomNormalvariateVector(bstart, bend) btrue = [ 1.1204058410408533, 587.71110706589764, 1.0110737035569517, 0.97217262436055318, 1.7709083403162802 ] #btrue = b_nominal binit = b_nominal print('Btrue set to:', btrue) Ve = np.diag([1.9e-5] * 3) xstart = np.array([0.001, 0.001]) xend = np.array([.6, .6]) N = 60 ec = f_sf.EstimationContext(bstart, bend, btrue, binit, xstart, xend, Ve, N) #упаковывание в контекст self.model = f_m.StringEMTransistorModel('Q_NPN_KT513') ec.model = self.model self.measurer = f_me.ModelMeasurer(ec.Ve, self.model, ec.btrue) # сделали измерителя self.plan_measurer = f_me.PlanMeasurer( self.measurer) # сделали измеритель по плану #self.planner = f_p.DOptimalPlanner(ec, 'cache', verbose=True) self.planner = f_p.UniformPlanner(ec) #формирование цепочки estimator = f_e.NGEstimator() estimator.init_parameters(ec, self.model) ce = f_e.ConsoleEstimatorDecorator(estimator) self.estimator = f_e.GraphPackEstimatorDecorator( ce, '../Cases/resfiles', 'NPN_KT315')
def main_transistor (): """ Главная функция, осуществляющая эксперимент :return: """ #bstart = [ 6.15200000e-08 , 1.16000000e+00, 3.37600000e-02] # 20% #bend = [ 9.22800000e-08 , 1.74000000e+00 , 5.06400000e-02] # 20% # bstart = [ 4.61400000e-08, 8.70000000e-01, 2.53200000e-02] # 40% # bend = [ 1.07660000e-07, 2.03000000e+00, 5.90800000e-02] # 40% # transistor inf=10e10 #числовые значения изменены шоб было по 7 значимых IS = 11.23456e-15 BF = 584.5171 VAF = 112.3456 VAR = inf IKF = 29.27141e-3 # ток перехода к высококу уровню инжекции inf ISE = 131.8031e-12 # генерационно-рекомбинационный ток насыщения эмиттерного перех 0 NE = 2.083371 # коэфф. неидеальности ген-рек тока эмиттерного перех 1 NR = 1 # коэфф неидеальности для диффузного тока в инв режиме 1 NF = 1 # коэфф неидеальности для диффузионного тока в нормальном режиме 1 NC = 1 # коэфф неидеальности генерационно-рекомбинацоинного тока коллектора 1 BR = 1.952141 # инверсный коэфф усиления тока в схеме с ОЭ 1 IKR = 9.999961e-3 # ток перехода к высокому уровню инжекции в инверсном включении inf ISC = 100.3161e-12 # генерационно-рекомбинационный ток насыщения колекторного перех 0 RE = 1 # сопротивления эмиттера, коллектора, базы 0 0 0 RC = 5.48635 RB = 0 btrue = [IS, BF, NR, NF, BR] bstart = np.array(btrue)-np.array(btrue)*0.3 bend = np.array(btrue)+np.array(btrue)*0.3 from Cases.Mantissa2 import IterationInfoAcceptor iia = IterationInfoAcceptor ('resfiles/M1.txt') msa = TransistorMainScriptMantissaEx1() for i in range (50): btrue1 = f_sf.rangomNormalvariateVector(bstart, bend) msa.ec.btrue = btrue1 msa.ec.bstart = bstart msa.ec.bend = bend try: print ('entering') rs = msa.proceed() iia.accept(numiter=rs['numiter'], Sk=rs['Sk'], AvDif=rs['AvDif']) except: print ('uno problemo') pass try: plt.hist ([x[0] for x in iia],20) plt.show() plt.savefig('resfiles/MantissaResTransistor.png') except: pass
def make_plan(self): res = list() for i in range(0, self.N): res.append(o_g.uniformVector(self.xstart, self.xend)) return res
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 make_plan(self): """ Реализует априорное планирование эксперимента :param xstart: начало диапазона x (вектор) :param xend: конец диапазона x (вектор) :param N: размер плана (количество контрольных точек) :param bstart: начало диапазона b (вектор) :param bend: конец диапазона b (вектор) :param c: словарь дополнительных переменных :param Ve: Ковариационная матрица y, реально её диагональ (вектор) :param jac: Якобиан функции, принимает на вход x,b,c,y :param verbosePlan: если true, пишет все планы в файлы, иначе только оптимальный :param initplan: начальный план. По умолчанию случаен, но может быть задан (в этом случае делается одна попытка) :param verbose: выдавать ли в консоль информацию optimized-original :return: кортеж: 0: оптимизированное значение определителя Vb, 1: оптимальный план эксперимента """ verbose = self.verbose dopt = 100000000 planopt = None Ntries1 = 2 if verbose: print('\n\nДанные априорного планирования:') print( 'Неоптимизированное-оптимизированное значение среднего det(Vb)' ) prevtime = time.time() #ec = o_g.EstimationContext(None,None,None,None,self.xstart, self.xend,None, self.N) unifplanner = UniformPlanner(self.ec) rndplanner = RandomPlanner(self.ec) pln = unifplanner for i in range(0, Ntries1): try: #if i>0: if 1: pln = rndplanner # композиция, основанная на полиморфизме - интерфейс один, но объекты подставляются разные # маленькое применение паттерна "стратегия" m = len(self.xstart) #длина вектора входных параметров plan = pln.give_us_a_plan(nocache=True) if verbose: print('plan length:', len(plan)) unopt = self.countMeanVbForAprior_S4000(plan)[0] #оптимизация for j in range(self.N): if verbose: print('point:', j) xdot = copy.deepcopy(plan[j]) function = lambda x: self.countMeanVbForAprior_S4000( o_g.replaceInList(plan, j, x))[0] boundsarr = list() for k in range(len(self.xstart)): boundsarr.append((self.xstart[k], self.xend[k])) #sol = optimize.minimize (function, xdot, bounds=boundsarr) #plan[j]=sol.x #В этом варианте не работает, хоть результат и проходит быстрее plan[j] = o_g.doublesearch(self.xstart, self.xend, xdot, function) dcurr = self.countMeanVbForAprior_S4000(plan)[0] if verbose: curtime = time.time() #in seconds st = datetime.datetime.fromtimestamp( time.time() - prevtime).strftime('%H:%M:%S') print( "{0} unoptimized-optimized: {1} {2} time spent: {3}". format('uniform' if i == 0 else '', unopt, dcurr, st)) prevtime = copy.copy(curtime) #FIXME починить отображение времени, кривизна ж неимоверная и ниработает!!!! if dcurr < dopt or planopt == None: dopt = dcurr planopt = plan except BaseException as e: print('This try failed, due to exception e=', e) tb = traceback.format_exc() print(tb) return planopt
def make_plan(self): res=list() for i in range(0, self.N): res.append(o_g.uniformVector(self.xstart, self.xend)) return res