Навигация:
<< >> Оглавление Указатель

Описание пользователя

Глава 3. Использование стандартных модулей автокомпиляции

§3.6. Принципы создания автокомпилируемых моделей блоков

§3.6.4. Моделирование длящихся во времени процессов

§3.6.4.3. Важность правильного выбора шага расчета

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

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

Груз с пружиной на наклонной плоскости

Рис. 407. Груз с пружиной на наклонной плоскости

В качестве примера рассмотрим еще одну механическую систему. Имеется груз массой m, лежащий на наклонной плоскости и прикрепленный к пружине, расположенной параллельно этой плоскости (рис. 407). Массу пружины и сопротивление воздуха учитывать не будем. Мы снова рассматриваем именно механическую систему, поскольку ее поведение представить проще, чем, например, поведение электрической, и правильность этого поведения легко проверить повседневным опытом.

На груз на наклонной плоскости будут действовать следующие силы:

Расположим ось x вдоль плоскости, направив ее вниз и выбрав началом координат оси точку, в которой деформация пружины равна нулю (то есть точку, в которой будет находиться конец пружины без груза). Большая часть сил, действующих на груз, будет действовать вдоль этой оси. Исключение составят сила реакции опоры N и сила тяжести mg. Груз при движении не отрывается от плоскости, поэтому сумма проекций всех сил на ось, перпендикулярную плоскости, должна быть равна нулю, то есть перпендикулярная плоскости составляющая силы тяжести должна быть равна силе реакции опоры. Считая, что плоскость расположена под углом α к горизонтали, получаем

N = mg cos Alpha

Согласно закону Гука, сила пружины FП будет пропорциональна величине ее деформации:

Fп = -Kп x

где KП – коэффициент жесткости пружины. Знак минус в формуле указывает на то, что сила пружины направлена против направления деформации.

Сила трения, препятствующая движению груза, вычисляется по-разному, в зависимости от того, движется груз или покоится. Если груз движется, на него действует сила трения скольжения, направленная против направления движения и пропорциональная силе, прижимающей груз к плоскости:

Fтр при v!=0 = -sign(v) Kтр.ск mg cos Alpha

где v – скорость движения груза, KТР.СК – коэффициент трения скольжения, зависящий от трущихся материалов, а sign – функция знака, имеющая значение −1 для отрицательных аргументов, 1 для положительных, и ноль для нулевого аргумента:

sign(x)={-1, x<0; 0, x=0; 1, x>0

Согласно этой формуле, при движении груза сила трения направлена против вектора скорости тела и постоянна по модулю.

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

Fтр.пок.max = Kтр.пок N = Kтр.пок mg cos Alpha

где N – сила реакции опоры (равная по модулю силе, прижимающей груз к плоскости), а KТР.ПОК – коэффициент трения покоя, который, как и коэффициент трения скольжения, зависит от трущихся материалов. Пока сумма остальных сил меньше этой максимальной силы, груз будет оставаться в покое, поскольку сила трения покоя будет равна этой сумме по модулю и противоположна по направлению, то есть сумма всех сил, действующих на груз, будет равна нулю. Как только сумма остальных сил превысит максимальную силу трения покоя, груз начнет движение, и на него уже будет действовать сила трения скольжения. Таким образом, силу трения покоя можно вычислить по следующей формуле:

Fтр при v=0 = {-Fe, |Fe|<=Fтр.пок.max; -sign(Fe)Fтр.пок.max, |Fe|>Fтр.пок.max

где FE – сумма проекций на ось x всех сил, приложенных к грузу, кроме силы трения. В момент, когда FE превысит максимальную силу трения покоя, сила трения, действующая на груз, скачкообразно изменится с максимальной силы трения покоя на силу трения скольжения, вычисляемую по другой формуле, приведенной несколькими абзацами выше.

Для простоты будем считать, что и груз, и плоскость сделаны из стали и между ними есть слой смазки – в этом случае коэффициент трения покоя можно считать равным коэффициенту трения скольжения (оба они будут равны 0.16). При этом скачок силы трения в момент страгивания груза с места будет отсутствовать, и сила трения скольжения будет равна максимальной силе трения покоя. С этим допущением силу трения, действующую на груз, можно вычислять по следующей формуле:

Fтр = {-sign(v) Kтр.ск mg cos Alpha, v!=0; -Fe, v=0 & |Fe|<=Fтр.max; -sign(Fe)Fтр.max, v=0 & |Fe|>Fтр.max

где v – скорость движения груза, KТР – коэффициент трения (теперь общий для скольжения и покоя), FE – сумма проекций на ось x всех остальных сил, приложенных к грузу, а максимальная сила трения покоя FTPMAX теперь вычисляется через коэффициент трения KТР:

Fтр.max = Kтр mg cos Alpha

Верхняя строчка в формуле для FTP относится к движению груза, средняя – к покою, нижняя – к моменту страгивания (перехода от покоя к движению).

В сумму проекций FE входят сила пружины FП = − KП x, внешняя сила FВХ и проекция силы тяжести на ось x (mg sin α):

Fe = Fвх - Kп x + mg sin Alpha

Согласно второму закону Ньютона, сумма всех сил, приложенных к грузу, равна произведению его массы на ускорение. Рассматривая движение вдоль оси x, получаем дифференциальное уравнение второго порядка, описывающее нашу систему:

ma = m dv/dt = m d^2x/dt^2 = Fe + Fтр

где a – ускорение груза, а v – его скорость вдоль оси x. Преобразуем это уравнение в систему из двух уравнений первого порядка относительно скорости и координаты груза, и добавим начальные условия для этих переменных (без начальных условий мы не сможем получить решение уравнения):

{ dv/dt=(Fe+Fтр)/m, v(0)=v0, dx/dt=v, x(0)=x0

Применив к этой системе метод Эйлера, получим систему из двух разностных уравнений, позволяющий вычислить (k+1)-е состояние механической системы по ее k-му состоянию:

{ v[k+1]=v[k]+h(Fe[k]+Fтр[k])/m, x[k+1]=x[k]+h v[k]

где h = tk+1tk – шаг расчета.

Как и в предыдущих примерах, для удобства записи номер отсчета сделан верхним индексом: vk – это не «скорость груза в степени k», это «k-й отсчет скорости груза».

Теперь можно создать модель блока, который будет рассчитывать движение груза, но прежде решим, как мы будем определять, покоится груз или движется – это важно для вычисления силы трения. Проверять скорость на точное равенству нулю было бы плохой идеей: любые вычисления выполняются с некоторой погрешностью, поэтому вещественная переменная, в которой мы будем хранить значение скорости, вряд ли когда-нибудь получит в точности нулевое значение в результате вычислений. Вместо точной проверки равенства будем считать, что груз остановился, если модуль его скорости стал меньше очень маленького, заранее заданного, значения vMIN. В качестве этого значения можно взять, например, 10−6 м/с (один микрометр в секунду можно считать практически полной остановкой). Однако, есть еще одна проблема, которую введение такой проверки остановки не решит. Мы считаем в дискретном времени с шагом h, и, при достаточно большой скорости груза, за один шаг скорость может пройти через ноль, но при этом и значение в начале шага, и значение в его конце по модулю будут больше vMIN.

Определение момента остановки

Рис. 408. Определение момента остановки

На рис. 408 изображены два отсчета скорости груза: vk при времени tk и vk+1 при времени tk+1. Оба значения скорости по модулю больше vMIN, поэтому проверка остановки не сработает ни в начале, ни в конце такта. При этом где-то внутри шага расчета скорость проходит через ноль, то есть груз останавливается. Если при этом сумма сил FE окажется меньшей максимальной силы трения покоя FTPMAX, груз останется в покое (приложенных к нему сил будет недостаточно для преодоления трения покоя), и скорость в момент времени tk+1 будет равна нулю, а не значению vk+1, которое мы вычислили, считая, что груз будет продолжать двигаться весь шаг расчета.

Уменьшение шага расчета позволит обойти эту проблему: если шаг подобран так, чтобы за него при максимально возможном ускорении скорость груза изменялась бы не более чем на vMIN, один из отсчетов около момента остановки обязательно попадет в интервал −vMINvMIN. Однако, есть более простое решение, не требующее подбора шага: если за шаг расчета скорость изменила свой знак (то есть прошла через ноль), можно проверить, достаточно ли на этом шаге приложенных сил, чтобы преодолеть трение покоя. Если окажется, что этих сил недостаточно, значит, в текущем шаге расчета груз остановится. Можно даже более точно определить время остановки tc. На всем шаге расчета мы считаем ускорение постоянным, поэтому скорость будет меняться линейно – это видно из разностного уравнения для скорости:

v[k+1]=v[k]+h a[k], где h=t[k+1]-t[k], a[k]=(Fe[k]+Fтр[k])/m

Груз остановится через промежуток времени hC после момента времени tk, то есть скорость в этот момент будет равна нулю:

0=v[k]+h a[k]

Таким образом, интервал времени hC после k-го отсчета времени, через который груз остановится (см. рис. 408), и момент времени остановки tc вычисляются по формулам

hc=-v[k]/a[k], tc=t[k]+hc

Деление на ускорение в первой формуле не вызовет проблемы: мы вычисляем время остановки только тогда, когда значения vk и vk+1 лежат по разные стороны нуля, то есть скорость изменяется, а это значит, что ускорение не равно нулю. Координата груза в момент остановки вычисляется подстановкой hC вместо h в разностное уравнение для x:

xc=x[k]+hc v[k]

В момент времени tc мы будем проверять, продолжит ли груз движение, то есть хватит ли приложенных к нему в положении xC сил для преодоления трения покоя.

Создадим блок для моделирования поведения этой механической системы. Входами блока будут переменные «x0» (начальное положение груза на плоскости, м), «v0» (начальная скорость груза, м/с), «Alpha» (угол в основании наклонной плоскости, градусов), «Ktr» (безразмерный коэффициент трения), «Kp» (жесткость пружины, Н/м), «m» (масса груза, кг) и «Fvh» (внешняя сила, Н). Выходами будут «x» (текущее положение груза, м) и «v» (текущая скорость груза, м/с). Для вычисления шага расчета нам потребуется внутренняя переменная «t0», в которой мы будем хранить прошлый отсчет времени tk (см. примеры в §3.6.4.1). Кроме того, поскольку мы считываем начальные условия с входов блока «x0» и «v0», нам, как и в примере из §3.6.4.2, потребуется внутренний логический флаг инициализации «Init». В результате у нас получится следующая структура переменных блока:

Имя Тип Вход/выход Пуск Начальное значение
Start Сигнал Вход 0
Ready Сигнал Выход 0
Kp double Вход 0
Ktr double Вход 0
m double Вход 1
Fvh double Вход 0
Alpha double Вход 0
x0 double Вход 0
v0 double Вход 0
Init Логический Внутренняя 1
x double Выход 0
v double Выход 0
t0 double Внутренняя 0

Переменной «m» мы дали ненулевое начальное значение, чтобы, если мы забудем подключить к ней поле для ввода массы груза, деление на массу при расчете ускорения в программе модели не вызвало ошибки.

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

  double h,Fe,a_rad,Ft,Ft0,vn,a; // Вспомогательные переменные
  double vmin=1e-6; // Порог скорости (меньше - остановка)

  // Макрос для функции sign
  #define sign(x) ((x)<0.0?-1:1)

  if(DynTime==t0) // Время не изменилось
    return;

  if(Init) // Чтение начальных условий с входов
    { v=v0; x=x0;
      Init=0;
    }

  h=DynTime-t0; // Шаг расчета
  t0=DynTime;   // Запоминание времени очередного шага

  // Угол наклонной плоскости в радианах
  a_rad=Alpha*M_PI/180;

  // Максимальная сила трения покоя
  // (считаем ее равной силе трения скольжения)
  Ft0=Ktr*m*9.8*cos(a_rad);

  // Сумма сил кроме силы трения
  Fe=m*9.8*sin(a_rad)+Fvh-Kp*x;

  // Расчет силы трения скольжения/покоя
  if(fabs(v)<vmin) // Покой
    { if(fabs(Fe)<Ft0) // Меньше страгивания
        Ft=-Fe;
      else // Cтрагивание
        Ft=-sign(Fe)*Ft0;
    }
  else // Движение
    Ft=-sign(v)*Ft0;

  a=(Fe+Ft)/m; // Ускорение на этом шаге
  vn=v+h*a;    // Скорость в конце шага

  // Проверка изменения знака скорости (т.е. остановки)
  if(sign(v)!=sign(vn))
    { // Скорость изменила знак внутри шага расчета
      if(fabs(Fe)<Ft0) // Внешние силы меньше max трения
        { // Полная остановка
          double hs;
          hs=-v*m/a; // Время остановки (после t0)
          x=x+hs*v;  // Точка остановки
          v=0;       // Остановились – обнуляем скорость
          return;
        }
    }
  // Скорость не меняла знак или внешние силы больше
  // max силы трения - движение продолжается
  x=x+h*v; // Новое положение груза
  v=vn;    // Новая скорость уже вычислена в vn

В самом начале этой программы мы вводим несколько вспомогательных переменных, которые будут использоваться далее. Среди них – vmin со значением 1e-6 (то есть 1⋅10−6), которое мы будем использовать как пороговое значение скорости для определения остановки груза. Затем мы описываем макрос для функции sign, возвращающей знак аргумента – она потребуется нам для вычисления силы трения и для обнаружения прохода скорости через ноль. Результат вычисления выражения в этом макросе будет равен −1 для отрицательных аргументов и 1 для неотрицательных. При равенстве аргумента нулю выражение должно было бы давать нулевой результат, но в рассмотренных нами формулах это не принципиально, поэтому мы упростили вычисление sign. После описания макроса находятся два уже знакомых нам по модели из §3.6.4.2 оператора if, необходимых для считывания начальных условий движения из входов x0 и v0: первый оператор блокирует выполнение модели, если время не изменилось с прошлого расчета (DynTime==t0), второй – переписывает x0 и v0 в x и v соответственно, если флаг инициализации Init взведен (флаг после этого сбрасывается). Далее, как обычно, вычисляется шаг расчета h, новое значение времени запоминается в переменной t0 для следующего шага, после чего начинается основная часть программы, ответственная за моделирование движения груза.

Прежде всего, угол наклонной плоскости Alpha переводится из градусов в радианы (тригонометрические функции в стандартных библиотеках языка C работают именно с радианами) и записывается во вспомогательную переменную a_rad. Максимальная сила трения покоя FTPMAX записывается в переменную Ft0, сумма всех сил вдоль оси x за исключением силы трения – в переменную Fe. Затем, в зависимости от состояния груза и приложенных сил, вычисляется сила трения Ft.

Если абсолютное значение скорости груза v меньше принятого нами порогового значения vmin, мы считаем, что груз покоится – в этом случае сумма приложенных сил Fe сравнивается с максимальной силой трения покоя Ft0. Если абсолютное значение Fe меньше Ft0, приложенных сил недостаточно для страгивания груза с места, и сила трения в этом случае равна -Fe (сила трения компенсирует приложенные силы и груз остается в покое). Если же Fe превышает Ft0, груз начинает движение – сила трения, действующая на него, равна Ft0 по модулю и имеет знак, обратный Fe.

Если абсолютное значение скорости больше порога vmin, значит, груз в данный момент движется, и на него действует сила трения скольжения, равная по модулю Ft0 (то есть максимальной силе трения покоя, поскольку мы решили считать коэффициенты трения покоя и скольжения равными) и имеющая знак, обратный скорости.

Зная силу трения Ft и сумму остальных сил вдоль оси x Fe (все силы рассчитаны на момент начала шага расчета), мы рассчитываем ускорение груза a (сумма всех сил, деленная на массу) и, по разностному уравнению для скорости, скорость груза на конец шага расчета vn. Теперь нужно проверить, не остановился ли груз на данном шаге расчета и, если это так, вычислить момент времени остановки согласно рис. 408.

Если за шаг расчета скорость поменяла знак (знак v не равен знаку vn), значит, скорость груза прошла через ноль. В этом случае сумма сил Fe сравнивается с максимальной силой трения покоя Ft0: если трение покоя превышает сумму остальных сил, груз останется стоять. При этом вычисляется интервал времени hs внутри шага расчета h до момента остановки. Затем этот интервал подставляется в разностное уравнение для координаты x и вычисляется положение груза на момент остановки – поскольку он останется стоять, по крайней мере, до конца шага (и далее, если приложенная сила Fvh на следующем шаге не изменится), это и будет его координатой на момент конца шага. Его скорость на конец шага будет нулевой, поэтому переменной v присваивается ноль, и модель завершается оператором return – до начала следующего шага расчета больше нечего вычислять.

Если же скорость не меняла знак или максимальная сила трения покоя меньше суммы остальных сил, груз будет продолжать движение – в этом случае его новая координата x вычисляется согласно разностному уравнению, а уже полученная новая скорость переписывается из вспомогательной переменной vn в переменную блока v.

Для тестирования созданной модели соберем схему, изображенную на рис. 409. Внешнюю силу «Fvh», начальное положение груза «x0» и его начальную скорость «v0» зададим нулевыми – пусть груз движется из положения покоя в начале координат. Угол наклона плоскости установим в 45°, массу груза – 1 кг, коэффициент трения – 0.16 (сталь по стали со смазкой), жесткость пружины – 5 Н/м (специально возьмем пружину малой жесткости, чтобы смещение груза было побольше). К выходам координаты «x» и скорости «v» присоединим графики.

Схема для тестирования модели движения груза на пружине

Рис. 409. Схема для тестирования модели движения груза на пружине

Установим в параметрах блока-планировщика время остановки 10 с и шаг расчета 0.1 с. Запустив моделирование, на графиках мы увидим расходящиеся колебания (рис. 410). Если не останавливать расчет после десяти секунд, их амплитуда будет увеличиваться бесконечно.

Расходящиеся колебания при моделировании с шагом расчета 0.1 секунды

Рис. 410. Расходящиеся колебания при моделировании с шагом расчета 0.1 секунды

Но откуда в такой механической системе без подвода энергии извне (мы обнулили внешнюю силу) могут взяться расходящиеся колебания? В системе есть трение, поэтому, по всем законам физики, груз должен со временем остановиться, а не наращивать амплитуду колебаний. Дело в том, что шаг расчета в одну десятую секунды, установленный в параметрах блока-планировщика, слишком велик для заданных нами параметров груза, плоскости и сил при выбранном методе численного интегрирования. Слишком велики интервалы, на которых мы считаем скорость и ускорение груза постоянными, поэтому моделирование теряет не только точность, но и устойчивость – полученная картина уже не имеет ничего общего с поведением моделируемой системы. В этом легко убедиться, уменьшив шаг расчета в десять раз – при шаге в 0.01 с колебания затухают и груз останавливается (рис. 411).

Моделирование с шагом расчета 0.01 секунды

Рис. 411. Моделирование с шагом расчета 0.01 секунды

С таким значением шага можно моделировать движение груза и из других начальных условий, и меняя внешнюю силу Fvh. Например, на рис. 412 начиная с пятой секунды к уже остановившемуся грузу прикладывается постоянная сила в 5 Н – груз снова начинает двигаться и останавливается уже в другом положении.

Моделирование с изменением внешней силы

Рис. 412. Моделирование с изменением внешней силы

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

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


<< >> Оглавление Указатель