Модель системы обработки информации

Автор работы: Пользователь скрыл имя, 14 Апреля 2014 в 20:45, курсовая работа

Краткое описание


При проектировании вычислительных устройств возникает необходимость в проверке работоспособности, оценке качества, надежности функционирования и определения статистических параметров разрабатываемого устройства. Но поскольку необходимо исследовать вычислительную систему до ее фактического изготовления, то прибегают к построению модели устройства. На этой модели наблюдают за работой проектируемой вычислительной системы и собирают и анализируют ее статистические параметры. Преимущество использования модели для изучения характеристик объекта заключается в возможности проанализировать за короткий промежуток времени большое количество разнообразных ситуаций, возможных в объекте. Использование для этого фактического устройства позволило бы вести сбор статистических параметров только в масштабе реального времени

Содержание


Введение 2
1 Постановка задачи 3
2 Представление объекта моделирования в виде системы массового обслуживания 4
3 Описание процесса функционирования в виде временной диаграммы 6
4 Разработка ГСЧ 7
4.1 ГСЧ 1А и ГСЧ1Б 7
4.2 ГСЧ 2А и ГСЧ2Б 8
4.3 Оценка качества ГСЧ 10
5 Разработка алгоритмической модели объекта 19
6 Моделирование с целью оценки заданных характеристик объекта 20
7 Анализ результатов моделирования 31
Заключение 34
Список использованных источников 35

Прикрепленные файлы: 1 файл

ПЗ.doc

— 3.19 Мб (Скачать документ)

            for (i = 0; i < Kolvo; i++)

            {

                if (MyNums[i] == Lev)

                    Interval[0]++;

                for (int k = 0; k < Intervals; k++)

                {

                    if ((MyNums[i] > Delta * k + Lev) &&

                      (MyNums[i] <= Delta * (k + 1) + Lev))

                    {

                        Interval[k]++;

                    }

                }

            }

            double[] Ideal = new double[Intervals];

            for (i = 0; i < Intervals; i++)

            {

                Ideal[i] = radioButton3.Checked ?

                  Integral(Lev + Delta * i, Lev + Delta * (i + 1), 36, 0.95) :

                  Integral(Lev + Delta * i, Lev + Delta * (i + 1), 20, 0.85);

            }

            dataGridView2.RowCount = Intervals + 1;

            double S1, H1, S = 0, SOtkl = 0;

            for (i = 0; i < Intervals; i++)

            {

                dataGridView2.Rows[i].Cells[0].Value = (Delta * i + Lev).ToString() + ".." + (Delta * (i + 1) + Lev).ToString();

                dataGridView2.Rows[i].Cells[1].Value = Interval[i].ToString();

                H1 = Math.Round((double)Interval[i] / (Kolvo * Delta), 4);

                dataGridView2.Rows[i].Cells[2].Value = H1.ToString();

                S1 = Math.Round((double)Interval[i] / Kolvo, 4);

                dataGridView2.Rows[i].Cells[3].Value = S1.ToString();

                dataGridView2.Rows[i].Cells[4].Value = Math.Round(Ideal[i], 4).ToString();

                S += S1;

                SOtkl += Math.Round(Math.Abs(S1 - Ideal[i]), 4);

            }

            sump2.Text = S.ToString();

            potk2.Text = SOtkl.ToString();

            double PogrRasp = Math.Round(SOtkl / S * 100.0, 4);

            pogr2.Text = PogrRasp.ToString() + "%";

            chart2.Series["Series1"].Points.Clear();

            chart2.Series["Series2"].Points.Clear();

            for (i = 0; i < Intervals; i++)

            {

                chart2.Series["Series1"].Points.AddXY((((Delta * i + Lev))), Math.Round((double)Interval[i] / (Kolvo * Delta), 4));

                chart2.Series["Series2"].Points.AddXY((((Delta * i + Lev))), Ideal[i] / Delta);

            }

        }

 

        double VeibulZakon(double x, double c, double beta)

        {

            if (x > c)

                return beta * Math.Pow(x - c, beta - 1) * Math.Exp(-Math.Pow(x - c, beta));

            else

                return 0;

        }

 

        double Integral(double x1, double x2, double c, double beta)

        {

            const double step = 0.001;

            double x, S;

            S = 0;

            for (x = x1; x < x2; x = x + step)

            {

                S += VeibulZakon(x, c, beta) * step;

            }

            return S;

        }

    }

}

 

!!!!!!! Main !!!!!!!

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 Kursach

