Файл hvs.h
#if !defined(_HVS_H_)
#define _HVS_H_
const
paContinue = 0,
paDecompose = 1,
paMakeMatrix = 2,
paSumHvs = 3,
paRegular = 4;
const
errOk = 0,
errNoMemAllocated = -1,
errTooFewPoints = -2,
errCannotSolveSLAE = -3,
errRegFailed = -4,
errTooFewSplineNodes = -5,
errNoLogScale = -6,
errNoImpuls = -7,
errNoEMFCurve = -8,
errUserBreak = -10;
typedef
int (*PProgressFunc)( int action, int percent );
class CEMFTransform
{
protected:
// source data
double *IT, *II;
double *ET, *EMF;
int in, n;
// internal data
int SelfAlloc;
char *IntMem;
double *Coeff;
int m;
// parameters
double epsi, cthick;
int MakeMatrix( double *M, int *IM, double *HT, int &hn );
void MakeMatrixForReg( double *A, double *F, double *M, int *IM, int hn );
// Возвращает примерное количество коэффициентов разложения
int CountCoefficients();
// Удаляет из исходной кривой ЭДС времена, попадающие на импульс
// Возвращает количество удаленных точек
//
// Вход:
// Coeff - коэффициенты разложения (реально используется только первый)
// m - кол-во коэффициентов (не используется)
// ET - исходная кривая ЭДС (время)
// EMF - исходная кривая ЭДС (ЭДС)
// Выход:
// n - количество точек после удаления
// ET - новая кривая ЭДС (время)
// EMF - новая кривая ЭДС (ЭДС)
//
int DelImpulsTime();
public:
PProgressFunc ProgressFunc;
// regularization parameters
int MaxIter;
double maxdiff;
double mulcoeff;
double bettacoeff;
double maxinc;
double grouplevel;
CEMFTransform( double *aIT, double *aII, int ain,
double *aET, double *aEMF, int aen,
int aSelfAlloc = 0 )
{
ProgressFunc = NULL;
IT = aIT;
II = aII;
in = ain;
ET = aET;
EMF = aEMF;
n = aen;
epsi = 1e-4;
cthick = 1.01;
MaxIter = 100;
mulcoeff = maxdiff = 2;
bettacoeff = 10;
maxinc = 0.05;
grouplevel = 1;
IntMem = NULL;
Coeff = NULL;
SelfAlloc = aSelfAlloc;
if( SelfAlloc )SetIntMem( NULL );
}
~CEMFTransform()
{
if( SelfAlloc && IntMem != NULL )delete[] IntMem;
}
// Возвращает сколько памяти нужно для внутреннего использования (оценка сверху)
int CountInternalMem();
int CountInternalMem( int cn );
// Производит разложение исходного импульса в виде суммы функций хевисайда
//
// Вход:
// IT - импульс (время)
// II - импульс (ток)
// n - количество точек в импульсе
// epsi - изменение импульса в процентах
// epst - минимальный шаг по времени в процентах от начального шага
// cthick - коэффициент сгущения
// cnmax - максимальное количество коэффициентов разложения
//
// Выход:
// Coeff - коэффициенты разложения, пары вещ. чисел - 1-е вес, 2-е сдвиг по времени
// m - количество коэффициентов
//
int DecomposeImpuls();
// Восстанавливает ЭДС хевисайда, используя линейную интерполяцию
// Данная процедура допускает совпадение адресов ET/HT и Eds/HEds,
// но не частичное перекрывание этих областей.
//
// Вход:
// Coeff - коэффициенты разложения (см. DecomposeImpuls)
// m - кол-во коэффициентов
// ET - времена исходной кривой ЭДС
// EMF - значения исходной ЭДС, в соответсвующих временах
// n - количество точек кривой ЭДС
// IntMem - указатель на блок памяти для внутреннего использования,
// размер блока может быть получен через функцию CountInternalMem
//
// Выход:
// HT - времена для кривой ЭДС хевисайда
// HEMF - значения ЭДС хевисайда
// hn - количество точек кривой ЭДС хевисайда,
// всегда hn = n + 1
//
int RestHvsLin( double *HT, double *HEMF, int &hn );
int RestHvsLinReg( double *HT, double *HEMF, int &hn );
int RestHvsLinRegDiff( double *DEMF, double *HT, double *HEMF, int &hn );
// Суммируя кривые ЭДС хевисайда, используя линейную интерполяцию,
// генерирует новую кривую ЭДС, соответсвующую импульсу,
// заданному коэффициентами разложения
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.