
- •Содержание
- •2. Практическая часть 15
- •Выводы по работе 26 Список литературы 27 Цели и задачи
- •Задание на курсовую работу
- •1. Теоретическая часть Введение
- •1.1. Методы моделирования
- •Моделирование пи-регулятора
- •Моделирование безинерционного звена
- •Моделирование идеального интегрирующего звена
- •1.1.2 Моделирование объекта управления
- •Моделирование инерционного звена первого порядка
- •Моделирование инерционного звена второго порядка
- •Моделирование инерционного звена третьего порядка
- •1.1.3 Моделирование запаздывания
- •1.2. Оценка качества сар в динамике
- •1.3 Оптимизация динамических систем
- •2.2 Моделирование системы в SimOpt
- •2.2.1 Подготовка данных
- •2.2.2 Графики системы в SimOpt
- •2.2.3. Оптимизация модели на SimOpt
- •2.2.4. Анализ проведенной оптимизации
- •Выводы по работе
- •Список литературы
- •Приложение а.
Список литературы
-
Молчанов А. А. Моделирование и проектирование сложных систем.–К.: Высш. шк. Головное изд-во, 1988.
-
Григорьев В.А., Карельская К.А., Марголис Д.Б. Система моделирования и оптимизирования сложных динамических систем. Учебное пособие. – 2010.
Приложение а.
Исходный код программы.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ZedGraph;
namespace CourseWork
{
public struct PointD
{
public double X, Y;
public PointD(double X, double Y)
{
this.X = X; this.Y = Y;
}
}
public partial class Form1 : Form
{
List<PointD> ht;
List<PointD> pointsx1x2;
LineItem lt;
float ys = 1, F = 1, k, k1, k2, T1, T2, tau, t0, tk;
float H; //шаг
double ymax, ymax2;
float treg;
public Form1()
{
InitializeComponent();
ht = new List<PointD>();
pointsx1x2 = new List<PointD>();
k = 1; k1 = (float)4.53; k2 = (float)0.064;
T1 = 100; T2 = 200; tau = 20;
t0 = 0; tk = 500;
H = (float)0.1;
textBox1.Text = "" + H;
textBox2.Text = "" + t0;
textBox3.Text = "" + tk;
textBox4.Text = "" + ys;
ymax = 0; ymax2 = 1; treg = 0;
radioButton1.Checked = true;
}
private void Form1_Load(object sender, EventArgs e)
{
CreateGraph();
}
// отрисовка графика
public void CreateGraph()
{
zg1.GraphPane.CurveList.Clear();
// Установить заголовки и метки осей
zg1.GraphPane.Title.Text = "";
zg1.GraphPane.YAxis.Title.Text = "";
zg1.GraphPane.XAxis.Title.Text = "";
if (ht.Count != 0 && pointsx1x2.Count != 0)
{
double[] pX = new double[ht.Count];
double[] pt = new double[ht.Count];
double[] px1 = new double[pointsx1x2.Count];
double[] px2 = new double[pointsx1x2.Count];
for (int i = 0; i < ht.Count; i++)
{
pX[i] = ht[i].Y;
pt[i] = ht[i].X;
}
for (int i = 0; i < pointsx1x2.Count; i++)
{
px2[i] = pointsx1x2[i].Y;
px1[i] = pointsx1x2[i].X;
}
if (radioButton2.Checked == true)
{
lt = zg1.GraphPane.AddCurve("", px1, px2, Color.Green);
lt.Line.Width = 3;
}
if (radioButton1.Checked == true)
{
lt = zg1.GraphPane.AddCurve("", pt, pX, Color.Green);
lt.Line.Width = 3;
}
}
// Рассчитать диапазон шкал
zg1.AxisChange();
if (radioButton1.Checked == true)
{
double level = 1;
LineObj line = new LineObj(zg1.GraphPane.XAxis.Scale.Min, level, zg1.GraphPane.XAxis.Scale.Max, level);
// Стиль линии - пунктирная
line.Line.Style = System.Drawing.Drawing2D.DashStyle.Dash;
// Добавим линию в список отображаемых объектов
zg1.GraphPane.GraphObjList.Add(line);
}
zg1.Invalidate();
}
private void button1_Click(object sender, EventArgs e)
{
pointsx1x2.Clear(); ht.Clear();
bool flag = false;
if (textBox1.Text != "") { H = (float)Convert.ToDouble(textBox1.Text); }
if (textBox2.Text != "") { t0 = (float)Convert.ToDouble(textBox2.Text); }
if (textBox3.Text != "") { tk = (float)Convert.ToDouble(textBox3.Text); }
if (textBox4.Text != "") { ys = (float)Convert.ToDouble(textBox4.Text); }
// обнуление всех остальных переменных
float K1,K2,K3,K4,F=1,t;
float xp,xr,U,x1=0,x2=0,y1=0,yk=0,y=0,yx=0,IT=0;
int i,n;
if (ys != 0 && ys != 1)
{
MessageBox.Show("Ys=0 или Ys=1");
return;
}
float[] yr;//массив координат запаздывания.
n=(int)(tau/H); // рассчитывается длина массива запаздывания
yr= new float[n+1];
for (i=0;i<n;i++) // обнуляется массив запаздывания
{yr[i]=0;}
t =t0;
i=0; // количество шагов
while(t<=tk)
{
xp=x1;
x1=ys-y; // сигнал ошибки системы
x2=(x1-xp)/H; // производная сигнала ошибки
IT = IT + (x1 + xp) / 2 * H;
U=k1*x1+k2*IT; // сигнал с ПИ регулятора
xr=U+F; // сигнал + возмущение
yk=(xr-yx)/T1; // моделирование инерционного звена 2-го порядка
K1 = H * (xr - T1 * y1 - yx) / T2;
K2 = (float)(H * (xr - T1 * (y1 + K1 * 0.5) - (yx + y1 * H * 0.5 + K1 * H / 8)) / T2);
K3 = (float)(H * (xr - T1 * (y1 + K2 * 0.5) - (yx + y1 * H * 0.5 + K1 * H / 8)) / T2);
K4= (float)(H*(xr-T1*(y1+K3)-(yx+y1*H+K3*H*0.5))/T2);
yx=y1+(K1+2*K2+2*K3+K4)/6;
y1=y1+H*yk;
y=yr[i]; // моделирование звена запаздывания
yr[i++]=yx;
//
if (y > ymax) ymax = y; //опред. локального максимума
else
{
if (y == 1) flag = true;
if (flag == true && y > ymax2) ymax2 = y;
}
if (Math.Abs(y - ys) >= 0.05) //опред. времени регулирования
treg = t;
//
if (i>=n)
i=0;
ht.Add(new PointD(t, y)); // рисование графиков
if (t!=0)
pointsx1x2.Add(new PointD(x1,x2));
t=t+H;
}
CreateGraph();
}
}
}
2 ПИ-регулятор - пропорционально-интегральный регулятор