Tải bản đầy đủ (.pdf) (17 trang)

Bài tập lớn mô HÌNH hóa và mô PHỎNG

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (550.18 KB, 17 trang )

MỤC LỤC
ĐỀ BÀI: ...................................................................................................................... 2
1.XẬY DỰNG HÀM TRUYỀN-THIẾT LẬP PHƯƠNG TRÌNH SAI PHÂN ....... 2
2.CODE CHƯƠNG TRÌNH MÔ PHỎNG – C# ....................................................... 4
3.IN KẾT QUẢ ĐƯỜNG CONG QUÁ ĐỘ............................................................ 11
5.IN KẾT QUẢ Y[K] ............................................................................................... 14
6.CÁC CHỈ TIÊU CHẤT LƯỢNG CỦA HỆ THỐNG .......................................... 16
7.NHẬN XÉT: ......................................................................................................... 17
8.TÀI LIỆU THAM KHẢO:.................................................................................... 17

1


ĐỀ BÀI:

Dùng máy tính khảo sát quá trình quá độ của hệ điều khiển tự động.
Yêu cầu:
1. Chương trình có thể viết bằng ngôn ngữ C/C++,visual,VB,matlab,..
2. Cho phép người dùng nhập các tham số T1,T2,T3,K1,K2,K3,..
3. Cho phép người dùng nhập bước cắt mẫu T
4. Hiển thị đường cong quá độ trên trục có khắc tọa độ để đánh giá tính ổn định
của hệ thống
5. Thể hiện được các chỉ tiêu như ymax , max (%), yod,Tmax ,Tod… trên đồ thị
6. In ra màn hình 100 điểm y[k] ( cứ 10 điểm in 1 giá trị)
1.XẬY DỰNG HÀM TRUYỀN-THIẾT LẬP PHƯƠNG TRÌNH SAI PHÂN
Hàm truyền kín của hệ thống là:
𝐾1
𝐾2
𝐾1 𝐾2
𝑇1 𝑠 + 1 𝑇2 𝑠 + 1
𝑊(𝑠) =


=
𝐾1 . 𝐾2 . 𝐾3
(𝑇1 𝑠 + 1)(𝑇2 𝑠 + 1) + 𝐾1 𝐾2 𝐾3
1+
(𝑇1 𝑠 + 1)(𝑇2 𝑠 + 1)
𝑊(𝑠) =

𝐾1 𝐾2
𝑇1 𝑇2 𝑠 2 + (𝑇1 + 𝑇2 )𝑠 + 𝐾1 𝐾2 𝐾3 + 1

2


2 𝑧−1

Thay 𝑠 = .

𝑇 𝑧+1

vào hàm W(s) ta có:

2 𝑧−1
𝐾1 𝐾2 . ( .
)
𝑇
𝑧
+
1
𝑊(𝑧) =
2 𝑧−1 2

2 𝑧−1
𝑇1 𝑇2 . (𝑇 . 𝑧 + 1) + (𝑇1 + 𝑇2 ) (𝑇 . 𝑧 + 1) + 𝐾1 𝐾2 𝐾3 + 1
𝐾1 𝐾2 𝑇 2 (𝑧 + 1)2
𝑊(𝑧) =
4𝑇1 𝑇2 (𝑧 − 1)2 + (𝐾1 𝐾2 𝐾3 + 1)𝑇 2 (𝑧 + 1)2 + 2(𝑇1 + 𝑇2 )𝑇(𝑧 + 1)(𝑧 − 1)
Biến đổi về dạng:
𝑌(𝑧) 𝐾1 𝐾2 𝑇 2 (𝑧 2 + 2𝑧 + 1)
=
𝑈(𝑧)
𝐴𝑧 2 + 𝐵𝑧 + 𝐶
Trong đó:
𝐴 = 4𝑇1 𝑇2 + 2𝑇(𝑇1 + 𝑇2 ) + (𝐾1 𝐾2 𝐾3 + 1)𝑇 2
𝐵 = −8𝑇1 𝑇2 + 2𝑇 2 (𝐾1 𝐾2 𝐾3 + 1)
𝐶 = 4𝑇1 𝑇2 − 2𝑇(𝑇1 + 𝑇2 ) + (𝐾1 𝐾2 𝐾3 + 1)𝑇 2
 Az2Y(z) + BzY(z) + CY(z) = K1K2T2 [z2U(z) + 2zU(z) + U(z)]
