Browse Source

added jupyter notebook

master
Hendrik Schutter 1 month ago
parent
commit
d1366606b3
  1. 180
      LiXX_Cell_Pack_Matcher.ipynb
  2. 14
      README.md

180
LiXX_Cell_Pack_Matcher.ipynb

@ -0,0 +1,180 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "timely-rogers",
"metadata": {},
"source": [
"# LiXX_Cell_Pack_Matcher\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "temporal-pipeline",
"metadata": {},
"outputs": [],
"source": [
"l"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "outer-america",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[('B01', 2124), ('B02', 2005), ('B03', 2127), ('B04', 2099), ('B05', 2117), ('B06', 1999), ('B07', 1999), ('B08', 1999), ('B09', 1999), ('B10', 1999), ('B11', 1999), ('B12', 1999)]\n"
]
}
],
"source": [
"cellList = [\n",
"('B01', 2124), \n",
"('B02', 2005),\n",
"('B03', 2127),\n",
"('B04', 2099),\n",
"('B05', 2117),\n",
"('B06', 1999),\n",
"('B07', 1999),\n",
"('B08', 1999),\n",
"('B09', 1999),\n",
"('B10', 1999),\n",
"('B11', 1999),\n",
"('B12', 1999)\n",
"];\n",
"\n",
"cellsParallel = int(2)\n",
"cellsSerial = int(6) # 6 for 6S LiXX and so on..\n",
"\n",
"if(cellsParallel*cellsSerial) != len(cellList):\n",
" print(\"Battery pack is not possible for this configuration\")\n",
"else:\n",
" print (cellList)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "southeast-enclosure",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"from itertools import combinations \n",
"import collections\n",
"\n",
"combCells = combinations(cellList, cellsParallel) #combine cells to parallel Pairs\n",
"combPacks = combinations(combCells, cellsSerial) #combine parallel Pairs to serial pack\n",
"\n",
"possiblePacks = []\n",
"possiblePacks.clear()\n",
"\n",
"for combPack in list(combPacks): \n",
" #print(\"combPack: \", combPack) \n",
" cellsPackList = []\n",
" cellsPackList.clear()\n",
" \n",
" for serialPair in combPack:\n",
" #print(\"CellPairsInThisPack: \", serialPair)\n",
" for cellsTmp in serialPair:\n",
" #print(\"CellInThisPair: \" , cellsTmp)\n",
" cellsPackList.append(cellsTmp);\n",
" if collections.Counter(cellsPackList) == collections.Counter(cellList):\n",
" #test if this pack is a possible solution\n",
" possiblePacks.append(combPack); \n",
" \n",
"bestSolution = (possiblePacks[0], 1000 );\n",
" \n",
"for possiblePack in possiblePacks:\n",
" #loop though a possible solution\n",
" #print(\"possiblePack: \", possiblePack);\n",
" \n",
" packMatchQuality = 0\n",
" \n",
" for serialPair in possiblePack:\n",
" #loop through the serial pairs\n",
" cellCapacityInThisPairList = []\n",
" cellCapacityInThisPairList.clear()\n",
" for cellsTmp in serialPair:\n",
" #loop through the cells in this serial paar\n",
" cellCapacityInThisPairList.append(cellsTmp[1]); #save capacity in list \n",
" \n",
" cv = lambda x: np.std(x, ddof=1) / np.mean(x) * 100\n",
" packMatchQuality = packMatchQuality + cv(np.array(cellCapacityInThisPairList))\n",
" \n",
" if bestSolution[1] > packMatchQuality:\n",
" bestSolution = (possiblePack, packMatchQuality );\n",
" \n",
"\n",
" \n",
" "
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "occupational-deadline",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Matching Quality: 0.9155148399305513\n",
"CellPairsInThisPack: (('B01', 2124), ('B03', 2127))\n",
"CellPairsInThisPack: (('B02', 2005), ('B06', 1999))\n",
"CellPairsInThisPack: (('B04', 2099), ('B05', 2117))\n",
"CellPairsInThisPack: (('B07', 1999), ('B08', 1999))\n",
"CellPairsInThisPack: (('B09', 1999), ('B10', 1999))\n",
"CellPairsInThisPack: (('B11', 1999), ('B12', 1999))\n"
]
}
],
"source": [
"print (\"Matching Quality: \", bestSolution[1]) \n",
"\n",
"for serialPair in bestSolution[0]:\n",
" #loop through the serial pairs\n",
" print(\"CellPairsInThisPack: \", serialPair)\n",
"\n",
" \n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "informative-sequence",
"metadata": {},
"outputs": [],
"source": []
}
],
"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.8.8"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

14
README.md

@ -1,3 +1,13 @@
# LiXX_Cell_Pack_Matcher
# LiXX Cell Pack Matcher
Tool for finding the best configuration in a LiXX Battery Pack. Matches capacity in parallel cell groups from a serial pack.
Tool for finding the best configuration in a LiXX Battery Pack.
Matches capacity in parallel cell groups from a serial pack.
## Working
- Matches cells bases on capacity for varius Pack configuration. Set parallel and serial cell count respectively.
- Supports labels as identifier for cells.
## Not Working
- Clould be faster, 6S2P needs more than 10min to compute
- Support internal cell resistance matching
- Support bigger cell pool for a pack that is needed
Loading…
Cancel
Save