summaryrefslogtreecommitdiff
path: root/E Series multiple divider calculator.ipynb
blob: 9b8a3aad0352fba07f5474599d8c36dab89459f6 (plain)
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 354,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import math\n",
    "import statistics\n",
    "from itertools import product\n",
    "\n",
    "from tabulate import tabulate\n",
    "\n",
    "from IPython.core.display import display, HTML"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 235,
   "metadata": {},
   "outputs": [],
   "source": [
    "e3 = np.array([1.0, 2.2, 4.7])\n",
    "e6 = np.array([1.0, 1.5, 2.2, 3.3, 4.7, 6.8])\n",
    "e12 = np.array([1.0, 1.2, 1.5, 1.8, 2.2, 2.7, 3.3, 3.9, 4.7, 5.6, 6.8, 8.2])\n",
    "e24 = np.array([1.0, 1.1, 1.2, 1.3, 1.5, 1.6, 1.8, 2.0, 2.2, 2.4, 2.7, 3.0, 3.3, 3.6, 3.9, 4.3, 4.7, 5.1, 5.6, 6.2, 6.8, 7.5, 8.2, 9.1])\n",
    "e48 = np.array([1.00, 1.05, 1.10, 1.15, 1.21, 1.27, 1.33, 1.40, 1.47, 1.54, 1.62, 1.69, 1.78, 1.87, 1.96, 2.05, 2.15, 2.26, 2.37, 2.49, 2.61, 2.74, 2.87, 3.01, 3.16, 3.32, 3.48, 3.65, 3.83, 4.02, 4.22, 4.42, 4.64, 4.87, 5.11, 5.36, 5.62, 5.90, 6.19, 6.49, 6.81, 7.15, 7.50, 7.87, 8.25, 8.66, 9.09, 9.53])\n",
    "e96 = np.array([1.00, 1.02, 1.05, 1.07, 1.10, 1.13, 1.15, 1.18, 1.21, 1.24, 1.27, 1.30, 1.33, 1.37, 1.40, 1.43, 1.47, 1.50, 1.54, 1.58, 1.62, 1.65, 1.69, 1.74, 1.78, 1.82, 1.87, 1.91, 1.96, 2.00, 2.05, 2.10, 2.15, 2.21, 2.26, 2.32, 2.37, 2.43, 2.49, 2.55, 2.61, 2.67, 2.74, 2.80, 2.87, 2.94, 3.01, 3.09, 3.16, 3.24, 3.32, 3.40, 3.48, 3.57, 3.65, 3.74, 3.83, 3.92, 4.02, 4.12, 4.22, 4.32, 4.42, 4.53, 4.64, 4.75, 4.87, 4.99, 5.11, 5.23, 5.36, 5.49, 5.62, 5.76, 5.90, 6.04, 6.19, 6.34, 6.49, 6.65, 6.81, 6.98, 7.15, 7.32, 7.50, 7.68, 7.87, 8.06, 8.25, 8.45, 8.66, 8.87, 9.09, 9.31, 9.53, 9.76])\n",
    "e192 = np.array([1.00, 1.01, 1.02, 1.04, 1.05, 1.06, 1.07, 1.09, 1.10, 1.11, 1.13, 1.14, 1.15, 1.17, 1.18, 1.20, 1.21, 1.23, 1.24, 1.26, 1.27, 1.29, 1.30, 1.32, 1.33, 1.35, 1.37, 1.38, 1.40, 1.42, 1.43, 1.45, 1.47, 1.49, 1.50, 1.52, 1.54, 1.56, 1.58, 1.60, 1.62, 1.64, 1.65, 1.67, 1.69, 1.72, 1.74, 1.76, 1.78, 1.80, 1.82, 1.84, 1.87, 1.89, 1.91, 1.93, 1.96, 1.98, 2.00, 2.03, 2.05, 2.08, 2.10, 2.13, 2.15, 2.18, 2.21, 2.23, 2.26, 2.29, 2.32, 2.34, 2.37, 2.40, 2.43, 2.46, 2.49, 2.52, 2.55, 2.58, 2.61, 2.64, 2.67, 2.71, 2.74, 2.77, 2.80, 2.84, 2.87, 2.91, 2.94, 2.98, 3.01, 3.05, 3.09, 3.12, 3.16, 3.20, 3.24, 3.28, 3.32, 3.36, 3.40, 3.44, 3.48, 3.52, 3.57, 3.61, 3.65, 3.70, 3.74, 3.79, 3.83, 3.88, 3.92, 3.97, 4.02, 4.07, 4.12, 4.17, 4.22, 4.27, 4.32, 4.37, 4.42, 4.48, 4.53, 4.59, 4.64, 4.70, 4.75, 4.81, 4.87, 4.93, 4.99, 5.05, 5.11, 5.17, 5.23, 5.30, 5.36, 5.42, 5.49, 5.56, 5.62, 5.69, 5.76, 5.83, 5.90, 5.97, 6.04, 6.12, 6.19, 6.26, 6.34, 6.42, 6.49, 6.57, 6.65, 6.73, 6.81, 6.90, 6.98, 7.06, 7.15, 7.23, 7.32, 7.41, 7.50, 7.59, 7.68, 7.77, 7.87, 7.96, 8.06, 8.16, 8.25, 8.35, 8.45, 8.56, 8.66, 8.76, 8.87, 8.98, 9.09, 9.20, 9.31, 9.42, 9.53, 9.65, 9.76, 9.88])\n",
    "\n",
    "def decades(series, n):\n",
    "    return np.hstack([series*(10**i) for i in range(n)] + [10**n])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 232,
   "metadata": {},
   "outputs": [],
   "source": [
    "def r_ratio(Utot, U2):\n",
    "    return Utot/U2 - 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 242,
   "metadata": {},
   "outputs": [],
   "source": [
    "def check_ratios(Utot, U2, series=e24, tolerance=0.01):\n",
    "    values = decades(series, 7)\n",
    "    ratios = np.outer(values, 1/values)\n",
    "    target_ratio = r_ratio(Utot, U2)\n",
    "    found = np.where(np.abs(1 - ratios/target_ratio) < tolerance)\n",
    "    return list(zip(values[found[0]], values[found[1]])), np.abs(1 - ratios/target_ratio)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 355,
   "metadata": {},
   "outputs": [],
   "source": [
    "def par(a, b):\n",
    "    return 1/(1/a + 1/b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 414,
   "metadata": {},
   "outputs": [],
   "source": [
    "def sig_round(val, ndigits):\n",
    "    log = math.floor(math.log10(val))\n",
    "    return round(val/(10**log), ndigits) * (10**log)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 430,
   "metadata": {},
   "outputs": [],
   "source": [
    "def crossref_ratios(Utots, U2, offx=0, series=e24, allow_parallel=False):\n",
    "    values = e24_n_decades(7)\n",
    "    par_map = { sig_round(par(a, b), 4): (a, b) for a, b in product(values, values) }\n",
    "    for val in values:\n",
    "        if val in par_map:\n",
    "            del par_map[val]\n",
    "    par_arr = np.array(list(par_map.keys()) + list(values))\n",
    "    if allow_parallel:\n",
    "        values_com = par_arr + offx/2\n",
    "    else:\n",
    "        values_com = values + offx/2\n",
    "    values_choice = values + offx\n",
    "    ratios = np.outer(values_choice, 1/values_com)\n",
    "    target_ratios = [ r_ratio(Utot, U2) for Utot in Utots ]\n",
    "    deltas = np.array([ np.abs(1 - ratios/target_ratio) for target_ratio in target_ratios])\n",
    "\n",
    "    deltas_x = deltas #[:,:,:len(series)]\n",
    "    idx_x, mins_x = deltas_x.argmin(axis=1), deltas_x.min(axis=1)\n",
    "    #errs_out_x = np.array([elem.dot(elem) for elem in np.swapaxes(mins_x, 0, 1)])\n",
    "    errs_out_x = mins_x.max(axis=0)\n",
    "    best_x = [ (errs_out_x[j], list(mins_x[:,j]), list(values_choice[idx_x[:,j]]), values_com[j]) for j in np.argsort(errs_out_x) ]\n",
    "\n",
    "    deltas_y = deltas #[:,:len(series),:]\n",
    "    idx_y, mins_y = deltas_y.argmin(axis=2), deltas_y.min(axis=2)\n",
    "    #errs_out_y = np.array([elem.dot(elem) for elem in np.swapaxes(mins_y, 0, 1)])\n",
    "    errs_out_y = mins_y.max(axis=0)\n",
    "    best_y = [ (errs_out_y[j], list(mins_y[:,j]), list(values_com[idx_y[:,j]]), values_choice[j]) for j in np.argsort(errs_out_y) ]\n",
    "    \n",
    "    return sorted(best_x), sorted(best_y), par_map"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 443,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "R1 fixed, R2 choices\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<table>\n",
       "<thead>\n",
       "<tr><th>R1 (3.8V)  </th><th>R1 (5.0V)  </th><th>R1 (12V)  </th><th>R2   </th><th>Δ                                                    </th><th>R total (min)  </th><th>R total (max)  </th><th>Iq    </th></tr>\n",
       "</thead>\n",
       "<tbody>\n",
       "<tr><td>1.60M      </td><td>2.20M      </td><td>5.60M     </td><td>300k </td><td>0.00%, 0.00%, <strong>1.75%</strong>                 </td><td>1.90M          </td><td>5.90M          </td><td>2.01μA</td></tr>\n",
       "<tr><td>160k       </td><td>220k       </td><td>560k      </td><td>30.0k</td><td>0.00%, 0.00%, <strong>1.75%</strong>                 </td><td>190k           </td><td>590k           </td><td>20.1μA</td></tr>\n",
       "<tr><td>360k       </td><td>510k       </td><td>1.30M     </td><td>68.0k</td><td>0.74%, <strong>2.27%</strong>, 0.62%                 </td><td>428k           </td><td>1.37M          </td><td>8.77μA</td></tr>\n",
       "<tr><td>180k       </td><td>240k       </td><td>620k      </td><td>33.0k</td><td><strong>2.27%</strong>, 0.83%, 1.12%                 </td><td>213k           </td><td>653k           </td><td>18.2μA</td></tr>\n",
       "<tr><td>1.80M      </td><td>2.40M      </td><td>6.20M     </td><td>330k </td><td><strong>2.27%</strong>, 0.83%, 1.12%                 </td><td>2.13M          </td><td>6.53M          </td><td>1.82μA</td></tr>\n",
       "<tr><td>1.20M      </td><td>1.60M      </td><td>4.30M     </td><td>220k </td><td>2.27%, 0.83%, <strong>2.87%</strong>                 </td><td>1.42M          </td><td>4.52M          </td><td>2.69μA</td></tr>\n",
       "<tr><td>120k       </td><td>160k       </td><td>430k      </td><td>22.0k</td><td>2.27%, 0.83%, <strong>2.87%</strong>                 </td><td>142k           </td><td>452k           </td><td>26.9μA</td></tr>\n",
       "<tr><td>130k       </td><td>180k       </td><td>470k      </td><td>24.0k</td><td>1.56%, 2.27%, <strong>3.07%</strong>                 </td><td>154k           </td><td>494k           </td><td>24.5μA</td></tr>\n",
       "<tr><td>1.30M      </td><td>1.80M      </td><td>4.70M     </td><td>240k </td><td>1.56%, 2.27%, <strong>3.07%</strong>                 </td><td>1.54M          </td><td>4.94M          </td><td>2.45μA</td></tr>\n",
       "<tr><td>430k       </td><td>620k       </td><td>1.60M     </td><td>82.0k</td><td>1.68%, <strong>3.10%</strong>, 2.70%                 </td><td>512k           </td><td>1.68M          </td><td>7.23μA</td></tr>\n",
       "<tr><td>110k       </td><td>150k       </td><td>390k      </td><td>20.0k</td><td><strong>3.13%</strong>, 2.27%, 2.63%                 </td><td>130k           </td><td>410k           </td><td>29.3μA</td></tr>\n",
       "<tr><td>1.10M      </td><td>1.50M      </td><td>3.90M     </td><td>200k </td><td><strong>3.13%</strong>, 2.27%, 2.63%                 </td><td>1.30M          </td><td>4.10M          </td><td>2.93μA</td></tr>\n",
       "<tr><td>330k       </td><td>470k       </td><td>1.20M     </td><td>62.0k</td><td>0.20%, <strong>3.37%</strong>, 1.87%                 </td><td>392k           </td><td>1.26M          </td><td>9.53μA</td></tr>\n",
       "<tr><td>620k       </td><td>910k       </td><td>2.20M     </td><td>120k </td><td>3.12%, 3.41%, <strong>3.51%</strong>                 </td><td>740k           </td><td>2.32M          </td><td>5.05μA</td></tr>\n",
       "<tr><td>270k       </td><td>360k       </td><td>1.00M     </td><td>51.0k</td><td>0.74%, <strong>3.74%</strong>, 3.20%                 </td><td>321k           </td><td>1.05M          </td><td>11.8μA</td></tr>\n",
       "<tr><td>820k       </td><td>1.20M      </td><td>3.00M     </td><td>160k </td><td><strong>3.91%</strong>, 2.27%, 1.32%                 </td><td>980k           </td><td>3.16M          </td><td>3.78μA</td></tr>\n",
       "<tr><td>470k       </td><td>680k       </td><td>1.80M     </td><td>91.0k</td><td>3.16%, 1.90%, <strong>4.11%</strong>                 </td><td>561k           </td><td>1.89M          </td><td>6.53μA</td></tr>\n",
       "<tr><td>1.50M      </td><td>2.00M      </td><td>5.10M     </td><td>270k </td><td><strong>4.17%</strong>, 1.01%, 0.58%                 </td><td>1.77M          </td><td>5.37M          </td><td>2.19μA</td></tr>\n",
       "<tr><td>150k       </td><td>200k       </td><td>510k      </td><td>27.0k</td><td><strong>4.17%</strong>, 1.01%, 0.58%                 </td><td>177k           </td><td>537k           </td><td>21.9μA</td></tr>\n",
       "<tr><td>100k       </td><td>130k       </td><td>330k      </td><td>18.0k</td><td><strong>4.17%</strong>, 1.52%, 3.51%                 </td><td>118k           </td><td>348k           </td><td>33.5μA</td></tr>\n",
       "<tr><td>1.00M      </td><td>1.30M      </td><td>3.30M     </td><td>180k </td><td><strong>4.17%</strong>, 1.52%, 3.51%                 </td><td>1.18M          </td><td>3.48M          </td><td>3.35μA</td></tr>\n",
       "<tr><td>200k       </td><td>270k       </td><td>680k      </td><td>36.0k</td><td><strong>4.17%</strong>, 2.27%, 0.58%                 </td><td>236k           </td><td>716k           </td><td>16.4μA</td></tr>\n",
       "<tr><td>2.00M      </td><td>2.70M      </td><td>6.80M     </td><td>360k </td><td><strong>4.17%</strong>, 2.27%, 0.58%                 </td><td>2.36M          </td><td>7.16M          </td><td>1.64μA</td></tr>\n",
       "<tr><td>240k       </td><td>330k       </td><td>910k      </td><td>47.0k</td><td><strong>4.26%</strong>, <strong>4.26%</strong>, 1.90%</td><td>287k           </td><td>957k           </td><td>13.0μA</td></tr>\n",
       "<tr><td>2.40M      </td><td>3.30M      </td><td>9.10M     </td><td>470k </td><td><strong>4.26%</strong>, <strong>4.26%</strong>, 1.90%</td><td>2.87M          </td><td>9.57M          </td><td>1.30μA</td></tr>\n",
       "<tr><td>680k       </td><td>910k       </td><td>2.40M     </td><td>130k </td><td>1.92%, <strong>4.55%</strong>, 2.83%                 </td><td>810k           </td><td>2.53M          </td><td>4.75μA</td></tr>\n",
       "<tr><td>560k       </td><td>820k       </td><td>2.00M     </td><td>110k </td><td><strong>4.55%</strong>, 1.65%, 4.31%                 </td><td>670k           </td><td>2.11M          </td><td>5.58μA</td></tr>\n",
       "<tr><td>220k       </td><td>330k       </td><td>820k      </td><td>43.0k</td><td>4.07%, <strong>4.65%</strong>, 0.37%                 </td><td>263k           </td><td>863k           </td><td>13.9μA</td></tr>\n",
       "<tr><td>2.20M      </td><td>3.30M      </td><td>8.20M     </td><td>430k </td><td>4.07%, <strong>4.65%</strong>, 0.37%                 </td><td>2.63M          </td><td>8.63M          </td><td>1.39μA</td></tr>\n",
       "<tr><td>300k       </td><td>430k       </td><td>1.10M     </td><td>56.0k</td><td>0.45%, <strong>4.71%</strong>, 3.38%                 </td><td>356k           </td><td>1.16M          </td><td>10.4μA</td></tr>\n",
       "<tr><td>200k       </td><td>300k       </td><td>750k      </td><td>39.0k</td><td>3.85%, <strong>4.90%</strong>, 1.21%                 </td><td>239k           </td><td>789k           </td><td>15.3μA</td></tr>\n",
       "<tr><td>2.00M      </td><td>3.00M      </td><td>7.50M     </td><td>390k </td><td>3.85%, <strong>4.90%</strong>, 1.21%                 </td><td>2.39M          </td><td>7.89M          </td><td>1.53μA</td></tr>\n",
       "<tr><td>820k       </td><td>1.10M      </td><td>3.00M     </td><td>150k </td><td>2.50%, 0.00%, <strong>5.26%</strong>                 </td><td>970k           </td><td>3.15M          </td><td>3.91μA</td></tr>\n",
       "<tr><td>390k       </td><td>560k       </td><td>1.50M     </td><td>75.0k</td><td>2.50%, 1.82%, <strong>5.26%</strong>                 </td><td>465k           </td><td>1.57M          </td><td>7.89μA</td></tr>\n",
       "<tr><td>510k       </td><td>750k       </td><td>2.00M     </td><td>100k </td><td>4.38%, 2.27%, <strong>5.26%</strong>                 </td><td>610k           </td><td>2.10M          </td><td>5.94μA</td></tr>\n",
       "<tr><td>2.70M      </td><td>3.60M      </td><td>9.10M     </td><td>510k </td><td>0.74%, 3.74%, <strong>6.09%</strong>                 </td><td>3.21M          </td><td>9.61M          </td><td>1.22μA</td></tr>\n",
       "<tr><td>3.00M      </td><td>4.30M      </td><td>9.10M     </td><td>560k </td><td>0.45%, <strong>4.71%</strong>, 14.47%                </td><td>3.56M          </td><td>9.66M          </td><td>1.11μA</td></tr>\n",
       "<tr><td>3.30M      </td><td>4.70M      </td><td>9.10M     </td><td>620k </td><td>0.20%, <strong>3.37%</strong>, 22.75%                </td><td>3.92M          </td><td>9.72M          </td><td>1.05μA</td></tr>\n",
       "<tr><td>3.60M      </td><td>5.10M      </td><td>9.10M     </td><td>680k </td><td>0.74%, 2.27%, <strong>29.57%</strong>                </td><td>4.28M          </td><td>9.78M          </td><td>993nA </td></tr>\n",
       "<tr><td>3.90M      </td><td>5.60M      </td><td>9.10M     </td><td>750k </td><td>2.50%, 1.82%, <strong>36.14%</strong>                </td><td>4.65M          </td><td>9.85M          </td><td>941nA </td></tr>\n",
       "<tr><td>4.30M      </td><td>6.20M      </td><td>9.10M     </td><td>820k </td><td>1.68%, 3.10%, <strong>41.59%</strong>                </td><td>5.12M          </td><td>9.92M          </td><td>888nA </td></tr>\n",
       "<tr><td>4.70M      </td><td>6.80M      </td><td>9.10M     </td><td>910k </td><td>3.16%, 1.90%, <strong>47.37%</strong>                </td><td>5.61M          </td><td>10.0M          </td><td>842nA </td></tr>\n",
       "<tr><td>5.10M      </td><td>7.50M      </td><td>9.10M     </td><td>1.00M</td><td>4.38%, 2.27%, <strong>52.11%</strong>                </td><td>6.10M          </td><td>10.1M          </td><td>800nA </td></tr>\n",
       "<tr><td>5.60M      </td><td>8.20M      </td><td>9.10M     </td><td>1.10M</td><td>4.55%, 1.65%, <strong>56.46%</strong>                </td><td>6.70M          </td><td>10.2M          </td><td>760nA </td></tr>\n",
       "<tr><td>6.20M      </td><td>9.10M      </td><td>9.10M     </td><td>1.20M</td><td>3.12%, 3.41%, <strong>60.09%</strong>                </td><td>7.40M          </td><td>10.3M          </td><td>721nA </td></tr>\n",
       "<tr><td>6.80M      </td><td>9.10M      </td><td>9.10M     </td><td>1.30M</td><td>1.92%, 4.55%, <strong>63.16%</strong>                </td><td>8.10M          </td><td>10.4M          </td><td>701nA </td></tr>\n",
       "<tr><td>8.20M      </td><td>9.10M      </td><td>9.10M     </td><td>1.50M</td><td>2.50%, 17.27%, <strong>68.07%</strong>               </td><td>9.70M          </td><td>10.6M          </td><td>665nA </td></tr>\n",
       "<tr><td>8.20M      </td><td>9.10M      </td><td>9.10M     </td><td>1.60M</td><td>3.91%, 22.44%, <strong>70.07%</strong>               </td><td>9.80M          </td><td>10.7M          </td><td>659nA </td></tr>\n",
       "</tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "Utots = [3.8, 5, 12]\n",
    "U2 = 0.6\n",
    "series = e48\n",
    "r_tot_min, r_tot_max = 100e3, 10e6\n",
    "\n",
    "si_prefix = ['y', 'z', 'a', 'f', 'p', 'n', 'μ', 'm', '', 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y']\n",
    "def format_si(val, digits=2, suffix='', unity_prefix=''):\n",
    "    mul = math.floor(math.log10(val))\n",
    "    prefixes = [prefix or unity_prefix for prefix in si_prefix]\n",
    "    prefix = prefixes[min(len(si_prefix)-1, max(0, si_prefix.index('') + mul//3))]\n",
    "    le_format = f'{{:.{digits-mul%3}f}}{{}}{{}}'\n",
    "    return le_format.format(val/(10**(mul//3*3)), prefix, suffix)\n",
    "format_r = lambda val, digits=2: format_si(val, digits=digits, unity_prefix='R')\n",
    "\n",
    "com = 'low'\n",
    "#com ='high'\n",
    "\n",
    "data = []\n",
    "best_x, best_y, par_map = crossref_ratios(Utots, U2, series=series, allow_parallel=False)\n",
    "print('R1 fixed, R2 choices')\n",
    "for _acc, deltas, r1_vals, r2 in best_x if com == 'low' else best_y:\n",
    "    if len(data) >= 50:\n",
    "        break\n",
    "        \n",
    "    r_tots = [ r1+r2 for r1 in r1_vals ]\n",
    "    iqs = [u/(r1+r2) for r1, u in zip(r1_vals, Utots)]\n",
    "    iq = statistics.mean(iqs)\n",
    "    #if min(r_tots) > r_tot_max or max(r_tots) < r_tot_min:\n",
    "    \n",
    "    if not r_tot_min < min(r_tots) < r_tot_max:\n",
    "        continue\n",
    "        \n",
    "    r1_vals = [ format_r(val) for val in r1_vals ]\n",
    "    deltas = [ f'{d:.2%}' for d in deltas ]\n",
    "    deltas = [ f'<strong>{d}</strong>' if d == max(deltas) else d for d in deltas ]\n",
    "    data.append((\n",
    "        *r1_vals,\n",
    "        f'{format_r(par_map[r2][0])} || {format_r(par_map[r2][1])}' if r2 in par_map else f'{format_r(r2)}',\n",
    "        f'{\", \".join(deltas)}',\n",
    "        f'{format_r(min(r_tots))}', f'{format_r(max(r_tots))}',\n",
    "        f'{format_si(iq, suffix=\"A\")}'))\n",
    "s, c = (1,2) if com == 'low' else (2,1)\n",
    "display(HTML(tabulate(data, [*[ f'R{s} ({format_si(u, suffix=\"V\", digits=1)})' for u in Utots ], f'R{c}', 'Δ', 'R total (min)', 'R total (max)', 'Iq'], tablefmt='html')))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}