
Федеральное агентство связи
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ
УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«Санкт-петербургский государственный университет телекоммуникаций им. Проф. М.А. Бонч-бруевича»
(СПбГУТ)
ФАКУЛЬТЕТ ИНФОКОММУНИКАЦИОННЫХ СЕТЕЙ И СИСТЕМ (ИКСС)
КАФЕДРА ПРОГРАММНОЙ ИНЖЕНЕРИИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ (ПИиВТ)
Дисциплина: «Программирование»
Курсовая работа
Тема: «Решение задач машинного анализа электрических цепей»
Вариант 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