Рассмотрим масштабированную кривую зависимости напряжения батареи от уровня заряда, полученную на предыдущем занятии. Для процесса разрядки соотеветствующие значения хранятся в переменных Vd1 (напряжение от 3 В до 4.2 В) и SOC1dn (уровни заряда от 0 до 1, соотвестственно). Для удобства и экономии времени расчета эти переменные можно сохранить на диск в файл, с инменм, например, V_SoC.mat (из панели переменных вручную или командой save).
Соотвественно, для решения задачи иетерполяции удобно создать новый m-файл, загрузив в его начале нужные данные как
load V_SoC
Набор типичных комбинаций функций, используемый для представления зависимости V(SoC) можно найти в статье или выборке из нее, приведенной на 8 слайде презентации вводного занятия.
Для начала рассмотрим два варианта: (1) полиномиальную интерполяцию и (2) интерполяцию моделью Нернста.
%% Polynomial model
Для аппроксимации данных полиномом степени n используется функция polyfit, которая возвращает коэффициенты при степенях аргумента, упорядоченные от n до 0 (т.е для константы), необходиму степень полинома можно в первом приближении подобрать визуально, увеличивая их, пока кривая не станет проходить достаточно близко к точкам данных, но не будут возникать паразитные колебания; в данном случае - это полином 10 степени (посленее число в аргументе polyfit):
p=polyfit(SOC1dn,Vd1,10);
Полученные коэффиценты используются для вычисления аппроксимирующих данных с помощью функции polyval; второй аргумент - те точки, в которых нужно вычислить полиномиальную аппроксимацию:
V_poly=polyval(p,SOC1dn);
%% Nernst model
Вторая модель - более простая в смысле количества членов, которые, кроме того, имеют определенное физичсекое обоснования (модель Нернста в терминогии использумой статьи). Однако, т.к. в нее входят логарифмы, а логарифм нуля равен минус бесконечности, соответствующие точки надо исключить из данных:
L=length(Vd1);
ind=find((SOC1dn>0)&(SOC1dn<1));
Далее формируется набор трех функций, оперирующих с входными данными - каждая задает сою отдельную колонку
F=@(s) [ones(length(ind),1),log(s),log(1-s)];
Вычисляются значения этих функций от заданных значений аргумента - данных:
X=F(SOC1dn(ind)');
Заначения данных отклика без граничных точек:
Y=Vd1(ind)';
И нахождение коэффициентов при составляющих фунцию F (фактически - решение линейной системы путем умножения на обратную матрицу)
k=X\Y;
K=meshgrid(k,Y);
V_Nernst=sum((K.*X)');