пятница, 17 октября 2025 г.

Аппроксимация линейной комбинацией функций

 Рассмотрим масштабированную кривую зависимости напряжения батареи от уровня заряда, полученную на предыдущем занятии. Для процесса разрядки соотеветствующие значения хранятся в переменных 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)');