Предварительно выбраны напряжения при разрядке Vd и зарядке Vc батареи и рассчитаны методом подсчёта протекшего заряда (интегрирование тока по отношению к номинальной емкости) соответствующие им уровни заряда SoSd и SoCc. Соответствующие графики:
Для этого построим график зависимости SoC от напряжения, проведем интерполяцию кубическими сплайнами. используя функцию spline и сделаем выборку SoC на равномерной сетке с конечными узлами в 3 В и 4.2 В, сгенерированной функцией linspace.
Пример кода для кривой разрядки:
Vd1=linspace(3,4.2,201);
[uVd,indu]=unique(Vd);
step=10;
SOCd1=spline(uVd(1:step:end),SOCd(indu(1:step:end)),Vd1);
и график, иллюстрирующий результаты процедуры, на котором показаны все исходные точки (кружки), прореженные с шагом step точки, использованные для сплайн-интерполяции и сам сплайн в стандартизированных границах:
На нижней панели видно, что прореживание нужно для двух целей: (1) исходные точки обладают определенным разбросом, выбор их меньшего количества (с увеличенным шагом дискретизации) делает сплайн-кривую более гладкой (по определению алгоритма она проходит через все точки, т.е. тут - через прореженные, а остальные образуют разброс вокруг этой кривой); (2) гладкость кривой и достаточно большой шаг дискретизации нужны для более аккуратной экстраполяции (т.к. измеренное напряжение ниже, чем 4.2 В) - экстраполирование интерполяционными сплайнами имеет смысл на расстояние не слишком сильно превышающее расстояние между четырьмя точками, использованными для интерполяции.
Примечания: функция unique использована для того, чтобы оставить только неповторяющиеся узлы, что требуется при сплайн-интерполяции (если таковых нет, то ее можно опустить и работать с исходной выборкой); контроль шага прореживания в первом приближении следует делать визуально по разумности хода кривой экстраполяции и равномерности разброса исходных точек вокруг интерполирующей кривой кривой.
Теперь можно перемасштабировать SoC, сдвинув полученную кривую в ноль на левой границе и сжав ее так, чтобы правый конец пришелся ровно на единицу:
SOC1dn=(SOCd1-SOCd1(1))/(max(SOCd1)-SOCd1(1));
Совмещение исходных и перемасштабированных графиков: