Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции Моделирование систем2.docx
Скачиваний:
16
Добавлен:
19.09.2019
Размер:
12.52 Mб
Скачать

Приложение 1

Код программы

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;

namespace WindowsFormsApplication1

{

public partial class Form1 : Form

{

double[] E = new double[150];

double[] Ur = new double[150];

double[] Yu = new double[150];

double[] Y = new double[150];

double[] Yw = new double[150] {0.1,0.2,0.5,0.4,0.2,0.3,0.8,0.5,0.2,0.0,0.4,

0.1,0.2,0.2,0.9,0.0,0.3,0.2,0.6,0.1,0.5,0.0,

0.3,0.6,0.2,0.7,0.3,0.0,0.9,0.6,0.0,0.4,0.7,

0.4,0.2,0.0,0.4,0.7,0.5,0.5,0.6,0.6,0.6,0.5,

0.3,0.2,0.5,0.1,0.3,0.5,0.8,0.3,0.2,0.6,0.5,

0.3,0.6,0.2,0.7,0.3,0.5,0.6,0.6,0.0,0.0,0.9,

0.6,0.0,0.4,0.7,0.2,0.2,0.9,0.0,0.3,0.3,0.6,

0.2,0.7,0.3,0.1,0.2,0.5,0.4,0.5,0.8,0.3,0.2,

0.6,0.5,0.0,0.4,0.7,0.5,0.5,0.2,0.7,0.3,0.0,

0.9,0.6,0.0,0.4,0.7,0.4,0.2,0.0,0.4,0.7,0.5,

0.5,0.1,0.3,0.5,0.8,0.3,0.0,0.4,0.7,0.2,0.2,

0.0,0.4,0.7,0.5,0.5,0.6,0.6,0.6,0.5,0.2,0.5,

0.4,0.5,0.8,0.3,0.2,0.5,0.8,0.3,0.0,0.4,0.3,

0.6,0.2,0.7,0.3,0.5,0.8,0.9};

double Yzad = 1;

double T = 10.00000;

double k = 1.00000;

double tau = 3.00000;

double a1, a2, Kp, Ku, Kn;

double skos = new double();

double[] skos2 = new double[2];

public Form1()

{

InitializeComponent();

}

private void chart1_Click(object sender, EventArgs e)

{

f(Ku, Kn, 1);

}

public void sko()

{

double tempo = new double();

for (int sk = 0; sk < Y.Length; sk++)

{

tempo += (Yzad - Y[sk]) * (Yzad - Y[sk]);

}

skos = tempo / (Y.Length - 1);

}

private void default_f()

{

Ku = 1 / tau;

Kn = T / tau;

f(Ku, Kn, 1);

}

// НАША ФУНКЦИЯ

private double f(double Ku, double Kn, int z)

{

for (int i = 2; i < Y.Length; i++)

{

Ur[i] = Uri(Ur[i - 1], E[i - 1], Ku, Kn);

Yu[i] = Yui(Ur[i], Yu[i - 1]);

Y[i] = Yi(Yu[i], Yw[i]);

E[i] = Ei(Yzad, Y[i]);

if (z == 1)

{

chart1.Series[0].Points.AddXY(i, Y[i]);

}

if (z == 2)

{

chart1.Series[1].Points.AddXY(i, Y[i]);

}

}

sko();

return skos;

}

//НАЧАЛЬНЫЕ ЗНАЧЕНИЯ

private void Form1_Load(object sender, EventArgs e)

{

a1 = k / (T + 1);

a2 = T / (T + 1);

Kp = T / (k + tau);

Ku = 1 / tau;

Kn = T / tau;

f(Ku, Kn, 2);

richTextBox1.AppendText("\n" + "СКО начальное" + "=" + Convert.ToString(skos));

chart2.Series[0].Points.AddXY(Math.Round(Ku, 6), Math.Round(Kn, 6));

chart2.Series[0].Points[0].Label = "0";

}

public double Uri(double Upred, double Epred, double Ku, double Kn)

{

double Uri = new double();

Uri = Upred + (Ku + Kn) * Epred;

return Uri;

}

public double Ei(double Yzad, double Yi)

{

double Ei = new double();

Ei = Yzad - Yi;

return Ei;

}

public double Yui(double Uri, double YuiPred)

{

double Yui = new double();

Yui = a1 * Uri + a2 * YuiPred;

return Yui;

}

public double Yi(double Yui, double Ywn)

{

double Yi = new double();

Yi = Yui + Ywn;

return Yi;

}

private void richTextBox1_TextChanged(object sender, EventArgs e)

{

}

private void button1_Click(object sender, EventArgs e)

{

Pokoordperebor();

}

private void Pokoordperebor()

{

do

{

double stepKn = (T/tau)*0.11;

double stepKu = (1/tau)*0.11;

skos2[1] = skos;

richTextBox1.AppendText("\n" + "\n" + " Ku = " + Convert.ToString(Ku) + " Kn = " + Convert.ToString(Kn));

//Ищем Kn

while (stepKn >= 0.07)

{

richTextBox1.AppendText("\n" + "Ищем Kn с шагом = " + Convert.ToString(stepKn));

if (f(Ku, Kn - stepKn, 0) < f(Ku, Kn, 0))

{

Kn = Kn - stepKn; //Новое значение Kn

}

else

{

if (f(Ku, Kn + stepKn, 0) < f(Ku, Kn, 0))

{

Kn = Kn + stepKn;

}

else

{

stepKn = stepKn * 0.5;

}

}

f(Ku, Kn, 0); //Узнаем значение СКО

richTextBox1.AppendText("\n" + "Kn = " + Convert.ToString(Kn) + " CKO= " + Convert.ToString(skos));

}

richTextBox1.AppendText("\n" + " Ku = " + Convert.ToString(Ku) + " Kn!!! после нахождения= " + Convert.ToString(Kn));

richTextBox1.AppendText("\n" + "______________________________ " + "\n");

chart2.Series[0].Points.AddXY(Math.Round(Ku, 6), Math.Round(Kn, 6));

//Ищем Ku

while (stepKu >= 0.01)

{

richTextBox1.AppendText("\n" + "Ищем Ku с шагом = " + Convert.ToString(stepKu) );

if (f(Ku - stepKu, Kn, 0) < f(Ku, Kn, 0))

{

Ku = Ku - stepKu; //Новое значение Ku

}

else

{

if (f(Ku + stepKu, Kn, 0) < f(Ku, Kn, 0))

{

Ku = Ku + stepKu; //Новое значение Ku

}

else

{

stepKu = stepKu * 0.5;

}

}

f(Ku, Kn, 0); //Узнаем значение СКО

richTextBox1.AppendText("\n" + "Ku = " + Convert.ToString(Ku) + " CKO= " + Convert.ToString(skos));

}

richTextBox1.AppendText("\n" + " Ku!!! после нахождения = " + Convert.ToString(Ku) + " Kn = " + Convert.ToString(Kn));

richTextBox1.AppendText("\n" + "______________________________ " + "\n");

chart2.Series[0].Points.AddXY(Math.Round(Ku, 6), Math.Round(Kn, 6));

f(Ku, Kn, 0);

richTextBox1.AppendText("\n" + " СКО текущее" + "=" + Convert.ToString(skos));

richTextBox1.AppendText("\n" + " СКО предыдущее" + "=" + Convert.ToString(skos2[1]));

} while (Math.Abs(skos2[1] - skos) > 0.05 * skos2[1]);

//Выводим Ku и Kn на форму

richTextBox1.AppendText("\n" + " HOHO Ku = " + Convert.ToString(Ku) + " Kn = " + Convert.ToString(Kn));

textBox1.Text = Convert.ToString(Ku);

textBox2.Text = Convert.ToString(Kn);

}

}

}

Практическая работа №2