Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая / ПОЯСНИТЕЛЬНАЯ.docx
Скачиваний:
2
Добавлен:
15.08.2023
Размер:
142.77 Кб
Скачать

Федеральное агентство связи

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ

УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«Санкт-петербургский государственный университет телекоммуникаций им. Проф. М.А. Бонч-бруевича»

(СПбГУТ)

ФАКУЛЬТЕТ ИНФОКОММУНИКАЦИОННЫХ СЕТЕЙ И СИСТЕМ (ИКСС)

КАФЕДРА ПРОГРАММНОЙ ИНЖЕНЕРИИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ (ПИиВТ)

Дисциплина: «Программирование»

Курсовая работа

Тема: «Решение задач машинного анализа электрических цепей»

Вариант 13 (А-36, Б-6)

Выполнил: Студент 1 курса,

группы ИКПИ-92 Козлов Никита

Принял: Доцент, к.т.н.

Воронцова Ирина Олеговна

2020

Введение

Курсовая работа посвящена решению задач машинного анализа электрических цепей.

Электрическая цепь задается передаточной характеристикой, которая описывает зависимость напряжения на выходе цепи 𝑈вых (выходного сигнала) от напряжения на входе 𝑈вх (входного сигнала). Напряжение на входе цепи Uвх(𝑡) и передаточная характеристика могут задаваться либо в виде формул, т.е. аналитически, либо графически. Конкретный вид формул и графиков определяются кодами варианта. Код варианта выдает преподаватель.

Результатом курсовой работы являются программа на языке С++/С с пояснительной запиской. Для заданного варианта электрической цепи и входного сигнала программа должна позволять:

А) рассчитать значения входного сигнала,

Б) рассчитать значения выходного сигнала,

В) рассчитать с заданной точностью значение характеристики 𝑊 выходного сигнала.

Цель работы: получение навыков в разработке программ на языке С++, а также анализ и решение поставленной задачи и обоснование выбранных методов реализации программы.

Contents

Описание работы

Вариант задач А и Б — 36 и 6

Код А

Код Б

Передаточная характеристика

Рабочий набор

a1 = 0,5;

b1 = 10В;

a2 = 2,5;

b2 = 10В;

a3 = 0,5;

b3 = 60В;

Uвх1 = 10В;

Uвх2 = 30В;

Код В

Характеристика

Рабочий набор

Длина импульса сигнала

Контрольные расчеты и графики:

Набор контрольных значений

Вычисления на ЭВМ

tнач

tкон

N

i

Uвх

Uвых

t

i

Uвх

Uвых

t

10

80

61

1

0

10

10

1

0.000

10.000

10

2

0

10

11.16666666666

2

0.000

10.000

11.16666666666

3

0

10

12.33333333333

3

0.000

10.000

12.33333333333

4

0

10

13.5

4

0.000

10.000

13.5

5

0

10

14.66666666666

5

0.000

10.000

14.66666666666

6

0

10

15.83333333333

6

0.000

10.000

15.83333333333

7

0

10

17.0

7

0.000

10.000

17.0

8

0

10

18.16666666666

8

0.000

10.000

18.16666666666

9

0

10

19.33333333333

9

0.000

10.000

19.33333333333

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

Исходный файл “CourseWork.cpp”

#include "Functions.h"

extern "C++"

{

}

int main(void)

{

vector<float> t, Uvx, Uvix; // vector of time, U_inner, U_outer

t.resize(N); Uvx.resize(N); Uvix.resize(N);

float tn = 10, tk = 80, af; // start and final point for time

double dt;

int16 n; // int_least16_t was defined as int16 at Function.h file

int_least8_t counter = 0;

int choose = 0;

Title();

while (true)

{

cout << "========================================================MENU============================================================" << endl;

cout << "1. Solve for N" << endl;

cout << "2. Solution with a given precision" << endl;

cout << "3. Write to file" << endl;

cout << "4. Build graph" << endl;

cin >> choose;

switch (choose)

{

case 1:

cout << "Enter the desired number of points: ";

cin >> n;

dt = (tk - tn) / (n - 1);

AppendToTime(n, dt, tn, t);

U_in(n, t, Uvx);

U_out(n, Uvx, Uvix);

PrintTable(n, t, Uvx, Uvix);

break;

case 2:

cout << "parametr for Uvx" << endl;

findParam(t, Uvx, Uvix, dt, tn);

cout << "Parametr for Uvix" << endl;

findParam2(t, Uvx, Uvix, dt, tn);

break;

case 3:

VectorToFile(t, "TimeArray.txt", n);

VectorToFile(Uvx, "Uvx_Array.txt", n);

VectorToFile(Uvix, "Uvix_Array.txt", n);

counter += 1;

break;

case 4:

if (counter >= 1)

{

BuildGraph();

}

else

{

cout << "You need to write values into file first" << endl;

}

}

cout << "Want to continue your work?" << endl;

cout << "0.No" << endl << "1.Yes" << endl;

cin >> choose;

switch (choose)

{

case 0:

cout << "Bue!" << endl;

return 0;

break;

case 1:

choose = 0;

continue;

}

}

}

