Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica

в 18:56, , рубрики: wolfram mathematica, градиент, звук, математика, ограничение, функция

Существует ряд задач, в которых диапазон выходных значений должен быть ограничен, в то время как входные данные этого гарантировать не могут. Помимо вынужденных ситуаций, ограничение сигнала может быть и целенаправленной задачей — например, при компрессии сигнала или реализации эффекта «overdrive».

Самая простая реализация ограничения — это принудительная установка в некоторое значение при превышении определённого уровня. Например, для синусоиды с возрастающей амплитудой это будет выглядеть так:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 1

В роли ограничителя здесь выступает функция Clip, в качестве аргумента которой передаётся входной сигнал и параметры ограничения, а результатом функции является выходной сигнал.

Посмотрим на график функции Clip отдельно:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 2

Из него видно, что пока мы не превышаем пределы ограничения, выходное значение равно входному и сигнал не меняется; при превышении же выходное значение от входного уже никак не зависит и остаётся на одном и том же уровне. По сути, мы имеем кусочно-непрерывную функцию, составленную из трёх других: y=-1, y=x и y=1, выбираемых в зависимости от аргумента, и эквивалентную следующей записи:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 3

Переход между функциями происходит довольно резко; и выглядит заманчивым сделать его более плавным. Математически эта резкость обусловлена тем, что производные функций в точках стыковки не совпадают. Это легко увидеть, построив график производной функции Clip:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 4

Таким образом, чтобы обеспечить гладкость функции ограничения, необходимо обеспечить равенство производных в точках стыковки. А поскольку крайние функции у нас константы, производные от которых равны нулю, то и производные функции ограничения в точках стыковки тоже должны быть равны нулю. Далее будут рассмотрены несколько таких функций, обеспечивающих гладкую стыковку.

Синус

Самое простое — это использовать функцию sin на интервале от -pi/2 до pi/2, на границах которого значения производной равны нулю по определению:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 5

Нужно только масштабировать аргументы, чтобы единица проецировалась на Pi/2. Теперь мы можем определить собственно ограничивающую функцию:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 6

И построить её график:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 7

Так как пределы ограничения у нас жёстко определены, то ограничение задаётся через масштабирование входного сигнала с последующим (при необходимости) обратном масштабировании.
Здесь также уже нет ситуации, при которой входной сигнал передаётся на выход без искажений — чем меньше уровень усиления, тем меньше уровень искажений вследствие ограничения — но сигнал искажается в любом случае.
Влияние параметра усиления на искажение сигнала можно посмотреть и в динамике:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 8

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 9

Больше гладкости

Посмотрим на производную нашей функции:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 10

В ней уже нет разрывов в значениях, но есть разрывы в производной (второй, если считать от изначальной функции). Для того, чтобы её устранить, можно пойти обратным путём — сначала сформировать гладкую производную, а затем её проинтегрировать для получения искомой функции.
Самый простой способ обнулить производную точках -1 и 1 — это просто возвести функцию в квадрат — все отрицательные значения функции станут положительными и, соответственно, возникнут перегибы в точках пересечения функции с нулём.

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 11

Находим первообразную:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 12

Теперь осталось масштабировать её по оси ординат. Для этого найдём её значение в точке 1:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 13

И поделим на неё (да, конкретно здесь это элементарное умножение на 2, но далеко не всегда так бывает):

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 14

Таким образом, итоговая функция ограничения примет вид:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 15

Переходим на полиномы

Использование тригонометрический функций в некоторых случаях может оказаться несколько расточительным. Поэтому попробуем построить необходимую нам функцию, оставаясь в рамках элементарных математических операций.
Рассмотрим параболу:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 16

Так как у неё уже есть перегиб в точке ноль, мы можем использовать одну и ту же часть на интервале {0,1} для для стыковки с константами. Для отрицательных значений её нужно сместить вниз и влево:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 17

а для положительных — отразить по вертикали и горизонтали:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 18

И наша функция с параболой примет вид:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 19

Немного усложним

Вернёмся к нашей параболе, перевернём её и сместим на единицу вверх:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 20

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

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 21

Интегрируем и масштабируем:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 22

Получаем ещё более гладкую функцию:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 23

Больше гладкости богу гладкости

Здесь мы попробуем добиться гладкости в точках стыковки на ещё более высших производных. Для этого для начала определим функцию как полином с неизвестными коэффициентами, а сами коэффициенты попробуем найти через решение системы уравнений.

Начнём со 1-й производной:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 24

2-я:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 25

3-я:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 26

Все эти коэффициенты выглядит так, как будто в них есть какая-то логика. Выпишем множители, помножив их на значение степени при х; а чтобы не писать каждый раз одно и тоже, автоматизируем процесс нахождения коэффициентов:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 27

