Главная страница
Навигация по странице:

  • Контрольный расчет для

  • Расчет параметра с заданной точностью

  • Построение графика входного напряжения

  • Построение графика выходного напряжения

  • Функция form _ array _ time

  • Функция form_array_U_input

  • Функция form _ array _ U _ output

  • Функция min _ value _ index

  • Функция write _ data

  • Функция text _ menu

  • Функция output _ table

  • Листинг модуля “

  • Листинг

  • Анализ сигнала на выходе электрической цепи. Курсовая работа. Радионов Н.В (2). Курсовая работа Анализ сигнала на выходе электрической цепи Передаточная характеристика 7 вариант Входной сигнал 3


    Скачать 366.33 Kb.
    НазваниеКурсовая работа Анализ сигнала на выходе электрической цепи Передаточная характеристика 7 вариант Входной сигнал 3
    АнкорАнализ сигнала на выходе электрической цепи
    Дата30.01.2022
    Размер366.33 Kb.
    Формат файлаdocx
    Имя файлаКурсовая работа. Радионов Н.В (2).docx
    ТипКурсовая
    #346500

    Санкт-Петербургский государственный университет телекоммуникаций

    им. проф. М.А. Бонч-Бруевича

    Факультет инфокоммуникационных сетей и систем

    Курсовая работа
    Анализ сигнала на выходе электрической цепи

    Передаточная характеристика – 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В


    Требования к работе


    Требования к коду курсовой работы следующие:

    1. Программа должна иметь модульное строение;

    2. Программа должна выводить значения в форме таблицы с заголовком вида:

    N

    Time

    Uin

    Uout















    1. Ввод входных данных должен быть организован с клавиатуры.

    2. Расчет временных характеристик. В данной работе рассчитываются импульсы входного и выходного сигналов электрической цепи;

    3. Запись результатов вычислений (в виде таблицы), входные данные и временные характеристики в файл, с установленным названием(“array_time.txt”, “array_input.txt”, “array_output.txt”).

    4. Чтение результатов предыдущих вычислений из файла;

    5. Построение графиков входного и выходного сигналов по результатам вычислений.

    6. Расчет значения параметра с заданной точностью.


    Организация работы программы

    Организация программы, модуль “main.c


    Программа будет выполнять две задачи: Чтение данных с клавиатуры, расчеты. Поэтому программа состоит из трёх файлов:

    1. main.c – файл, который хранит в себе главную, исполнительную функцию;

    2. functions.c – файл, который хранит в себе все необходимые функции;

    3. headears.h – заголовочный файл, который описывает функции;

    Программа начинается с блока описания переменных, массивов и файлов, затем выводится приветственное сообщение, взятое из файла “welcome.txt”. Далее на экран выводится меню, с помощью вызова функции text_menu. Меню организовано с помощью команды switch. До тех пор, пока не будет введено значение «0» в ответ на запрос в главном меню. После работы с каждым пунктом, пользователю снова будет доступно главное меню, где он сможет дальше пользоваться программой.

    Главное меню состоит из 5-ти пунктов:

    1. Контрольный расчет для n точек и вывод результата на экран – пользователю предлагается ввести количество точек для расчёта. После ввода n, программа запускает функции: form_array_time, form_array_U_input, form_array_U_output. Результатом работы данных функций является заполнение соответствующих массивом. Следом выполняется функция output_table, которая выводит на экран результат работы предыдущих функций, оформленный в виде вышеописанной таблицы.

    2. Расчет параметра с заданной точностью – этот пункт рассчитывает момент времени, когда входное напряжение достигнет минимального значения. пользователю предлагается ввести точность. Следом запускается функция parametr, которая рассчитывает значение параметра и выводит на экран результат своей работы. Результатом работы вышеупомянутой функции является таблица с пошаговыми вычислениями, с которыми пользователь может ознакомиться.

    3. Построение графика входного напряжения – после того, как пользователь перешел в этот пункт меню, будет произведена запись в файл “array_input.txt” данных из массива array_U_input посредством работы функции write_data. Затем, на основе данных из файла “array_input.txt”, будет вызвана функция system, которая запустит скрип graf_input.plt. В результате пользователь увидит график входного напряжения.

    4. Построение графика выходного напряжения – после того, как пользователь перешел в этот пункт меню, будет произведена запись в файл “array_output.txt” данных из массива array_U_output посредством работы функции write_data. Затем, на основе данных из файла “array_output.txt”, будет вызвана функция system, которая запустит скрип graf_output.plt. В результате пользователь увидит график выходного напряжения.

    1. Выход – при выборе этого пункта меню программа завершает свою работу.

    Исходный код модуля main.c можно увидеть в приложении к курсовой работе.

    Таблица идентификаторов


    Название переменной

    Тип

    В функции

    Начальное значение

    Назначение

    n

    int



    main

    -

    Количество измерений сигнала

    temp_index

    int

    -

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

    choice

    int

    -

    Используется в switch-е

    N

    int

    1000

    #define, как максимально возможное n, для выделения памяти под массивы.

    array_U_input[N]; array_U_output[N];

    array_time[N];

    double

    -

    Массивы входного, выходного сигналов и времени.

    dt

    double


    form_array_time

    -

    Шаг изменения времени

    tn

    double

    П

    Начальное время

    tk

    double



    Конечное время

    temp

    double


    (в нескольких)

    -

    Временная переменная

    i

    int

    -

    Для счетчика

    u

    double


    form_array_U_input

    2.0

    Установленное значение

    a

    double

    3.0

    Установленное значение

    uv1

    int



    form_array_U_output

    10

    Установленное значение

    b

    double

    0.05

    Установленное значение

    a

    int

    5

    Установленное значение

    *f1,*f2,*f3

    FILE

    write_data

    -

    Файловая переменная.

    p

    double


    parametr

    -

    Контроль точности

    eps

    double




    Заданная точность

    par

    double

    30

    Начальное значение параметра

    par1

    double

    -

    Измененное значение параметра

    n_local

    int

    -

    Локальные переменные, созданные для предотвращения потери данных

    array_time_local[]

    double

    -

    array_U_input_local[]

    double

    -

    array_U_output_local[]

    double

    -


    Функции модуля “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.

    Тест 1


    n = 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с - Время при котором будет достигнуто минимальное входное напряжение

    Результат:


    Выходное напряжение остаётся неизменным на всём промежутке данного времени.

    Тест 2


    n = 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с - Время при котором будет достигнуто минимальное входное напряжение

    Результат:


    Выходное напряжение остаётся неизменным на всём промежутке данного времени.

    Заключение


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


    написать администратору сайта