Файл “Functions.cpp”

#include "Functions.h"

#pragma region lists and table

void AppendToTime(int16 n, double dt, float tn, vector<float>& t)

{

// Formation of an array of time

t.resize(n);

for (int i = 0; i < n; i++)

{

t[i] = tn + (i - 1) * dt;

}

}

void U_in(int16 n, vector<float>& t, vector<float>& Uvx)

{

// Formation of the input voltage array

constexpr float t1 = 20, t2 = 60, t3 = 70, tk = 80, U = 50;

for (int i = 0; i < n; i++)

{

if (t[i] <= t1)

{

Uvx[i] = 0;

}

else if (t[i] <= t2)

{

Uvx[i] = ((t[i] - t1) * (U - 0)) / (t2 - t1) + 0;

}

else if (t[i] <= t3)

{

Uvx[i] = U;

}

else

{

//Uvx[i] = ((Uvx[i] - t3) * (U - 0))/(t3 - tk) + U;

Uvx[i] = ((t[i] - t3) * (U - 0)) / (t3 - tk) + U;

}

}

}

void U_out(int16 n, vector<float>& Uvx, vector<float>& Uvix)

{

// forming an array of output voltage

constexpr float a1 = 0.5, b1 = 10, a2 = 2.5, b2 = 10, a3 = 0.5, b3 = 60, Uvx1 = 10, Uvx2 = 30;

for (int i = 0; i < n; i++)

{

if (Uvx[i] < Uvx1)

{

Uvix[i] = a1 * Uvx[i] + b1;

}

else if (Uvx[i] > Uvx1 && Uvx[i] < Uvx2)

{

Uvix[i] = a2 * Uvx[i] + b2;

}

else

Uvix[i] = a3 * Uvx[i] + b3;

}

}

void PrintTable(int16 n, vector<float>& t, vector<float>& Uvx, vector<float>& Uvix)

{

//Print results in table

cout << "# t Uvx Uvix" << endl;

for (int i = 1; i < n; i++)

{

printf("%d %6.3f %6.3f %6.3f\n", i, t[i], Uvx[i], Uvix[i]);

}

}

void Title(void)

{

// Shows title from file on the screen

ifstream file("Zast.txt");

if (file.is_open())

{

file.seekg(3, ios::beg);

string reader;

while (!file.eof())

{

while (getline(file, reader))

{

cout << reader;

}

file.close();

}

cout << "\n\n";

}

else

{

fprintf(stderr, "[ERROR] file doesn't exist or corrupted\n\n");

}

}

void VectorToFile(vector<float> vector_file, string name, int n)

{

// Write vector values to file function

ofstream file(name);

if (file.is_open())

{

for (int i = 1; i < n; i++)

{

file << vector_file[i] << endl;

}

cout << "[INFO] File " << name << " " << "write successfully" << endl;

file.close();

}

else

{

fprintf(stderr, "[ERROR] file wasn't created\n");

}

}

#pragma endregion

#pragma region Parametr

void findParam(vector<float>& t, vector<float>& Uvx, vector<float>& Uvix, double dt, float tn)

{

int N1 = 61;

AppendToTime(N1, dt, tn, t);

U_in(N1, t, Uvx);

U_out(N1, Uvx, Uvix);

double dUimp = 1000, eps = 0.01, prev = ImpulseDuration(Uvx, dt, N1);

double delta = 0;

while (dUimp > eps && N1 < N)

{

N1 *= 2;

dt = (80 - 10) / (N1 - 1.0);

AppendToTime(N1, dt, tn, t);

Uvx.resize(N1);

U_in(N1, t, Uvx);

Uvix.resize(N1);

U_out(N1, Uvx, Uvix);

delta = ImpulseDuration(Uvx, dt, N1);

dUimp = fabs(prev - delta) / (prev);

prev = delta;

cout << "Parametr = " << delta << "|" << "accuracy = " << dUimp << "|" << "points =" << N1 << endl;

}

if (N1 > N)

{

cout << "Target accuracy was not achieved" << endl;

}

else

{

cout << "Target accuracy was achived with n = " << N1 << " " << "accuracy is: " << dUimp << endl;

cout << "Impulse duration is: " << delta << endl;

}

}

void findParam2(vector<float>& t, vector<float>& Uvx, vector<float>& Uvix, double dt, float tn)