Похоже на биномиальные коэффициенты. Сделаем смелое предположение, что это они и есть, и исходя из этого, запишем обобщённую формулу:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 28

Проверим:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 29

Похоже на правду [1]. Осталось только посчитать масштабный коэффициент, чтобы привести края к единице:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 30

А после масштабирования и упрощения мы обнаружим, что наши познания в математике несколько устарели [2]:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 31

Таким образом, мы получили производящую функцию порядка n, в которой n-1 первых производных будут равны нулю:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 32

Посмотрим, что получилось:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 33

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

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 34

Также можно построить графики производных, приведённых к одному масштабу:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 35

Добавляем жёсткости

Было бы заманчиво, иметь возможность регулировать и степень «жёсткости» ограничения.
Вернёмся к нашей перевёрнутой параболе и добавим коэффициент при степени x:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 36

Чем больше n, тем больше наша производная «квадратная», а её первообразная — соответственно, резкая:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 37

Посчитаем первообразную и скорректируем масштаб:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 38

Попробуем теперь задать дробный шаг для параметра:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 39

Как видим, в отрицательной части не для всех n имеется корректное решение, но в правой (положительной) части необходимые нам условия по-прежнему соблюдаются — поэтому для отрицательных значений мы можем просто использовать её в перевёрнутом виде с реверсированным аргументом. И поскольку область определения параметра уже не ограничена только положительными целыми числами, то можно упростить формулу, заменив 2n на n:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 40

А заменив n на n-1, можно сделать формулу чуть более красивой:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 41

Поскольку при n равным единице мы получаем деление на ноль, то попробуем найти предел:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 42

Предел находится, а значит, теперь можно доопределить [3] функцию для n равным 1 и рассматривать её для всех n больших нуля:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 43

Если же мы изначально возведём нашу перевёрнутую параболу в квадрат, то получим ещё более гладкую функцию:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 44

И можем сравнить их на одном графике:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 45

Рационализируй это

Посмотрим на следующую функцию:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 46

Появилась она не случайно.
Если убрать из неё единицу, x2 сократится и останется просто x, т.е наклонная прямая. Таким образом, чем меньше значение x, тем большее влияние оказывает единица в знаменателе, создавая необходимое нам искривление. А рассматривая эту функцию в разных масштабах, можно контролировать степень этого искривления:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 47

Таким образом, мы можем переписать предыдущую функцию с контролем жёсткости, используя только рациональный полином 3-порядка:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 48

Автоматизируй это

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

Если наша функция уже обладает диагональной симметрией и выровнена по центру координат (как синусоида), то можно сделать просто

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 49

Пример использования:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 50

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

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 51

Пример использования:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 52

Перейдём на экспоненту

Совершенно любая функция может быть донором для решения этой задачи, нужно лишь только обеспечить ей точки перегиба. Возьмём, например, сдвинутую вниз на единицу экспоненту:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 53

Ранее, для обеспечения необходимого перегиба в точке ноль, мы возводили функцию в квадрат. Но можно пойти и другим путём — например, суммировать с другой функцией, производная которой в точке ноль противоположна по знаку с производной экспоненты. Например, -x:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 54

В зависимости от того, с какой стороны мы будем брать кривую, будет и зависеть итоговый вид функции. Теперь, воспользовавшись ранее определённой вспомогательной функцией и выбрав одну из сторон, получим:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 55

Либо

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 56

И теперь можем сравнить их на одном графике:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 57

Видно, что при k→0 они стремятся к совпадению; и так как напрямую посчитать их значения мы не можем, поскольку получим деление на ноль, то воспользуемся пределом:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 58

И получили уже известную нам кусочную функцию из параболы.

Нарушая симметрию

Пока что мы рассматривали исключительно симметричные функции. Однако бывают случаи, когда симметрия нам не нужна — например, для имитации искажений при звучании ламповых усилителей.

Возьмём экспоненту и умножим её на перевёрнутую параболу в квадрате — чтобы получить пересечение с осью абсцисс в точках -1 и 1, а заодно и обеспечить гладкость второй производной; параметризацию же осуществим через масштабирование аргумента экспоненты:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 59

Найдём первообразную и масштабируем её:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 60

Так как при k=0 получим деление на ноль:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 61

То дополнительно найдём предел,

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 62

который представляет из себя уже известный нам гладкий полином 3-го порядка. Соединив всё в одну функцию, получим

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 63

Вместо того, чтобы изначально проектировать асимметричную функцию, можно пойти и другим путём — использовать готовую симметричную, но «искривлять» значение этой функции с помощью дополнительной функции кривой, определённой на промежутке {-1,1}.

Рассмотрим, например, гиперболу:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 64

