2015-11-21 3 views
0

Я хочу реализовать следующий псевдокод в SIMULINK:Algebraic_ loop_Solut ion_SIMULI NK

q^0 = q_init, i = 0 
IF q^i ! = q_final 
    q^(i+1) = q^i + alpha * F(q^i) 
    i = i + 1 
ELSE return <q^0,q^1 ... q^i> 

Основная проблема в том, что Р (д^я) является функцией тока д и рассчитанный на каждой итерации. При попытке выполнить это в SIMULINK, я столкнулся с алгебраическим циклом, который не может быть разрешен.

Каков правильный способ решения проблемы (в SIMULINK)?

Спасибо!

Миклош

+0

Покажите нам, что вы сделали. У самих уравнений нет алгебраической петли, поэтому должно быть что-то не так, как вы их реализовали. –

ответ

0

Понимание того, что разделить внутри моделирования Simulink и что должно быть на выходе.

Обычно вы выгружаете выходы q^0 в q^i в качестве выходов из модели, а не пытаетесь получить эту модель для всей модели.

Это означает, что модель Simulink будет иметь дело с вычислением q^(i + 1) из q^(i) (который вы храните с блоком задержки единицы).

Относительно условия if: Лучше не запускать симуляцию навсегда, если вы не знаете, что она определенно будет стремиться к q_final. Если вы не используете целые числа, которые могут быть очень сложными для корректной оценки ==. В этом случае вы должны использовать (abs (q^i - final)> threshold), а затем проверить, что это закончится.

Окончание моделирования точно в этой точке возможно с помощью точки останова, но более простой вариант позволит пропустить симуляцию и затем обрезать выход (q^0 до q^i, затем еще несколько значений) в Матлабе.

+1

Спасибо, Джеймс! Я также понял это и сделал то же самое. :) Работает. –

Смежные вопросы