Масштабирование моделей в пространстве состояний для максимизации точности

Этот пример показывает, что правильное масштабирование моделей пространства состояний может быть критическим для точности, и предоставляет обзор автоматических и ручных инструментов перемасштабирования.

Почему важно масштабирование

Модель в пространстве состояний хорошо масштабируется, когда записи матриц A, B, C однородны по величине, и характеристики модели нечувствительны к небольшим возмущениям A, B, C (по сравнению с их нормами). В отличие от этого, модель плохо масштабируется, когда A, B, C имеют как маленькие, так и большие значения, и характеристики модели чувствительны к маленьким записям.

Смешение разрозненных временных шкал или единичных шкал может привести к плохо масштабируемым моделям. Работа с такими моделями может привести к серьезной потере точности и озадачивающим результатам. Чтобы предотвратить эти проблемы, часто необходимо переформулировать вектор состояния, то есть умножить каждое состояние на некоторый масштабирующий коэффициент, чтобы уменьшить численную область значений и чувствительность модели.

Плохое масштабирование может повлиять на точность большинства расчетов частотного диапазона. Современные алгоритмы в большой степени полагаются на ортогональные координатные преобразования состояния, и такие преобразования вносят ошибки порядка eps (точность машины) умножает на нормы A, B, C. Хотя такие ошибки обычно незначительны, они могут стать доминирующими, когда A, B, C плохо масштабируются. Чтобы увидеть это явление, загрузите следующий пример:

load numdemo anil

The anil модель является реализацией в пространстве состояний передаточной функции 20-го порядка с большей частью ее динамики между 1e3 и 1e5 рад/с. Коэффициенты матрицы A варьируются от 1 до 1e80 в величине. Чтобы симулировать эффект ортогональных преобразований, примененных к этой модели, сгенерируйте случайную ортогональную матрицу U и использовать ss2ss для выполнения соответствующего изменения координат состояния:

[U,junk] = qr(randn(20));
anil2 = ss2ss(anil,U);   % perform state coordinate transformation U

Математически, anil и anil2 имеют ту же частотную характеристику. Однако численно отклики Боде anil и anil2 очень разные:

bode(anil,'b',anil2,'r--')
legend('Original','After Orthogonal Transformation','Location','southwest')

Этот пример показывает, что для плохо масштабированных моделей даже ортогональные преобразования могут быть небезопасными и уничтожать точность.

Минимизация масштабирования чувствительности

Для простых моделей, полученных из физики, можно избежать проблем масштабирования, тщательно выбирая модули, чтобы уменьшить разброс между маленькими и большими коэффициентами. Однако для более сложных моделей найти правильное масштабирование сложно. Специальные схемы, такие как балансировка матрицы A (см. balance) часто полезны, но иногда вредны.

Программное обеспечение Control System Toolbox™ предоставляет расширенные алгоритмы масштабирования, которые минимизируют чувствительность модели к небольшим возмущениям A, B, C, пропорциональным их нормам. Это помогает максимизировать точность вычисленной частотной характеристики, представления ZPK и т.д. The prescale команда является шлюзом к этим алгоритмам масштабирования. Для примера можно использовать prescale чтобы масштабировать anil модель, используемая выше:

Scaled_anil = prescale(anil);

Коэффициенты матрицы A теперь варьируются от 1e3 до 3e7 вместо 1 до 1e80. Применить ортогональное преобразование U к масштабированной модели и сравнить отклики Бода:

Scaled_anil2 = ss2ss(Scaled_anil,U);
bode(Scaled_anil,'b',Scaled_anil2,'r--')
legend('Scaled Model','After Orthogonal Transformation','Location','southwest')

Ответы Боде точно совпадают сейчас. Масштабирование снова сделало ортогональные преобразования безопасными, и можно ожидать хорошей точности от расчетов с участием этой масштабированной модели.

Автоматическое масштабирование

