Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Ко вчерашней интерполяции по сплайну еще нарыл сводную сестру - экстраполяцию полиномом. Комментарии сохранены оригинальными от cout(+)

Отправлено Lameг 19 января 2007 г. 10:16
В ответ на: Иваныч, спасибо за сообщение (по рисунку[->]). Получается что функция crc32_tbl_buf что находится в тестах сахары некорректна ? [->] отправлено megajohn 19 января 2007 г. 09:28

Экстраполяция, как и всякое предсказание, вещь опасная. Поэтому,
когда Вас будут сжигать на костре, не бегайте после за мной с
ножницами, и не пытайтесь отрезать у меня самое дорогое что есть.
Короче:
Если об характере измеряемого процесса вообще ничего не известно,
то тем хуже для Вас, а для интерполяции-экстраполяции придется
применить полином, например Ньютона, который хорош и для интерполяции,
и для экстраполяции (при небольшом, менее половины периода между узлами, выходе за пределы измеренного интервала).
Все делается очень просто (покажу на примере 6 узловых точек):
Пусть в известные Вам 6 точек времени Вы намеряли 6 значений и хотите построить на экране плавненький график. И этот график немного продолжить влево и вправо.
1. Сохраните измеренные значения (вольты, омы, градусы, литры...) во float-виде в
глобальном массиве Yy[1]...Yy[6].
(Обратите внимание, что здесь индекс массива идет не с нуля, а с 1. Это рудимент
Бейсика, т.к. первоначально программа была написана на нем, и работала на
Синклере и БК).
2. ВременА измерений сохраните во float-виде в глобальном массиве Xx[1]...Xx[6]
(Конечно, каждое время Xx[i] должно соответствовать "своему" Yy[i] ).
Пусть для определенности временА измерений 1, 2, 3, 4, 5, 6 мс. Промежутки между
измерениями, вообще-то, могут быть неодинаковыми. Полиному пох.
3. Ну, и запускайте функцию задавая ей в качестве аргумента интересующее Вас время.
"Просканируйте" таким образом Ваш временной диапазон - и выводите
график на экран прибора.
4. С чувством выполненного долга займите очередь в кассу предприятия за премией.
Примеры вызова:
Value1 = Polynom( 1.5 ); // вычислит значение функции для 1.5 мс
........................
Value2 = Polynom( 4.0 ); // вычислит значение функции для 4 мс
........................
Короче, входные данные, используемые функцией Polynom готовятся абсолютно так же, как и для сплайна (см. пост про сплайн).
Предупреждаю! При "дальней" экстраполяции, да еще если Ваши узловые точки измерены "неаккуратно" ( т.е. присутствует некая случайная помеха-погрешность), то график на участке экстраполяции может выписывать такие кренделя...
Исходный код на Си:
////////////////////////////////////////////
#define MAXIMAL 6
/****************************************************/
float powr(float dd,unsigned char uu)
{
unsigned char zz;
float di;

di = dd;

for( zz=1; zz {
dd *= di;
}/*for*/
return( dd);
}/*powr*/
/****************************************************/

/****************************************************/
float Polynom(float TimePoint)
{
unsigned char ii,kk,jj,ll,mm,qq;
float Aa[ MAXIMAL+2 ], Ff[ MAXIMAL+2 ], Yyz[ MAXIMAL+2 ], Xxz[ MAXIMAL+2 ];
float Rr,Pp,Ww,Ss;

Aa[1] = 1.00;

for( ii=1; ii <= MAXIMAL; ii++ )
{
Yyz[ ii ] = Yy[ ii ];
Xxz[ ii ] = Xx[ ii ];
}/*for*/

for( ii=1; ii < MAXIMAL; ii++ ) { Ff[ii] = 0.00; }
Ff[MAXIMAL] = Yyz[1];

for( kk=1; kk <= (MAXIMAL-1); kk++ )
{
for( ii=1; ii <= (MAXIMAL-kk); ii++ )
{
Yyz[ii] = (Yyz[ii+1]-Yyz[ii])/(Xxz[ii+kk]-Xxz[ii]);
}/*for ii*/

Rr = 1.000;

if( kk & 0x01 ) { Rr = (-1.000); }

Pp = 1.000;

for( jj=1; jj<=kk; jj++ ) { Pp *= Xxz[jj]; }

Aa[kk+1] = Rr * Pp;
if( kk != 1 )
{
for( ll=1; ll<=kk; ll++ )
{
Ww = 0.00;
for( mm=1; mm<=ll; mm++ )
{
Rr = 1.000;
if( kk & 0x01 ) { Rr = (-1.000); }
Ss = 0.000;
for( qq=1; qq<=kk; qq++ )
{
Ss = Ss+(Rr*(powr((1.0000/Xxz[qq]),mm) ));
}/*for*/
Ww = Ww + ((-Rr)*Aa[kk+1+mm-ll]*Ss);
}/*for mm*/
Aa[kk+1-ll] = Ww / (float)(ll);
}/*for ll*/
}/*if(kk!=1)*/

for( jj=MAXIMAL; jj>=(MAXIMAL-kk); jj-- )
{
Ff[jj] = Ff[jj] + Aa[jj+kk+1-MAXIMAL] * Yyz[1];
}/*for jj*/

}/*for kk*/

Rr = TimePoint;

Ss = Ff[1];
for( ii=1; ii<=(MAXIMAL-1); ii++)
{
Ss = (Ss*Rr) + Ff[ii+1];
}/*for*/

return (Ss);

}/*Polynom*/
/****************************************************/


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 234:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru