Пользовательский элемент управления. Создание клиентского приложения. Развитие серверного проекта, страница 10

{

// T — постоянная времени, c — декремент затухания, K - коэффициент усиления

double

d = Math.Sqrt (1 - c * c),

xk = x / T,

xd = xk * d;

return k * (1 - Math.Exp(-xk * c) * (Math.Cos(xd) + c * Math.Sin(xd) / d));

}

//==== Колебательный импульсный переходный процесс

double OscillatingDelta (double x,  double T, double c, double k)

{

// T — постоянная времени, c — декремент затухания, k - коэффициент усиления

double  d = Math.Sqrt (1 - c * c);  // колебательность

return k * Math.Exp (-c * x / T) * Math.Sin (d * x / T) / (T * d);

}

//=== Апериодический переходный процесс

double Aperiodic (double x, double T1, double T2, double k)

{

// T1, T2 — постоянные времени, K - коэффициент усиления

double

TT = T1 - T2, // Выделяется случай равенства собственных чисел

x1 = x / T1;

return TT != 0 ?

k * (1 + (T2 * Math.Exp(-x / T2) - T1 * Math.Exp(-x / T1)) / TT) :

k * (1 - (1 + x1) * Math.Exp (-x1));

}

//=== Апериодический импульсный переходный процесс

double AperiodicDelta (double x, double T1, double T2, double k)

{

// T1, T2 — постоянные времени, K - коэффициент усиления

double TT = T1 - T2; // Выделяется случай равенства собственных чисел

return TT != 0 ?

k * (Math.Exp(-x / T1) - Math.Exp(-x / T2)) / TT :

k * x * Math.Exp (-x / T1) / (T1 * T1);

}

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

double Gauss(double x, double m, double d) // Нормальный закон распределения плотности вероятностей

{

x = (x - m) / d; // m — математическое ожидание, d — дисперсия

return Math.Exp (-x * x / 2) / (d * Math.Sqrt (Math.PI));

}

double Poisson(double x, double  m) // Дискретное распределение Пуассона

{

if (x<0 || m==0) // m — математическое ожидание

return 0;

ulong i, k = (ulong)x; // k - это целый x

double mk;

for (i=2, mk=m; i<=k; i++) // mk = M^k / k!

mk *= m / i;

return  mk * Math.Exp(-m);

}

Приветствуется реализация других функций. Многие функции являются фундаментальными решениями линейных дифференциальных уравнений. Они встречаются не только в теории систем управления, но и при решении других задач (например, краевых задач матфизики). В качестве примера упомянем специальные функции, такие как: бесселевы, функции Мак-Дональда и другие.

Другие решения

Здесь рассматривается задача расчета электростатического поля пары точечных зарядов вдоль произвольной прямой линии, лежащей в плоскости, проходящей через центры зарядов.

Особенностью алгоритма расчета является то, что он производится в отдельном потоке (thread) приложения, который постоянно сообщает главному потоку (primary thread) о ходе вычислений. Он, собственно, постепенно заполняет массив точек графика, объявленный в классе главной формы. Кроме того, на главной форме расположен элемент управления типа ProgressBar. Он используется как индикатор хода процесса вычисления. Данные для этого индикатора (процент выполнения задания) поставляет рабочий поток, осуществляющий вычисление.

Поле рассчитывается по формуле, известной из курса теоретических основ электротехники (ТОЭ).

Рассмотрим процесс обмена данными между двумя потоками приложения. Он осуществляется с помощью механизма событий. В классе, обслуживающем вторичный поток (назовем его CalcField) мы объявляем свое собственное событие Move, которое будем возбуждать в момент, когда вычислено значение поля в очередной точке линии. На это событие реагирует главный поток приложения, то есть класс главной формы (MainForm). При этом, как известно, будет вызван делегат, имеющийся в коллекции делегатов события. Следовательно мы должны позаботиться о вставке делегата в событие Move. Более точной формулировкой того, что происходит при возникновении события, будет такая. Система вызовет функцию (или несколько функций), адрес которой вставлен в коллекцию заданий делегата.