Большинство алгоритмов в программном обеспечении Control System Toolbox автоматически переформулируют модели пространства состояний, чтобы предотвратить катастрофическую потерю точности. В результате вы в основном изолированы от проблем масштабирования. Для примера, bode команда автоматически масштабирует входящие модели так, чтобы она могла безопасно выполнять ортогональные преобразования, чтобы ускорить расчет частотной характеристики. Поэтому нет необходимости использовать prescale перед bode если вы не хотите получить подробную информацию об относительной точности вычисленной характеристики Боде.

Масштабирование вручную

В то время как алгоритм масштабирования Control System Toolbox обрабатывает большинство моделей без вмешательства пользователя, существуют редкие случаи, когда хорошая точность не может быть достигнута во всей частотной области значений, и алгоритм должен торговать хорошей точности в одной частотной полосе для плохой точности в другом. В этом случае выдается предупреждение, чтобы предупредить вас о потенциальных неточностях. Чтобы проиллюстрировать такое поведение, загрузите следующий пример и постройте график его отклика Bode:

load numdemo warnsys
bode(warnsys,{1e-3,1e6}), grid on

Обратите внимание на предупреждение, выданное bode команда. Эта модель 17-го порядка имеет динамику около 0,01 рад/с и между 1e3 и 1e6 рад/с, разделенную 300dB падением усиления. Можно исключить предупреждение, сузив интересующую область значений, например, до [10,1e6] рад/с:

bode(warnsys,{10,1e6}), grid on

Это инструктирует алгоритм, чтобы максимизировать точность в интервале [10,1e6]. Вы также можете исследовать базовый компромисс точности путем ввода:

>> prescale(warnsys)

Эта команда открывает интерактивный инструмент масштабирования, показанный ниже. Установите пределы по осям частот 1e-2 равными 1e6. Верхний график показывает величину частотной характеристики, а нижний график показывает:

  • Относительная точность вычисляемой характеристики без масштабирования (красный)

  • Относительная точность вычисляемой характеристики с масштабированием (синий)

  • Лучшая достижимая точность при использовании независимого масштабирования на каждой частоте (коричневый)

Любое значение относительной точности, больше одного, сигнализирует о плохой точности.

В этом примере график Относительной Точности показывает, что алгоритм масштабирования достиг хорошей точности в полосе частот [1e3,1e6] за счет точности на низких частотах. Если вы заботитесь только о полосе частот [1e-3,1], можно переопределить этот выбор области значений по умолчанию и вручную задать полосу частот, где вы хотите максимальную точность. Для примера введите [1e-3,1] в поля редактирования рядом с Максимизируйте точность в частотной полосе:

Это действие обновляет нижний график, и относительная точность масштабированной модели (синяя кривая) теперь лучше всего приближается к 1e-2 рад/с, но значительно хуже в полосе [1e3,1e6].

Масштабное свойство моделей пространства состояний

Объект State-Space (@ ss) имеет Scaled свойство, указывающее, когда модель уже масштабирована. Его значение по умолчанию является false. The prescale команда устанавливает это свойство равным true:

sys = prescale(anil);
sys.Scaled
ans =

  logical

   1

Потому что алгоритм масштабирования пропускает модели с Scaled=true, можно вручную задать Scaled свойство к true когда ваша модель хорошо масштабирована, и вы хотите исключить небольшие накладные расходы, связанные с масштабированием. Если вы хотите больше контролировать, где точность максимизирована, вы также можете явным образом масштабировать свою модель перед использованием:

sys = prescale(warnsys,{10,1e6});
bode(sys)

Вот warnsys масштабируется с акцентом на частотную область значений [10,1e6] и bode не пытается переформулировать полученную модель sys (больше никаких предупреждений).

Заключение

Правильное масштабирование моделей пространства состояний важно для достижения точных результатов. Большинство команд Control System Toolbox обеспечивают автоматическое масштабирование. Вы предупреждаетесь, когда точность может быть скомпрометирована, и вы можете легко исправить проблему, указав интересующую полосу частот.