Dùng tính chất dịch hàm gốc cả biến đổi Z ta tìm được phương trình sai phân tương
ứng:
 AY[k+2] + BY[k+1] + CY[k] = K1K2T2 (U[k+2] + 2 U[k+1] + U[k])
Vì tín hiệu vào là tín hiệu nhảy cấp U(t) = 1(t) nên ta có:
U[k+2] = U[k+1] = U[k] = 1
 AY[k+2] + BY[k+1] + CY[k] = 4K1K2T2
 Y[k+2] = (4K1K2T2 – BY[k+1] – CY[k]) /A
Từ đó ta có công thức tính các giá trị đáp ứng y(t) như sau:
y[0] = y[1] = 0;
y[k+2] = (4K1K2T2 – By[k+1] – Cy[k]) /A;
k=0, 1, 2…999; A, B, C là các hằng số đã tính ở trên.

3



2.CODE CHƯƠNG TRÌNH MÔ PHỎNG – C#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace test
{
public partial class Form1 : Form
{
private Graphics graph;
private int x0, y0, xMax, yMax;
// tọa độ gốc O, xMax, yMax
private int min, max;
private int delta_x=30;
private int delta_y=30;
// độ lệch trục tọa độ khi vẽ
private double dx, x, y;
private float x1, y1, x2, y2;
private bool OnDinh = true;
private float K1, K2, K3, T1, T2, T;
//thông số đầu vào
private float Tmin;
private float ymax, yod, x_ymax, Tod, Tmax, xicma;
//Thông số đầu ra cần tính toán

private int x_Tod;
// Xác định tọa độ của Tod;

private float unit_x, unit_y;
private float A, B, C;

// Độ chia để vẽ đồ thị

public Form1()
{
InitializeComponent();
graph = DrawArea.CreateGraphics();

4


xMax = DrawArea.Width;
yMax = DrawArea.Height;
x0 = 0;
y0 = DrawArea.Height;
}
private void button1_Click(object sender, EventArgs e)
{
int sopt = 1000;
graph.Clear(Color.White);
float[] y = new float[sopt];
PointF[] pnt = new PointF[sopt];
Pen blackPen = new Pen(Color.Black, 1);
Pen redPen = new Pen(Color.Red, 1);
Pen greenPen = new Pen(Color.Green, 3);

int index = 0;
for (int i = 0; i < 100; i++)
{
// 100 chỉ số điểm y[k] cần in ra.
comboBox_item.Items.Add(index);
index += 10;
}
listBox1.Items.Clear(); // phải xóa rỗng listbox mỗi lần cập nhật lại đồ thị
// Kiểm tra nhập thông số hợp lệ hay không
if (float.TryParse(textBoxK1.Text, out K1) && float.TryParse(textBoxK2.Text, out
K2)
&& float.TryParse(textBoxT2.Text, out T2) && float.TryParse(textBoxT1.Text, out
T1) && float.TryParse(textBoxT.Text, out T)
&& float.TryParse(textBoxT2.Text, out K3))
{
if (T1 < T2) { Tmin = T1/20; }
else { Tmin = T2 / 20; }
if (T > Tmin)
{ MessageBox.Show("Xin nhập lại chu kỳ trich mẫu T, T<= (1/20) Min(T1,T2) !"); }
// chu kỳ trích mẫu
else
{
A = 4 * T1 * T2 + 2*T*(T1+T2) + (1 + K1 * K2 * K3) *T*T;
B = (-8*T1*T2 +(2 +2*K1*K2*K3) *T*T);
C = 4*T1*T2 - 2*T*(T1+T2) + T*T*(1 + K1 *K2 *K3);

5


float a0 = (1 + K1 * K2 * K3);

float a1 = (T1 + T2);
float a2 = (T1 * T2);
//Kiem tra tinh on dinh he thong theo tieu chuan Hurwits
if ((a1 > 0) && (a2 > 0)) { OnDinh = true; }
else OnDinh = false;
y[0] = 0; y[1] = 0;
ymax = y[1];
float ymin = 0;
for (int i = 0; i < (sopt - 2); i++)
{
y[i + 2] = (4*K1*K2*T*T - B *y[i+1] - C* y[i]) / A;
if (ymax < y[i]) { ymax = y[i]; x_ymax = i; } // Tìm vị trí và giá trị của ymax
if (ymin > y[i]) { ymin = y[i]; }
}
if (ymin < 0) { y0 = DrawArea.Height / 2; }
// ymin dùng để vẽ trục tọa độ khi có giá trị y âm!!! => có thể hệ thống ko ổn định
else { y0 = DrawArea.Height; }
//=== Tính toán lại độ chia để đồ thị nằm chọn trong "gọn" trong picturebox
unit_x = (DrawArea.Width - 3 * delta_x) / (T * 1000);
unit_y = (y0 - 3 * delta_y) / ymax;
for (int j = 0; j <= (sopt - 1); j++)
{
// Cập nhật các điểm đồ thị ->pnt
float toado_x = +j * T;
float toado_y = y[j];
pnt[j].X = (float)(delta_x + toado_x * unit_x);
//nhân với độ chia để full màn hình
pnt[j].Y = (float)( y0 - toado_y * unit_y - delta_y);
if (j % 10 == 0)
{ //Lấy 4 chữ số sau dấu phẩy

int tmp = (int)(y[j] * Math.Pow(10, 4));
float _item = (float)(tmp / Math.Pow(10, 4));
listBox1.Items.Add(_item); // Cứ 10 phần tử thì thêm y[] vào listbox
}
// listBox1.DataSource = y; add cả mảng y
// listBox1.Items.Add(y[0]); add từng phần tử
}

6


VeTrucToaDo();
// Vẽ trục tọa độ
graph.DrawLines(greenPen, pnt);
// Vẽ đồ thị
// Vẽ vạch chia hoành độ
Font f = new Font("Tahoma", 12);
Brush b = new SolidBrush(Color.Red);
float chi_so = 0;
for (int i = 0; i < 10; i++)
{ chi_so += 100;
graph.DrawLine(blackPen, delta_x + chi_so * T * unit_x, y0 - delta_y - 3, delta_x
+ chi_so * T * unit_x, y0 - delta_y + 3);
graph.DrawString(chi_so.ToString(), f, b, delta_x + (chi_so - 15) * T * unit_x, y0
- 20);
}
if (OnDinh)
{
//==============Tính thời gian hệ thống bắt đầu ổn định
int k = 999;

do
{
Tod = k * T; // Thời gian ổn định
--k;
x_Tod = k;
}
while ((Math.Abs((y[k] - y[999]) / y[999]) <= 0.05) && (k >= x_ymax));
k = 999;
do
{ --k; }
while (Math.Abs((y[k] - (1 / K2)) / (1 / K2)) <= 0.01);
yod = 0;
for (int i = k; i < 1000; i++)
{
yod += y[i];
}
yod = yod / (999 - k + 1);
xicma = Math.Abs(ymax - yod) * 100 / yod;
Tmax = x_ymax * T;
// Đưa ra các thông số đầu ra
textBoxHT.Text = "Ổn định";
textBoxTod.Text = Tod.ToString();
textBoxYod.Text = yod.ToString();

7


textBoxTmax.Text = Tmax.ToString();
textBoxYmax.Text = ymax.ToString();
textBoxxicma.Text = xicma.ToString();

// Vẽ gióng tọa độ của ymax
float toa_do_x = delta_x;
float toa_do_y = y0 - ymax * unit_y - delta_y;
do
{
graph.DrawLine(blackPen, toa_do_x, y0 - ymax * unit_y - delta_y, toa_do_x +
3, y0 - ymax * unit_y - delta_y); //giong ngang
toa_do_x += 6;
} while (toa_do_x <= delta_x + x_ymax * T * unit_x);
do{
graph.DrawLine(blackPen, delta_x + x_ymax * T * unit_x, toa_do_y, delta_x +
x_ymax * T * unit_x, toa_do_y +3); //doc
toa_do_y +=6;
} while (toa_do_y <= y0 - ymax * unit_y - delta_y);
graph.DrawString("Ymax=" + ymax.ToString(), f, b, delta_x + x_ymax * T *
unit_x, y0 - ymax * unit_y - 2 * delta_y);
// Vẽ gióng yod
toa_do_x = delta_x;
do
{
graph.DrawLine(blackPen, toa_do_x, y0 - delta_y - yod * unit_y, toa_do_x +3,
y0 - delta_y - yod * unit_y);
graph.DrawLine(blackPen, toa_do_x, y0 - delta_y - yod * unit_y * 1.05F,
toa_do_x + 3, y0 - delta_y - yod * unit_y * 1.05F);
graph.DrawLine(blackPen, toa_do_x, y0 - delta_y - yod * unit_y * 0.95F,
toa_do_x + 3, y0 - delta_y - yod * unit_y * 0.95F);
toa_do_x += 6;
} while (toa_do_x <= (xMax - 2 * delta_x));
graph.DrawString("Yod=" + yod.ToString(), f, b, xMax - 7 * delta_x, y0 - delta_y
- yod * unit_y * 1.1F);

//Vẽ gióng Tod
toa_do_y = y0 - delta_y - y[x_Tod] * unit_y;
do
{
graph.DrawLine(blackPen, delta_x + x_Tod * T * unit_x, toa_do_y, delta_x +
x_Tod * T * unit_x, toa_do_y + 3);

8


toa_do_y += 6;
} while (toa_do_y <= (y0-delta_y));
graph.DrawString("Tod=" + x_Tod.ToString(), f, b, delta_x + x_Tod * T * unit_x
+ 10, y0 - 2*delta_y);
chi_so = ymax / 5;
int _tmp = (int)(chi_so * Math.Pow(10, 1));
chi_so = (float)(_tmp / Math.Pow(10, 1));
float tmp2 = chi_so;
for (int i = 0; i <= 15; i++)
if ((chi_so>0) && (chi_so{
graph.DrawLine(blackPen, delta_x - 3, yMax - chi_so * unit_y - delta_y,
delta_x + 3, yMax - chi_so * unit_y - delta_y);
_tmp = (int)(chi_so * Math.Pow(10, 1));
chi_so = (float)(_tmp / Math.Pow(10, 1));
graph.DrawString(chi_so.ToString(), f, b, delta_x - 30, yMax - chi_so * unit_y delta_y-10);
chi_so += tmp2;
}
} else
{ textBoxTod.Text = "N/A";

textBoxHT.Text = "Không ổn định";
textBoxYod.Text = "N/A";
textBoxTmax.Text = "N/A";
textBoxYmax.Text = "N/A";
textBoxxicma.Text = "N/A";
}
}
}
else
MessageBox.Show("Xin chỉ nhập dữ liệu dạng số!");
}
//============================================//
private void VeTrucToaDo()
{ Pen p = new Pen(Color.Black, 2);
graph.DrawLine(p, delta_x, y0 - delta_y, xMax - 2, y0 - delta_y);//truc hoanh
graph.DrawLine(p, delta_x, 4, delta_x, yMax - delta_y);//truc tung
MuiTen(graph, new Pen(Color.Black), new PointF((float)(xMax - 2.5), (float)(y0 delta_y)), new PointF((float)(xMax - 2), (float)(y0 - delta_x))); //mui ten Ox
MuiTen(graph, new Pen(Color.Black), new PointF((float)delta_y, (float)0), new
PointF((float)delta_y, (float)(-2.5))); //mui ten Oy

9


VeOXY();
}
//============================================//
private void VeOXY()
{ Font f = new Font("Tahoma", 12);
Brush b = new SolidBrush(Color.Black);
graph.DrawString("O", f, b, x0, y0 - delta_y);

graph.DrawString("T", f, b, xMax - 20, y0 - 18);
graph.DrawString("Y", f, b, x0 + 3, 5);
}
//============================================//
public static void MuiTen(Graphics graphics, Pen p, PointF diemDau, PointF diemCuoi)
{ Pen myPen = new Pen(Color.Black);
myPen.Width = 5;
myPen.EndCap = LineCap.ArrowAnchor;
PointF endPoint = new PointF((diemDau.X + diemCuoi.X) / 2, (diemDau.Y +
diemCuoi.Y) / 2);
graphics.DrawLine(myPen, diemDau, endPoint);
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{ // Đưa chỉ số của y ra comboBox
comboBox_item.Text = ((listBox1.SelectedIndex) * 10).ToString();
}
private void comboBox_item_SelectedIndexChanged(object sender, EventArgs e)
{
listBox1.SelectedIndex =int.Parse(comboBox_item.Text ) /10;
}
}
}// END OF PROGRAM

10


*GIAO DIỆN CHƯƠNG TRÌNH:

Khung bên trái, phần “NHẬP THAM SỐ” là để nhập các tham số K1, K2, K3,T1,
T2,T.

Sau khi nhập xong ấn “VẼ VÀ KIỂM TRA ĐẶC TÍNH HỆ THỐNG” để vẽ đồ thị
và tính toán các chỉ tiêu chất lượng và in ra các gị trị của y[k]
3.IN KẾT QUẢ ĐƯỜNG CONG QUÁ ĐỘ
Chọn bộ thông số: K1=4; K2=5; K3=2; T1=2; T2=3; T=0.01
Giao diện chương trình sau khi mô phỏng:

11


Đồ thị:

12


Trục x thể hiện giá trị T (1000 lần chu kỳ trich mẫu).
Trục y thể hiện giá trị của y(t) theo T.
4.MÔ PHỎNG TRÊN MATLAB
Sơ đồ simulink:

Lệnh vẽ đồ thị:
>> figure(1)
>> plot(ScopeData.time,ScopeData.signals.values)
>> grid on

Đường cong quá độ thu được qua Matlab:

13


Nhận xét:

Đồ thị thu được bằng chương trình mô phỏng có dạng giống với đồ thị mô
phỏng bởi Matlab. Như vậy, nếu bỏ qua sai số không thể tránh khỏi trong quá trình
mô phỏng, chúng ta có thể kiểm chứng được phương pháp tìm phương trình sai
phân của hệ thống, và tính toán của chương trình mô phỏng là đúng.
5.IN KẾT QUẢ Y[K]
In ra màn hình kết quả y[k], cách 10 số in 1 lần
Sử dụng listbox để đưa ra 100 giá trị, cứ 10 giá trị thì add phần tử đó vào
listbox.

y[10]=0.0145

y[260]=0.3254

y[510]=0.4337

y[760]=0.4703

y[20]=0.0587

y[270]=0.3475

y[520]=0.4435

y[770]=0.4744

14


y[30]=0.1274


y[280]=0.377

y[530]=0.4555

y[780]=0.479

y[40]=0.214

y[290]=0.4113

y[540]=0.4686

y[790]=0.4839

y[50]=0.3116

y[300]=0.4479

y[550]=0.4819

y[800]=0.4886

y[60]=0.4128

y[310]=0.4841

y[560]=0.4945

y[810]=0.4928


y[70]=0.5109

y[320]=0.5176

y[570]=0.5056

y[820]=0.4964

y[80]=0.5996

y[330]=0.5466

y[580]=0.5147

y[830]=0.4991

y[90]=0.6738

y[340]=0.5693

y[590]=0.5213

y[840]=0.5009

y[100]=0.7301

y[350]=0.5849

y[600]=0.5251


y[850]=0.5016

y[110]=0.766

y[360]=0.593

y[610]=0.5263

y[860]=0.5014

y[120]=0.7809

y[370]=0.5935

y[620]=0.5248

y[870]=0.5003

y[130]=0.7754

y[380]=0.5871

y[630]=0.521

y[880]=0.4984

y[140]=0.7517

y[390]=0.5747


y[640]=0.5153

y[890]=0.496

y[150]=0.7126

y[400]=0.5576

y[650]=0.5083

y[900]=0.4933

y[160]=0.662

y[410]=0.5373

y[660]=0.5005

y[910]=0.4904

y[170]=0.6041

y[420]=0.5154

y[670]=0.4925

y[920]=0.4875

y[180]=0.5432


y[430]=0.4935

y[680]=0.4848

y[930]=0.4849

y[190]=0.4835

y[440]=0.4729

y[690]=0.4779

y[940]=0.4827

y[200]=0.4289

y[450]=0.4579

y[700]=0.4722

y[950]=0.481

15


y[210]=0.3825

y[460]=0.4405

y[710]=0.4679


y[960]=0.4798

y[220]=0.3466

y[470]=0.4303

y[720]=0.4653

y[970]=0.4792

y[230]=0.3228

y[480]=0.4247

y[730]=0.4644

y[980]=0.4793

y[240]=0.3117

y[490]=0.4236

y[740]=0.465

y[250]=0.3129

y[500]=0.4268

y[750]=0.4671


y[990]=0.4799

6.CÁC CHỈ TIÊU CHẤT LƯỢNG CỦA HỆ THỐNG
Các chỉ tiêu chất lượng của hệ thống được tính toán tự động trong giao
diện chính của chương trình, phụ thuộc vào bộ tham số đầu vào
Nếu hệ thống ổn định, textbox “Hệ thống” sẽ đưa ra thông báo ổn định, đồng
thời các chỉ tiêu chất lượng được đưa ra các ô tương ứng.
Nếu hệ thống không ổn định, textbox “Hệ thống” sẽ đưa ra thông báo không
ổn định, các ô chỉ tiêu đưa ra thông báo “N/A”
(Tính ổn định của hệ thống được đánh giá theo tiêu chuẩn Hurwitz)
Ví dụ: Với bộ thông số đầu vào như phần trên, hệ thống là ổn định với các chỉ tiêu

như sau:

16


7.NHẬN XÉT
Với bộ thông số T1, T2, K1, K2, K3, T phù hợp, hệ thống sẽ ổn định. Cần chọn
thời gian trích mẫu T nhỏ hơn hoặc bằng 1/10 min(T1, T2). Các thông số trên đều
phải khác 0.
Đường cong xuất phát từ gốc tọa độ, vọt lên tới giá trị Ymax tại thời điểm
Tmax, dao động xung quanh giá trị Yod. Giá trị vượt quá tối đa so với Yod là h
(%).
Đến thời gian Tod, hệ ổn định, chỉ dao động trong phạm vi 5% xung quanh giá
trị Yod.
8.TÀI LIỆU THAM KHẢO
1.Nguyễn Công Hiền, Nguyễn Phạm Thục Anh, Mô hình hóa hệ thống và mô
phỏng, NXB Khoa học và Kỹ thuật, 2006

2.Các sách,tài liệu C# và tìm hiểu tham khảo trên Internet.

17



×