{

int N1 = 61;

AppendToTime(N1, dt, tn, t);

U_in(N1, t, Uvx);

U_out(N1, Uvx, Uvix);

double dUimp = 1000, eps = 0.01, prev = ImpulseDuration(Uvx, dt, N1);

double delta = 0;

while (dUimp > eps && N1 < N)

{

N1 *= 2;

dt = (80 - 10) / (N1 - 1.0);

AppendToTime(N1, dt, tn, t);

Uvx.resize(N1);

U_in(N1, t, Uvx);

Uvix.resize(N1);

U_out(N1, Uvx, Uvix);

delta = ImpulseDuration(Uvix, dt, N1);

dUimp = fabs(prev - delta) / (prev);

prev = delta;

cout << "Parametr = " << delta << "|" << "accuracy = " << dUimp << "|" << "points =" << N1 << endl;

}

if (N1 > N)

{

cout << "Target accuracy was not achieved" << endl;

}

else

{

cout << "Target accuracy was achived with n = " << N1 << " " << "accuracy is: " << dUimp << endl;

cout << "Impulse duration is: " << delta << endl;

}

}

double ImpulseDuration(vector<float> signal, double dt, int16 n)

{

double Umax = 0, Umin = 99999, Uimp;

double delta = 0;

for (int i = 1; i < n; i++)

{

if (signal[i] > Umax)

{

Umax = signal[i];

}

}

for (int i = 1; i < n; i++)

{

if (signal[i] < Umin)

{

Umin = signal[i];

}

}

Uimp = Umin + 0.5 * (Umax - Umin);

if (Umin == 0)

{

delta = 0;

for (int i = 0; i < n; i++)

if (signal[i] >= 0.5 * Umax)

delta += dt;

}

else

{

delta = 0;

for (int i = 0; i < n; i++)

if (signal[i] >= Uimp)

delta += dt;

}

return delta;

}

#pragma endregion

void BuildGraph()

{

system("C:\\maxima-5.43.2\\wxMaxima\\wxmaxima.exe graph.wxmx");

}

Файл “Functions.h”

#include <iostream>

#include <math.h>

#include <stdio.h>

#include <vector>

#include <string>

#include <fstream>

#include <windows.h>

#pragma once

#include "Functions.h"

#define _USE_MATH_DEFINES // for math.h functions

#define N 20000

#define int16 int_least16_t

using namespace std;

void AppendToTime(int16 n, double dt, float tn, vector<float>& t); // Declaration array of time

void U_in(int16 n, vector<float>& t, vector<float>& Uvx); // Declaration array of input voltage

void U_out(int16 n, vector<float>& Uvx, vector<float>& Uvix); // Declaration array of output voltage

void PrintTable(int16 n, vector<float>& t, vector<float>& Uvx, vector<float>& Uvix); //Declaration tableprint function

void Title(void); //Declaration function to print title on the screen

void VectorToFile(vector<float> vector_file, string name, int n); //Declaration function to write vector values to file

void findParam2(vector<float>& t, vector<float>& Uvx, vector<float>& Uvix, double dt, float tn);

void findParam(vector<float>& t, vector<float>& Uvx, vector<float>& Uvix, double dt, float tn);

double ImpulseDuration(vector<float> signal, double dt, int16 n);

void BuildGraph(); //Build a graph with wxMaxima by written files

Примеры записанных данных в файл

Файл “TimeArray.txt”

10

11.1667

12.3333

13.5

14.6667

15.8333

17

18.1667

19.3333

20.5

21.6667

22.8333

24

25.1667

26.3333

27.5

28.6667

29.8333

31

32.1667

33.3333

34.5

35.6667

36.8333

38

39.1667

40.3333

41.5

42.6667

43.8333

45

46.1667

47.3333

48.5

49.6667

50.8333

52

53.1667

54.3333

55.5

56.6667

57.8333

59

60.1667

61.3333

62.5

63.6667

64.8333

66

67.1667

68.3333

69.5

70.6667

71.8333

73

74.1667

75.3333

76.5

77.6667

78.8333

Файл “Uvx_Array.txt”

0

0

0

0

0

0

0

0

0

0.625

2.08333

3.54166

5

6.45833

7.91667

9.375

10.8333

12.2917

13.75

15.2083

16.6667

18.125

19.5833

21.0417

22.5

23.9583

25.4167

26.875

28.3333

29.7917

31.25

32.7083

34.1667

35.625

37.0833

38.5417

40

41.4583

42.9167

44.375

45.8333

47.2917

48.75

50

50

50

50

50

50

50

50

50

46.6667

40.8334

35

29.1667

23.3334

17.5

11.6667

5.83336

Файл “Uvix_Array.txt”

10

10

10

10

10

10

10

10

10

10.3125

11.0417

11.7708

12.5

13.2292

13.9583

14.6875

37.0833

40.7292

44.375

48.0208

51.6667

55.3125

58.9583

62.6042

66.25

69.8958

73.5417

77.1875

80.8333

84.4792

75.625

76.3542

77.0833

77.8125

78.5417

79.2708

80

80.7292

81.4583

82.1875

82.9167

83.6458

84.375

85

85

85

85

85

85

85

85

85

83.3333

80.4167

77.5

82.9167

68.3334

53.75

39.1667

12.9167

Примеры построения графика по записанным файлам с помощью wxMaxima

Соседние файлы в папке Курсовая