/
Estimation_instructions.txt
132 lines (97 loc) · 5.45 KB
/
Estimation_instructions.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
Наставление по написанию оценочных скриптов (кейсов)
Общие положения
Скрипты оценки бывают для явных и неявных функций. В настоящей версии Наставления описана методика создания скриптов для неявных функций
(уравнений Кирхгофа, в частности)
Стандартный набор векторов
x
b
c
y
Глобальные переменные
numnone=0 #количество раз, когда функция вернула None, не справившись с оценкой тока
Реестр стандартных функций
Общие положения
Стандартные функции идут в начале файла и точно в порядке, указанном ниже.
Названия функций формируются следующим образом - ставится префикс, _ и затем название кейса или подкейса.
Если в одном файле кейса исследуются две модели, то в начале файла размещается описание моделей, ссылки на теоретические положения
(как вариант, на раздел диссертации) и так далее.
Внутреннее содержание функций возможно наиболее приближено к приводимому в примере вплоть до названий переменных
def func_name(y,x,b,c)
Уравнения Кирхгофа. На входе значения, на выходе вектор значений y (list)
def solver_name (x,b,c=None):
Основная функция. Отражает модель - на входе входные вектора, на выходе - выходные
Возвращает solx=optimize.root(...).x
def Jac_name (x,b,c,y):
Якобиан векторной функции (модели)
Возвращает jacf=np.dot(np.linalg.inv(dfdy(y,x,b,c)), dfdb(y,x,b,c) )
def test_name():
Функция тестирования работы модели. Не возвращает ничего.
Выводит график модели через pyplot
def extraction_name():
Функция экстрагирования параметров
Примеры оформления функций
def func_Kirch_DiodeV2Mod2DirectBranch(y,x,b,c):
"""
[Реестровая]
Уравнение Кирхгофа
:param y:
:param x:
:param b:
:param c:
:return:
"""
global FT
mm=float(b[0]*(math.exp((x[0]-y[0]*b[2])/(FT*b[1])) -1)-y[0])
return [mm]
def solver_Kirch_DiodeV2Mod2DirectBranch (x,b,c=None):
"""
[Реестровая]
:param x:
:param b:
:param c:
:return:
"""
global numnone
global FT
dfdy=lambda y,x,b,c=None: np.array ([[ -1 - b[0]*b[2]*math.exp((-b[2]*y[0] + x[0])/(FT*b[1]))/(FT*b[1])]])
func = func_Kirch_DiodeV2Mod2DirectBranch
solvinit=[1]
try:
solx=optimize.root(func, solvinit, args=(x,b,c), jac=dfdy, method='lm').x
#http://stackoverflow.com/questions/2566412/find-nearest-value-in-numpy-array
#http://codereview.stackexchange.com/questions/28207/is-this-the-fastest-way-to-find-the-closest-point-to-a-list-of-points-using-nump
except BaseException as e:
#print ('diodeResistorIMPLICITfunction: Error in findroot=',e)
numnone+=1
return None
if solx-solvinit==[0]*len(solx):
numnone+=1
return None
return solx
def Jac_Kirch_DiodeV2Mod2DirectBranch (x,b,c,y):
global FT
dfdb=lambda y,x,b,c: np.matrix( [ [math.exp((-b[2]*y[0] + x[0])/(FT*b[1])) - 1,
-b[0]*(-b[2]*y[0] + x[0])*math.exp((-b[2]*y[0] + x[0])/(FT*b[1]))/(FT*b[1]**2),
-b[0]*y[0]*math.exp((-b[2]*y[0] + x[0])/(FT*b[1]))/(FT*b[1])] ])
dfdy=lambda y,x,b,c: np.matrix ([ -1 - b[0]*b[2]*math.exp((-b[2]*y[0] + x[0])/(FT*b[1]))/(FT*b[1])])
#возвращает структурную матрицу
#jacf=lambda x,b,c,y: jjacf(x,b,c,y,dfdb,dfdy)
jacf=np.dot(np.linalg.inv(dfdy(y,x,b,c)), dfdb(y,x,b,c) )
return jacf
def test_Kirch_DiodeV2Mod2DirectBranch():
b=[1.238e-14, 1.8, 1000]
#0.0026638081177255196
rng=np.arange(0.01,1.5,0.01)
#снимем ВАХ
resrng=[diodeResistorIMPLICITfunction ([x],b)[0] for x in rng] # изменяем напряжение на базе при постоянном напряжении на коллекторе - снимаем ток базы.
# resrngorig=[casesDiode.diode([x],b)[0] for x in rng] # изменяем напряжение на базе при постоянном напряжении на коллекторе - снимаем ток базы.
b=[1.238e-14, 1.8, 3000]
resrng1=[diodeResistorIMPLICITfunction ([x],b)[0] for x in rng] # изменяем напряжение на базе при постоянном напряжении на коллекторе - снимаем ток базы.
# plt.plot(rng , resrngorig, label='r=0')
plt.plot(rng , resrng, label='r=1000')
plt.plot(rng , resrng1, label='r=3000')
plt.legend(loc='upper left')
#plt.axis([0.0,1.0,0,5])
plt.grid()
plt.show()
Наставление по подгонке параметров