{

    public partial class Main : Form

    {

        public Main()

        {

            InitializeComponent();

        }

 

        private void button1_Click(object sender, EventArgs e)

        {

            int GenedSignals = 0, PostupiloMes = 0, DeleteMes = 0, V = 12, Polomok = 0, SignalovStoped = 0, SignalovPolucheno = 0;

            double NextSignalTime = 0, SignalProcessedTime = 0;

            Random rand = new Random();

            double VremyaActive = 0, LastTime = 0, time = 0;

            int MaxTime = 60 * 60 * 24 * 15;

            double[] Mes = new double[MaxTime];

            double DeltaT = 1.0;

            bstart.Enabled = false;

            listBox1.Items.Clear();

            Boolean Sostoyanie = true, Processed = false;

            double PolomkaTime, PochinkaTime = 0, VremyaRaboty = 0, VremyaVosst = 0;

            int sum, SignalovObrabotano = 0, Pochinok = 0;

            double t;

            NextSignalTime = 20.0 + 20.0 * Convert.ToDouble(rand.Next(1000000)) / 1000000;

            int i;

            int n = 500;

            double step = 0.00001;

            int j;

            double[] granica1 = new double[n + 1];

            double[] granica2 = new double[n + 1];

            double pos = 36;

            double sq = 0, sq1;

            do

            {

                sq += VeibulZakon(pos, 36, 0.95) * step;

                pos += step;

            } while (pos < 42);

            sq1 = sq / n;

            granica1[0] = 36;

            pos = 36;

            for (j = 1; j < n; j++)

            {

                sq = 0;

                do

                {

                    sq += VeibulZakon(pos, 36, 0.95) * step;

                    pos += step;

                } while (sq < sq1);

                granica1[j] = pos;

            }

            granica1[n] = 42;

            double pos2 = 20;

            do

            {

                sq += VeibulZakon(pos2, 20, 0.85) * step;

                pos2 += step;

            } while (pos2 < 27);

            sq1 = sq / n;

            granica2[0] = 20;

            pos2 = 20;

            for (j = 1; j < n; j++)

            {

                sq = 0;

                do

                {

                    sq += VeibulZakon(pos2, 20, 0.85) * step;

                    pos2 += step;

                } while (sq < sq1);

                granica2[j] = pos2;

            }

            granica2[n] = 27;

            int interval;

            interval = rand.Next(n);

            double left_val = granica1[interval];

            double right_val = granica1[interval + 1];

            PolomkaTime = (Convert.ToDouble(rand.Next(1000000)) / 1000000 * (right_val - left_val) + left_val) * 60 * 60;

            do

            {

                time += DeltaT;

                if (time >= NextSignalTime)

                {

                    if (time < 10000) listBox1.Items.Add(time.ToString() + ": Поступил сигнал от датчика");

                    GenedSignals++;

                    PostupiloMes++;

                    if (time < 10000) listBox1.Items.Add(time.ToString() + ": Сигнал добавлен в канал");

                    if (Mes[V - 1] > 0)

                    {

                        DeleteMes++;

                        if (time < 10000) listBox1.Items.Add(time.ToString() + ": Удаление сигнала из-за переполнения канала");

                    }

                    for (i = V - 1; i > 0; i--)

                    {

                        Mes[i] = Mes[i - 1];

                    }

                    Mes[0] = time;

                    NextSignalTime = time + 20.0 + 20.0 * Convert.ToDouble(rand.Next(1000000)) / 1000000;

                }

                if (Sostoyanie)

                {

                    VremyaActive += (time - LastTime);

                    if (time >= PolomkaTime)

                    {

                        Sostoyanie = false;

                        Polomok++;

                        listBox1.Items.Add(time.ToString() + ": Поломка ЭВМ");

                        if (Processed)

                        {

                            listBox1.Items.Add(time.ToString() + ": Обрабатываемый сигнал направлен обратно в канал");

                            PostupiloMes++;

                            listBox1.Items.Add(time.ToString() + ": Сигнал добавлен в канал");

                            if (Mes[V - 1] >= 0)

                            {

                                DeleteMes++;

                                listBox1.Items.Add(time.ToString() + ": Удаление сигнала из-за переполнения канала");

                            }

                            for (i = V - 1; i > 0; i--)

                            {

                                Mes[i] = Mes[i - 1];

                            }

                            Mes[0] = time;

                            Processed = false;

                            SignalovStoped++;

                        }

                        interval = rand.Next(n);

                        left_val = granica2[interval];

                        right_val = granica2[interval + 1];

                        PochinkaTime = time + (Convert.ToDouble(rand.Next(1000000)) / 1000000 * (right_val - left_val) + left_val) * 60;

                    }

                    else

                    {

                        if (!Processed)

                        {

                            sum = 0;

                            for (i = 0; i < V; i++)

                            {

                                if (Mes[i] > 0)

                                    sum++;

                            }

 

                            if (sum > 0)

                            {

                                t = -1;

                                for (i = V - 1; i >= 0; i--)

                                {

                                    if (Mes[i] >= 0)

                                    {

                                        t = Mes[i];

                                        Mes[i] = -1;

                                        if (time < 10000) listBox1.Items.Add(time.ToString() + ": Сигнал прочитан из канала");

                                        break;

                                    }

                                }

                                Processed = true;

                                if (time < 10000) listBox1.Items.Add(time.ToString() + ": Сигнал запущен на обработку");

                                SignalovPolucheno++;

                               SignalProcessedTime = time + 15.0 + 20.0 * Convert.ToDouble(rand.Next(10000000)) / 10000000;

                            }

                        }

                        else

                        {

                            VremyaRaboty += (time - LastTime);

                            if (time >= SignalProcessedTime)

                            {

                                SignalovObrabotano++;

                                Processed = false;

                                if (time < 10000) listBox1.Items.Add(time.ToString() + ": Обработка сигнала завершна");

                            }

                        }

                    }

                }

                else

                {

                    VremyaVosst += (time - LastTime);

                    if (time >= PochinkaTime)

                    {

                        Sostoyanie = true;

                        Pochinok++;

                        interval = rand.Next(n);

                        left_val = granica1[interval];

                        right_val = granica1[interval + 1];

                        PolomkaTime = time + (Convert.ToDouble(rand.Next(1000000)) / 1000000 * (right_val - left_val) + left_val) * 60 * 60;

                        listBox1.Items.Add(time.ToString() + ": ЭВМ восстановлена");

                    }

                }

                LastTime = time;

            } while (time < MaxTime);

            listBox1.Items.Add(time.ToString());

            bstart.Enabled = true;

            label1.Text = "Прошло времени: " + time.ToString();

            label2.Text = "Количество сигналов, сгенерированных датчиками: " + GenedSignals.ToString();

            label3.Text = "Количество сигналов, поступивших в канал (от датчиков и от ЭВМ): " + PostupiloMes.ToString();

            label4.Text = "Количество сигналов, удаленных из канала из-за переполнения: " + DeleteMes.ToString();

            label5.Text = "Количество сигналов, поступивших из канала в ЭВМ: " + SignalovPolucheno.ToString();

            label6.Text = "Количество сигналов, направленных обратно в канал из-за поломки ЭВМ: " + SignalovStoped.ToString();

            label7.Text = "Количество сигналов, обработанных в ЭВМ: " + SignalovObrabotano.ToString();

            label9.Text = "ЭВМ вышла из строя, раз: " + Polomok.ToString();

            label10.Text = "ЭВМ была восстановлена, раз: " + Pochinok.ToString();

            label11.Text = "Состояние ЭВМ: " + (Sostoyanie ? "активна" : "восстанавливается");

            label12.Text = "ЭВМ обрабатывает сигнал: " + (Processed ? "да" : "нет");

            label13.Text = "Время нахождения ЭВМ в активном состоянии: " + VremyaActive.ToString();

            label14.Text = "Время нахождения ЭВМ в состоянии восстановления: " + VremyaVosst.ToString();

            label15.Text = "Время фактической обработки сигналов на ЭВМ: " + VremyaRaboty.ToString();

            label16.Text = "Время когда ЭВМ была в актином состоянии, но не обрабатывала сигналы: " + (VremyaActive - VremyaRaboty).ToString();

            double KoefGot = VremyaActive / time;

            double KoefZag = VremyaRaboty / VremyaActive;

            double PokazEff = (double)SignalovObrabotano / GenedSignals;

            label17.Text = "Коэффициент готовности ЭВМ: " + KoefGot.ToString();

            label18.Text = "Коэффициент загрузки ЭВМ: " + KoefZag.ToString();

            label19.Text = "Показатель эффективности: " + PokazEff.ToString();

        }

 

        double VeibulZakon(double x, double c, double beta)

        {

            if (x > c)

                return beta * Math.Pow(x - c, beta - 1) * Math.Exp(-Math.Pow(x - c, beta));

            else

                return 0;

        }

 

        private void button1_Click_1(object sender, EventArgs e)

        {

            Generators gens = new Generators();

            gens.Show();

        }

    }

}

 

 

 


Информация о работе Модель системы обработки информации