реклама на сайте
подробности

 
 
> Как интегрировать алгоритм в m файле в симулинк?, Использовать итерационный алгоритм заданый кодом в модели
des00
сообщение Jan 25 2010, 13:43
Сообщение #1


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Добрый день!

Есть модель выравнивания двух потоков данных, на основе их корреляции в симулинке. В ручном режиме, с помощью фильтров с переменной задержкой и slider gain я могу выровнять потоки в ручную. Но хотелось бы сделать автоматически. Сложность у меня вот в чем. Алгоритм выравнивания поделен на 2 этапа :
1. Поиск средней задержки, на основе поиска максимума корреляционной функции с помощью перебора.
2. Удержания выравнивания с помощью метода градиентного спуска.
Кодом такая конструкция описывается элементарно, два цикла, переход из одного в другой по условию. Но вот как перенести это в симулинк? Делать графический аналог (рисовать КА, делать case и т.д.) нет никакого желания, а использование встроенных матлабовских функций ограниченно тем, что от вызова к вызову переменные функции не сохраняются. Переносить всю модель в m файлы тоже не хотелось бы, все таки симулинк вещь более наглядная %)
Можно было бы использовать ступенчатую функцию и переключаться между двумя алгоритмами, но во первых время 1 ого этапа может варьироваться (от размера шага), а во вторых коряво это как то %)

Может есть более красивый способ?

Спасибо.


--------------------
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
des00
сообщение Jan 29 2010, 12:45
Сообщение #2


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



С помощью persistent получилось сделать то, что хотел. Конечно не совсем красиво, но тем не менее. Но обнаружил занятный баг, который никак не могу понять почему происходит. В коде есть такое место смены состояния
Код
delta_delay = 0.5;
max_delay   = 9;
...
    if delay < max_delay
        if value > max_value
            max_value = value;
            max_value_delay = delay;
        end
        delay = delay + delta_delay;        
    else
        delay = max_value_delay;
        state = state + 1; % go to hold state
    end
..

так вот, когда delta_delay = 0.5 смена состояний происходит корректно при delay = 9
Прикрепленное изображение

а вот когда delta_delay = 0.1 смена состояний происходит при delay = 9.1.
Прикрепленное изображение

Почему, не понятно, моделька в аттаче %)
Прикрепленные файлы
Прикрепленный файл  test_fsm_R14.zip ( 8.3 килобайт ) Кол-во скачиваний: 23
 


--------------------
Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Jan 29 2010, 13:59
Сообщение #3


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 646
Регистрация: 15-07-06
Из: г.Донецк ДНР
Пользователь №: 18 832



Цитата(des00 @ Jan 29 2010, 14:45) *


завтра гляну
Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Jan 30 2010, 13:13
Сообщение #4


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 646
Регистрация: 15-07-06
Из: г.Донецк ДНР
Пользователь №: 18 832



Да,странная ошибка,пока не нашёл откуда ноги растут...
Если вместо
1).
Код
if (delay < max_delay)

поставить

Код
dx=floor(delay*10+1e-10);
    if (dx < floor(max_delay*10))


или вместо
2).
Код
delay = delay + delta_delay;

поставить
Код
delay = delay + floor(delta_delay*10);



то всё работает.
У целочисленной переменной delay откуда то возникает дробная часть величиной менее 1е-11.Ошибка представления числа вроде должна быть намного меньше.
Go to the top of the page
 
+Quote Post
des00
сообщение Jan 30 2010, 13:20
Сообщение #5


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(_Anatoliy @ Jan 30 2010, 07:13) *
Да,странная ошибка,пока не нашёл откуда ноги растут...
У целочисленной переменной delay откуда то возникает дробная часть величиной менее 1е-11.Ошибка представления числа вроде должна быть намного меньше.

вот и я тоже не понял почему 10 раз по 0.1 не равно 1 це %) в принципе на результат функционирования схемы это не влияет, но ошибка занятная %)


--------------------
Go to the top of the page
 
+Quote Post
Gate
сообщение Feb 1 2010, 09:51
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 859
Регистрация: 7-04-05
Из: Санкт-Петербург
Пользователь №: 3 943



Цитата(des00 @ Jan 30 2010, 16:20) *
вот и я тоже не понял почему 10 раз по 0.1 не равно 1 це %) в принципе на результат функционирования схемы это не влияет, но ошибка занятная %)

Скорее всего потому что при преобразовании в двоичный вид 0.1 нельзя точно представить как сумму ряда 2^(-n) - я не проверял. А 0.5 можно - я гарантирую это smile.gif
Непонятно то, что точность представления double примерно 2^-53=10e-16, а у _Anatoliy получилось 10e-11.


--------------------
"Человек - это существо, которое охотнее всего рассуждает о том, в чем меньше всего разбирается." (с) С.Лем
Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Feb 1 2010, 10:39
Сообщение #7


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 646
Регистрация: 15-07-06
Из: г.Донецк ДНР
Пользователь №: 18 832



Цитата(Gate @ Feb 1 2010, 11:51) *
Непонятно то, что точность представления double примерно 2^-53=10e-16, а у _Anatoliy получилось 10e-11.

Если быть точнее то получается 1е-12.
В процессе вычислений ошибка может накапливаться.
Go to the top of the page
 
+Quote Post
Gate
сообщение Feb 1 2010, 12:03
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 859
Регистрация: 7-04-05
Из: Санкт-Петербург
Пользователь №: 3 943



Цитата(_Anatoliy @ Feb 1 2010, 13:39) *
Если быть точнее то получается 1е-12.

Матлаб дает другую ошибку:
Код
>> format long eng
>> 0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1-1.0

ans =

   -111.022302462516e-018

>>


--------------------
"Человек - это существо, которое охотнее всего рассуждает о том, в чем меньше всего разбирается." (с) С.Лем
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- des00   Как интегрировать алгоритм в m файле в симулинк?   Jan 25 2010, 13:43
- - petrov   Несколько параллельно работающих корреляторов на р...   Jan 25 2010, 15:13
|- - des00   Цитата(petrov @ Jan 25 2010, 09:13) Неско...   Jan 25 2010, 15:45
|- - petrov   Цитата(des00 @ Jan 25 2010, 18:45) но в т...   Jan 25 2010, 16:02
|- - des00   Цитата(petrov @ Jan 25 2010, 10:02) Непон...   Jan 25 2010, 16:35
|- - petrov   Цитата(des00 @ Jan 25 2010, 19:35) т.е. е...   Jan 25 2010, 17:04
|- - des00   Цитата(petrov @ Jan 25 2010, 11:04) Есть ...   Jan 25 2010, 17:08
|- - _Anatoliy   Цитата(des00 @ Jan 25 2010, 19:08) Посм...   Jan 26 2010, 06:40
|- - des00   Цитата(_Anatoliy @ Jan 26 2010, 00:40) По...   Jan 27 2010, 11:03
|- - _Anatoliy   Цитата(Gate @ Feb 1 2010, 14:03) Матлаб д...   Feb 1 2010, 13:10
- - Enthusiast   des00, а Вы не пробовали использовать задержку на ...   Feb 27 2010, 14:03


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 07:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01459 секунд с 7
ELECTRONIX ©2004-2016