[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
Извиняюсь за задержку - вчера предложили сходить в оперетту, не смог отказаться. Поэтому не заслал сюда свой вариант задачи.
Вычисление аппроксимирующей функции (МНК с ортогональным базисом).
Источник - А.Е. Мудров, "Численные методы для ПЭВМ", Томск, МП "Раско", 1991г.
Задача, вполне характерная для Embedded.
#define PolynomSize 6
#define TestSize 12typedef struct
{
float A,B,C;
}PolynomType;
PolynomType Curva[PolynomSize] =
{
{ 0.000000e+00, 0.000000e+00, 6.572746e-01 },
{ 1.538023e-01, 1.200000e+01, 2.461351e+00 },
{ 1.797707e-01, 9.678312e-03, -2.489141e+00 },
{ 1.632455e-01, 3.831551e-03, 1.029298e+01 },
{ 1.654519e-01, 4.851670e-03, -5.139529e+01 },
{ 1.605135e-01, 3.762015e-03, 1.107173e+03 }
};float TestData[TestSize]=
{
0.2986275,
0.2941434,
0.2738411,
0.2384701,
0.2033925,
0.1462702,
0.11052120,
0.08661973,
0.06680501,
0.05025315,
0.04257548,
0.03410769
};float Fx (float Input)
{
float Result=Curva[0].C,S=0,Q=1,D;
unsigned char i;
for(i=1;i{
D=(Input-Curva[i].A)*Q-Curva[i].B*S;
Result+=Curva[i].C*D;
S=Q;
Q=D;
}
Result=((1/Result)-1);
return (Result);
}
float Output[TestSize];
void main (void)
{
unsigned char i;
*(unsigned int*)0x120=0x5A80; //disable WDT
// Label1
for(i=0; iOutput[i]=Fx(TestData[i]);
// Label2
}
E-mail: info@telesys.ru