Рассматривая её отрезок в разных масштабах, можно регулировать степень искривления в обе стороны. Как же найти этот отрезок? Исходя из графика, можно было бы искать пересечения гиперболы с прямой. Однако, поскольку такое пересечение существует не всегда, это создаёт некоторые сложности. Поэтому мы пойдём другим путём.

Для начала добавим в гиперболу масштабирующие коэффициенты:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 65

затем составим систему уравнений, задающих условия прохождения гиперболы через заданные точки — и её решение даст интересующие нас коэффициенты:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 66

Теперь подставим решение в исходную формулу и упростим:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 67

Посмотрим, что у нас получилось в зависимости от параметра k:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 68

Примечательно, что при k=0 формула естественным образом схлопывается в x и никаких особых ситуаций не происходит — хотя применительно к исходной гиперболе это равносильно отрезку нулевой длины, причём двум сразу. Не менее примечательно, что обратной к ней функцией является она же самая, но с отрицательным параметром k:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 69

Теперь мы можем использовать её для модификации произвольной функции ограничения, а параметр k таким образом будет задавать точку пересечения с осью ординат:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 70

Аналогичным образом можно строить кривые и из других функций, например, степенной с переменным основанием:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 71

Или обратной к ней логарифмической:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 72

Нужно больше точности

Мы можем захотеть иметь гарантированно линейный промежуток у функции на некотором интервале. Это логично организовать введением прямой линии в кусочно-непрерывную функцию,

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 73

пустые места в которой необходимо заполнить какой-нибудь функцией. Очевидно, что для гладкой стыковки с линейным участком её первая производная должна быть равна единице; а все последующие (по возможности) нулю. Чтобы не не выводить такую функцию заново, мы можем взять уже готовую и адаптировать под эту задачу. Также можно заметить, что крайние точки отстоят чуть дальше единицы — это необходимо, чтобы сохранить наклон линейного участка.

Возьмём выведенную ранее функцию PolySoft и сместим её так, чтобы в центре координат получить единицу:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 74

Из её свойств следует, что n-1 последующих производных в точках 0 и 2 будут равны нулю:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 75

Теперь проинтегрируем её:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 76

Функция оказалась сдвинутой вниз относительно оси абсцисс. Поэтому необходимо добавить константу (равную значению функции в точке 0), чтобы совместить центры координат:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 77

Здесь у нас появился ноль в степени n. Он не сократился, так как значение ноль в степени ноль не определено; мы можем его удалить вручную, а можем при упрощении явно указать, что n у нас больше нуля:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 78

Проверим на всякий случай. Значение в точках 0 и 2 для всех n:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 79

Производные на краях интервала (для полинома порядка 5):

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 80

Как видим функция получилась довольно громоздкой. Чтобы не таскать её и не переусложнять вычисления, дальше будем манипулировать уже с конкретным полиномом, например 4-го порядка:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 81

И вот теперь ею можно заполнить свободное пространство:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 82

Проверим:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 83

Уходим в бесконечность

Иногда может оказаться потребность в функциях, которые стремятся к единице, но не достигают её. Википедия подсказывает несколько известных решений:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 84

Так как эти функции единицы не достигают, их удобнее нормировать по производной в центре координат.
Мы можем модифицировать форму таких функции через их аргумент с помощью какой-нибудь диагонально-симметричной функции, например:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 85

Эта функция, к слову, также является обратной самой к себе, т.е.
Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 86

И, применительно к арктангенсу в качестве примера, получим

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 87

что, в частности, с параметром k=1 даст нам функцию Гудермана.

Как видим, при таком подходе можно получить нежелательные перегибы, поэтому более предпочтительно контролировать жёсткость ограничения непосредственно через свойство самой функции. Рассмотрим несколько таких функций с параметром, вывод которых для краткости опустим.

Из степенной функции:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 88

Из суммы двух v-образных функций со смещением:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 89

Из обобщённой функции ошибок:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 90

Интегрированием рационального полинома:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 91

Интересно, что её частным случаем является арктангенс:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 92

Заключение

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

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

В завершение стоит уточнить ещё несколько моментов.
Все функции здесь были определены в диапазоне от -1 до 1. В случае, если нужен другой диапазон (например, от 0 до 1), его легко можно пересчитать либо вручную:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 93

Либо используя встроенную функцию масштабирования:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 94

А для облегчения экспорта полученных формул в программный код может пригодиться функция CForm:

Вывод функции кривой для плавного ограничения параметров, сигналов и не только в Wolfram Mathematica - 95

Исходный документ Mathematica можно скачать здесь.


Примечания:

[1] настоящий математик наверняка сможет строго доказать (или опровергнуть) это утверждение.
[2] в стандартном курсе мат.анализа гипергеометрические функции не рассматриваются.
[3] эта перегрузка определена только для символьной единицы; единица в формате с плавающей точкой (например, при построении графика) распознана не будет.

Автор: Refridgerator

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js