Этот пример показывает, что правильное масштабирование моделей пространства состояний может быть критическим для точности, и предоставляет обзор автоматических и ручных инструментов перемасштабирования.
Модель в пространстве состояний хорошо масштабируется, когда записи матриц 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 обеспечивают автоматическое масштабирование. Вы предупреждаетесь, когда точность может быть скомпрометирована, и вы можете легко исправить проблему, указав интересующую полосу частот.