Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая мод 8.doc
Скачиваний:
29
Добавлен:
19.12.2018
Размер:
888.83 Кб
Скачать

Список литературы

  1. Молчанов А. А. Моделирование и проектирование сложных систем.–К.: Высш. шк. Головное изд-во, 1988.

  2. Григорьев В.А., Карельская К.А., Марголис Д.Б. Система моделирования и оптимизирования сложных динамических систем. Учебное пособие. – 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 ПИ-регулятор - пропорционально-интегральный регулятор

31