Разложение импульса.Разложение ЭДС.Использование регуляризации, страница 12

                                                                       Приложение

Текст программ

Файл 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 );

// Суммируя кривые ЭДС хевисайда, используя линейную интерполяцию,

// генерирует новую кривую ЭДС, соответсвующую импульсу,

// заданному коэффициентами разложения