Анализ сигнала на выходе электрической цепи. Курсовая работа. Радионов Н.В (2). Курсовая работа Анализ сигнала на выходе электрической цепи Передаточная характеристика 7 вариант Входной сигнал 3
![]()
|
Санкт-Петербургский государственный университет телекоммуникаций им. проф. М.А. Бонч-Бруевича Факультет инфокоммуникационных сетей и систем Курсовая работа Анализ сигнала на выходе электрической цепи Передаточная характеристика – 7 вариант Входной сигнал – 3 вариант Преподаватель: Новоженин А.В. Выполнил: студент группы ИКПИ-93 Радионов Никита Санкт-Петербург 2020 г. ОглавлениеПостановка задачи 3 Требования к работе 4 Организация работы программы 5 Организация программы, модуль “main.c” 5 Таблица идентификаторов 6 Функции модуля “functions.c” 8 Функция form_array_time 8 Функция form_array_U_input 9 Функция form_array_U_output 10 Функция min_value_index 11 Функция write_data 12 Функция text_menu 13 Функция welcome 14 Функция output_table 15 Функция parametr 16 Функция main 17 Приложение 1 18 Листинг модуля “main.c” 18 Листинг модуля “functions.c” 20 Тест программы 25 Тест 1 25 Расчёт параметра с заданной точностью: 26 Результат: 26 Тест 2 27 Расчёт параметра с заданной точностью: 28 Результат: 28 Заключение 29 Постановка задачиНеобходимо написать программу на ЭВМ, рассчитывающую значения входного и выходного сигналов с течением времени. Дополнительно необходимо высчитать время, при котором входное напряжение достигнет минимального значения с заданной точностью. ![]() Входной сигнал описан аналитически: ![]() Рабочий набор: U = 2B; a = 3; tнач = Пс; Tкон = 2Пс Передаточная характеристика описана аналитически: ![]() a = 5B; b = 0.05(1/B); Uвх1 = 10В Требования к работеТребования к коду курсовой работы следующие: Программа должна иметь модульное строение; Программа должна выводить значения в форме таблицы с заголовком вида:
Ввод входных данных должен быть организован с клавиатуры. Расчет временных характеристик. В данной работе рассчитываются импульсы входного и выходного сигналов электрической цепи; Запись результатов вычислений (в виде таблицы), входные данные и временные характеристики в файл, с установленным названием(“array_time.txt”, “array_input.txt”, “array_output.txt”). Чтение результатов предыдущих вычислений из файла; Построение графиков входного и выходного сигналов по результатам вычислений. Расчет значения параметра с заданной точностью. Организация работы программыОрганизация программы, модуль “main.c”Программа будет выполнять две задачи: Чтение данных с клавиатуры, расчеты. Поэтому программа состоит из трёх файлов: main.c – файл, который хранит в себе главную, исполнительную функцию; functions.c – файл, который хранит в себе все необходимые функции; headears.h – заголовочный файл, который описывает функции; Программа начинается с блока описания переменных, массивов и файлов, затем выводится приветственное сообщение, взятое из файла “welcome.txt”. Далее на экран выводится меню, с помощью вызова функции text_menu. Меню организовано с помощью команды switch. До тех пор, пока не будет введено значение «0» в ответ на запрос в главном меню. После работы с каждым пунктом, пользователю снова будет доступно главное меню, где он сможет дальше пользоваться программой. Главное меню состоит из 5-ти пунктов: Контрольный расчет для n точек и вывод результата на экран – пользователю предлагается ввести количество точек для расчёта. После ввода n, программа запускает функции: form_array_time, form_array_U_input, form_array_U_output. Результатом работы данных функций является заполнение соответствующих массивом. Следом выполняется функция output_table, которая выводит на экран результат работы предыдущих функций, оформленный в виде вышеописанной таблицы. Расчет параметра с заданной точностью – этот пункт рассчитывает момент времени, когда входное напряжение достигнет минимального значения. пользователю предлагается ввести точность. Следом запускается функция parametr, которая рассчитывает значение параметра и выводит на экран результат своей работы. Результатом работы вышеупомянутой функции является таблица с пошаговыми вычислениями, с которыми пользователь может ознакомиться. Построение графика входного напряжения – после того, как пользователь перешел в этот пункт меню, будет произведена запись в файл “array_input.txt” данных из массива array_U_input посредством работы функции write_data. Затем, на основе данных из файла “array_input.txt”, будет вызвана функция system, которая запустит скрип graf_input.plt. В результате пользователь увидит график входного напряжения. Построение графика выходного напряжения – после того, как пользователь перешел в этот пункт меню, будет произведена запись в файл “array_output.txt” данных из массива array_U_output посредством работы функции write_data. Затем, на основе данных из файла “array_output.txt”, будет вызвана функция system, которая запустит скрип graf_output.plt. В результате пользователь увидит график выходного напряжения. Выход – при выборе этого пункта меню программа завершает свою работу. Исходный код модуля main.c можно увидеть в приложении к курсовой работе. Таблица идентификаторов
Функции модуля “functions.c”Функция_form___array___time'>form_array_timeНазначение функции: Формирование массива времени. Исходные данные: tn(начальное время) = Пс, tk(конечное время) = 2Пс Блок-схема: ![]() Разработка интерфейса: Название form_array_time означает «формирование массива времени». Алгоритм функции: Высчитывает dt, после чего n раз высчитывает время и записывает в массив array_time Функция form_array_U_inputНазначение функции: Формирование массива входного напряжения. Исходные данные: u = 2, a = 3 Блок-схема: ![]() Разработка интерфейса: Название form_array_U_input означает «формирование массива входного напряжения». Алгоритм функции: Высчитывает n раз значение входного напряжения и записывает в массив array_U_input. Функция form_array_U_outputНазначение функции: Формирование массива выходного напряжения. Исходные данные: a = 5, b = 0.05, uv1 = 10 Блок-схема: ![]() Разработка интерфейса: Название form_array_U_input означает «формирование массива выходного напряжения». Алгоритм функции: Высчитывает n раз значение выходного напряжения в зависимости от значения входного и записывает в массив array_U_output. Функция min_value_indexНазначение функции: Поиск индекса массива, значение по которому является минимальным. Исходные данные: n, array_time[], array_U_input[] Блок-схема: ![]() Разработка интерфейса: Название min_value_index означает «Индекс минимального значения». Алгоритм функции: Функция n раз сравнивает текущее значение с предыдущим и при необходимости перезаписывает счетчик. Функция write_dataНазначение функции: Запись данных в файл. Исходные данные: n, array_time[], array_U_input[], array_U_output[] Блок-схема: ![]() Разработка интерфейса: Название write_data означает «Запись данных». Алгоритм функции: Функция n раз записывает в каждый из файлов значения из массивов array_time, array_U_input, array_U_output. Функция text_menuНазначение функции: Выводит на экран меню выбора для пользователя. Разработка интерфейса: Название text_menu означает «Текст меню». Блок-схема: ![]() Алгоритм функции: Функция выводит текст меню на экран. Функция welcomeНазначение функции: Выводит на экран информацию о работе и студенте. Исходные данные: Название файла – “welcome.txt”. Блок-схема: ![]() Разработка интерфейса: Название welcome означает «Приветствие». Алгоритм функции: Пока не встретится конец файла, считывает символ и выводит его на экран. Функция output_tableНазначение функции: Выводит данные в виде таблицы Исходные данные: n, array_time[], array_U_input[], array_U_output[] Блок-схема: ![]() Разработка интерфейса: Название output_table означает «Вывод таблицы». Алгоритм функции: Функция выводит шапку таблицы, а затем n раз данные. Функция parametrНазначение функции: Расчёт параметра с заданной точностью. Исходные данные: p = 1, eps, par = 30, par1, temp_index, n, array_time[], array_U_input[], array_U_output[] Блок-схема: ![]() Разработка интерфейса: Название parametr означает «Параметр». Алгоритм функции: Функция позволяют ввести значение eps(точность), на основе чего следом выполняются вычисления, пока условие будет верным. Функция mainНазначение функции: Главная функция Блок-схема: ![]() Приложение 1Листинг_модуля_“'>Листинг модуля “main.c”#include "functions.h" #include "headers.h" #include "functio" #include “math.h” #include #include #define _USE_MATH_DEFINES #define N 10000 int main() { system("cls"); welcome(); int n; int temp_index; // double temp; double array_time[N]; double array_U_input[N]; double array_U_output[N]; // MENU int choice = -1; while(choice != 0) { text_menu(); printf("Поле для ввода: "); scanf("%d", &choice); system("cls"); switch(choice) { case 1: // Расчет контрольных точек // Ввод колличества точек printf("Input n: "); scanf("%d", &n); // Формирование массивов значений form_array_time(n, array_time); form_array_U_input(n, array_time, array_U_input); form_array_U_output(n, array_U_input, array_U_output); // Вывод результат на экран output_table(n, array_time, array_U_input, array_U_output); system("Pause"); break; case 2: // Расчет параметра temp_index = min_value_index(n, array_time, array_U_input); parametr(n, array_time, array_U_input, array_U_output); system("Pause"); system("cls"); break; case 3: // Построение графика входного напряжения write_data(n, array_time, array_U_input, array_U_output); system("gnuplot -persist graf_input"); break; case 4: // Построение графика выходного напряжения write_data(n, array_time, array_U_input, array_U_output); system("gnuplot -persist graf_output"); break; case 0: // Завершение работы printf("Завершение работы"); break; default: printf("Неверное значение, попробуйте снова!\n"); break; } } return 0; } Листингмодуля “functions.c”void form_array_time(int n, double array_time[]) { double dt; double tn = M_PI, tk = 2 * M_PI; dt = (tk - tn) / (n - 1); for(int i = 0; i < n; i++) { array_time[i] = tn + i * dt; } } void form_array_U_input(int n, double array_time[], double array_U_input[]) { double temp; // Временная переменная double u = 2.0; double a = 3.0; for(int i = 0; i < n; i++) { temp = u * exp(a * sin(array_time[i])); array_U_input[i] = temp; } } void form_array_U_output(int n, double array_U_input[], double array_U_output[]) { double temp; int a = 5; double b = 0.05; int uv1 = 10; for(int i = 0; i < n; i++) { if(array_U_input[i] <= uv1) { array_U_output[i] = a; } else { array_U_output[i] = b * pow(array_U_input[i], 2); } } } int min_value_index(int n, double array_time[], double array_U_input[]) { double temp = array_U_input[0]; int temp_index = 0; for(int i = 0; i < n; ++i) { if(array_U_input[i] < temp) { temp = array_U_input[i]; temp_index = i; } } return temp_index; } void write_data(int n, double array_time[], double array_U_input[], double array_U_output[]) { FILE *f1,*f2,*f3; f1=fopen("array_time.txt","w"); f2=fopen("array_input.txt", "w"); f3=fopen("array_output.txt", "w"); for(int i = 0; i < n; i++) { fprintf(f1,"%6.3lf\n", array_time[i]); fprintf(f2,"%6.3lf %6.3lf\n",array_time[i], array_U_input[i]); fprintf(f3,"%6.3lf %6.3lf\n",array_time[i], array_U_output[i]); } fclose(f1); fclose(f2); fclose(f3); } void text_menu() { printf("============================Меню выбора=================\n"); printf("|Введите 1, если необходимо получить контрольный расчет для n точек |\n"); printf("|Введите 2, если необходимо получить расчет параметра с заданной точностью |\n"); printf("|Введите 3, если необходимо построить график входного напряжения |\n"); printf("|Введите 4, если необходимо построить график выходного напряжения |\n"); printf("|Введите 0, чтобы завершить работу |\n"); printf("=============================================================\n"); } void output_table(int n, double array_time[], double array_U_input[], double array_U_output[]) { printf("N Time Uin Uout\n"); printf("______________________________\n"); for(int i = 0; i < n; i++) { printf("%d\t%6.3lf\t%6.3lf\t%6.3lf\n", i + 1, array_time[i], array_U_input[i], array_U_output[i]); } } double parametr(int n, double array_time[], double array_U_input[], double array_U_output[]) { double p = 1; // текущая погрешность double eps; double par = 30; double par1; int temp_index; printf("Введите заданную точность: "); scanf("%lf", &eps); // Создание локальных переменных int n_local = n; double array_time_local[N]; double array_U_input_local[N]; double array_U_output_local[N]; // Копирования исходных массив во временные для предотвращение потери данных for(int i = 0; i < n; i++) { array_time_local[i] = array_time[i]; array_U_input_local[i] = array_U_input[i]; array_U_output_local[i] = array_U_output[i]; } // Расчет параметра по заданной точности while(p > eps) { form_array_time(n_local, array_time_local); form_array_U_input(n_local, array_time_local, array_U_input_local); temp_index = min_value_index(n_local, array_time_local, array_U_input_local); par1 = array_time_local[temp_index]; p = fabs(par - par1) / par1; printf("n = %d\tparametr = %lf\tpogrechnost = %lf\n", n_local, par1, p); par = par1; n_local *= 2; } printf("...............................................................\n"); printf("%6.6lfс - Время при котором будет достигнуто " "минимальное входное напряжение\n", par1); printf("...............................................................\n"); } void welcome() { FILE *f = fopen("welcome.txt","r"); // Открытие файла для чтения char ch; while (!feof(f)) // Считывание данных из файла до тех пор, { fscanf(f,"%c",&ch); // пока не найдено значение конца файла printf("%c",ch); } fclose(f); printf("\n"); // Закрытие файла } Тест программыДля проверки программы используем тесты с разным количеством n. Тест 1n = 10 n Time Uin Uout 1 3.142 2.000 5.000 2 3.491 0.717 5.000 3 3.840 0.291 5.000 4 4.189 0.149 5.000 5 4.538 0.104 5.000 6 4.887 0.104 5.000 7 5.236 0.149 5.000 8 5.585 0.291 5.000 9 5.934 0.717 5.000 10 6.283 2.000 5.000 Графики: Входной сигнал: ![]() Выходной сигнал: ![]() Расчёт параметра с заданной точностью:Погрешность = 0.001 4.709931с - Время при котором будет достигнуто минимальное входное напряжение Результат:Выходное напряжение остаётся неизменным на всём промежутке данного времени. Тест 2n = 15 n Time Uin Uout 1 3.142 2.000 5.000 2 3.366 1.026 5.000 3 3.590 0.544 5.000 4 3.815 0.308 5.000 5 4.039 0.192 5.000 6 4.264 0.134 5.000 7 4.488 0.107 5.000 8 4.712 0.100 5.000 9 4.937 0.107 5.000 10 5.161 0.134 5.000 11 5.386 0.192 5.000 12 5.610 0.308 5.000 13 5.834 0.544 5.000 14 6.059 1.026 5.000 15 6.283 2.000 5.000 Графики: Входной сигнал: ![]() Выходной сигнал: ![]() Расчёт параметра с заданной точностью:Погрешность = 0.001 4.709110с - Время при котором будет достигнуто минимальное входное напряжение Результат:Выходное напряжение остаётся неизменным на всём промежутке данного времени. ЗаключениеВ процессе тестирования не было обнаружено ошибок. Результаты ручных и машинных вычислений совпадают, что свидетельствует о том, что программа составлена правильно. |