Скачиваний:
5
Добавлен:
28.04.2022
Размер:
194.96 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Государственное образовательное учреждение

высшего профессионального образования

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

«ЛЭТИ» им. В.И. Ульянова (Ленина)

ФАКУЛЬТЕТ ЭЛЕКТРОНИКИ (ФЭЛ)

КАФЕДРА Радиотехнической электроники

КУРСОВАЯ РАБОТА (ПРОЕКТ)

По дисциплине: ПРОГРАММНЫЕ СРЕДСТВА МОДЕЛИРОВАНИЯ ЭЛЕКТРОННОЙ КОМПОНЕНТНОЙ БАЗЫ

На тему: Разработка модуля программы анализа электронного прибора

(указывается обобщенная тема)

Вариант № 6

Выполнила

Оценка

студентка гр. №

5201

Проверил

Синев А. Е.

Захаренкова К. О.

(ФИО)

(ФИО)

Дата

САНКТ-ПЕТЕРБУРГ

2019

ЗАДАНИЕ на курсовую работу

По дисциплине: ПРОГРАММНЫЕ СРЕДСТВА МОДЕЛИРОВАНИЯ ЭЛЕКТРОННОЙ КОМПОНЕНТНОЙ БАЗЫ

Вариант № 6

Название курсовой работы:

Модуль дискретизации расчетной области для МКР.

Содержание работы:

Разработка алгоритма и программы на С++ для формирования информационного массива нерегулярных узлов для реальной расчетной области на основе данных из dxf-файла.

Исходные данные:

Описание расчётной области в виде dxf-файла, созданного с помощью AutoCAD.

Результаты работы:

1. Программа формирования информационного массива нерегулярных узлов. 2. Методика тестирования и отладки программы.

Литература:

1. Internet.

Теоретические сведения:

Метод конечных разностей (метод сеток) – численный метод решения дифференциальных уравнений, основанный на замене производных разностными схемами.

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

1. Код программы в C++:

#include <iostream>

#include <stdlib.h>

#include <conio.h>

#include <stdio.h>

#include <fstream>

#include <iomanip>

#include <cmath>

using namespace std;

int main()

{

setlocale(LC_ALL, "rus");

int i,j,o,count,o_max,max_i,max_j,g1,g2,g3,g4;

double h,m,r,h2,S1,S2;

cout<<"Введите шаг сетки h = ";

cin>>h;

cout<<endl<<"Введите размер сетки m = ";

cin>>m;

cout<<endl<<"Введите значение радиуса разбиваемой области r = ";

cin>>r;

g1=(2*m/h)+2;//количество узлов сетки

const unsigned int DIM1=g1;

double **X= new double*[DIM1];//координаты узлов х

for (int count=1; count<g1; count++)

X[count]=new double[DIM1];

double **Y= new double*[DIM1];//координаты узлов у

for (count=1; count<g1; count++)

Y[count]=new double[DIM1];

//Координаты узлов сетки

S1=m;

for (i=1; i<g1; i++)

{

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

{

Y[j][i]=S1;

X[i][j]=-S1;

S1=S1-h;

}

S1=m;

}

//Формирование окружности

h2=0.01;//шаг с которым вводятся координаты окружности

g2=2*r/h2+2;

const unsigned int DIM2=g2;

double **Xr= new double*[DIM2];//координаты х окр-ти

double **Y1rr= new double*[DIM2];//координаты у окр-ти

double **Y2rr= new double*[DIM2];

for (count=1; count<g2; count++)

{

Xr[count]=new double[DIM2];

Y1rr[count]=new double[DIM2];

Y2rr[count]=new double[DIM2];

}

S2=-r;

for (i=1; i<g2; i++)

{

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

{

Xr[i][j]=S2;//заполнение массива координат х окружности

S2=S2+h2;

Y1rr[i][j]=sqrt(r*r-Xr[i][j]*Xr[i][j]);//массив координат у окружности

Y2rr[i][j]=-sqrt(r*r-Xr[i][j]*Xr[i][j]);

}

S2=-r;

}

max_i=floor(m*2/h+2);

max_j=floor(m*2/h+2);

//Рассчет расстояний до узлов

double **rasst_do_uzlov= new double*[DIM1];//расстояния до узлов

for (count=1; count<g1; count++)

rasst_do_uzlov[count]=new double[DIM1];

for (i=1; i<max_i; i++)

{

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

rasst_do_uzlov[i][j]=sqrt(X[i][j]*X[i][j]+Y[i][j]*Y[i][j]);

}

//Подсчет количества нерегулярных узлов

g3=1;

for (i=1; i<max_i; i++)

{

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

{

if (rasst_do_uzlov[i][j]<r && (rasst_do_uzlov[i][j-1]>=r || rasst_do_uzlov[i][j+1]>=r || rasst_do_uzlov[i+1][j]>=r || rasst_do_uzlov[i-1][j]>=r))

g3=g3+1;

}

}

//Заполнение массива нерегулярных узлов

const unsigned int DIM3=g3;

double **coord_uzlov= new double*[DIM3];

double **irregular_nodes= new double*[DIM3];

for (count=1; count<g3; count++)

{

coord_uzlov[count]=new double[10];

irregular_nodes[count]=new double[10];

}

o=1;

count=1;

for (i=1; i<max_i; i++)

{

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

{

if (rasst_do_uzlov[i][j]<r && (rasst_do_uzlov[i][j-1]>=r || rasst_do_uzlov[i][j+1]>=r || rasst_do_uzlov[i+1][j]>=r || rasst_do_uzlov[i-1][j]>=r))

{

coord_uzlov[o][1]=X[i][j];

coord_uzlov[o][2]=Y[i][j];

irregular_nodes[o][1]=count;

irregular_nodes[o][2]=X[i][j];

irregular_nodes[o][3]=Y[i][j];

o=o+1;

}

count=count+1;

}

}

o_max=o;

g4=o;

const unsigned int DIM4=g4;

double **coord_toch_okr= new double*[DIM4];

double **h_mezhdu_uzlami= new double*[DIM4];

for (count=1; count<g4; count++)

{

coord_toch_okr[count]=new double[10];

h_mezhdu_uzlami[count]=new double[10];

}

for (o=1; o<(o_max); o++) //цикл для формирования массива с координатами точек на окружности, которым соответствуют нерегулярные узлы

{

coord_toch_okr[o][1]=sqrt(r*r-(coord_uzlov[o][2])*(coord_uzlov[o][2]));

coord_toch_okr[o][2]=sqrt(r*r-(coord_uzlov[o][1])*(coord_uzlov[o][1]));

}

for (o=1; o<(o_max);o++) //цикл для формирования массива с расстояниями от точек на окружности до узлов

{

h_mezhdu_uzlami[o][1]=abs(abs(coord_uzlov[o][1])-abs(coord_toch_okr[o][1]));

h_mezhdu_uzlami[o][2]=abs(abs(coord_uzlov[o][2])-abs(coord_toch_okr[o][2]));

}

for (o=1; o<(o_max);o++)

{

if (coord_uzlov[o][1]<0 && coord_uzlov[o][2]<0) //x<0;y<0

{

irregular_nodes[o][4]=h_mezhdu_uzlami[o][1];

irregular_nodes[o][5]=h_mezhdu_uzlami[o][2];

irregular_nodes[o][6]=h;

irregular_nodes[o][7]=h;

if (irregular_nodes[o][4]>h)

irregular_nodes[o][4]=h;

if (irregular_nodes[o][5]>h)

irregular_nodes[o][5]=h;

}

if (coord_uzlov[o][1]<0 && coord_uzlov[o][2]>0) //x<0;y>0

{

irregular_nodes[o][4]=h_mezhdu_uzlami[o][1];

irregular_nodes[o][5]=h;

irregular_nodes[o][6]=h;

irregular_nodes[o][7]=h_mezhdu_uzlami[o][2];

if (irregular_nodes[o][4]>h)

irregular_nodes[o][4]=h;

if (irregular_nodes[o][7]>h)

irregular_nodes[o][7]=h;

}

if (coord_uzlov[o][1]>0 && coord_uzlov[o][2]>0) //x>0;y>0

{

irregular_nodes[o][4]=h;

irregular_nodes[o][5]=h;

irregular_nodes[o][6]=h_mezhdu_uzlami[o][1];

irregular_nodes[o][7]=h_mezhdu_uzlami[o][2];

if (irregular_nodes[o][6]>h)

irregular_nodes[o][6]=h;

if (irregular_nodes[o][7]>h)

irregular_nodes[o][7]=h;

}

if (coord_uzlov[o][1]>0 && coord_uzlov[o][2]<0) //x>0;y<0

{

irregular_nodes[o][4]=h;

irregular_nodes[o][5]=h_mezhdu_uzlami[o][2];

irregular_nodes[o][6]=h_mezhdu_uzlami[o][1];

irregular_nodes[o][7]=h;

if (irregular_nodes[o][5]>h)

irregular_nodes[o][5]=h;

if (irregular_nodes[o][6]>h)

irregular_nodes[o][6]=h;

}

if (coord_uzlov[o][1]==0 && coord_uzlov[o][2]<0) //x=0;y<0

{

irregular_nodes[o][4]=h_mezhdu_uzlami[o][1];

irregular_nodes[o][5]=h_mezhdu_uzlami[o][2];

irregular_nodes[o][6]=h_mezhdu_uzlami[o][1];

irregular_nodes[o][7]=h;

if (irregular_nodes[o][4]>h)

irregular_nodes[o][4]=h;

if (irregular_nodes[o][5]>h)

irregular_nodes[o][5]=h;

if (irregular_nodes[o][6]>h)

irregular_nodes[o][6]=h;

}

if (coord_uzlov[o][1]<0 && coord_uzlov[o][2]==0) //x<0;y=0

{

irregular_nodes[o][4]=h_mezhdu_uzlami[o][1];

irregular_nodes[o][5]=h_mezhdu_uzlami[o][2];

irregular_nodes[o][6]=h;

irregular_nodes[o][7]=h_mezhdu_uzlami[o][2];

if (irregular_nodes[o][4]>h)

irregular_nodes[o][4]=h;

if (irregular_nodes[o][5]>h)

irregular_nodes[o][5]=h;

if (irregular_nodes[o][7]>h)

irregular_nodes[o][7]=h;

}

if (coord_uzlov[o][1]>0 && coord_uzlov[o][2]==0) //x>0;y=0

{

irregular_nodes[o][4]=h;

irregular_nodes[o][5]=h_mezhdu_uzlami[o][2];

irregular_nodes[o][6]=h_mezhdu_uzlami[o][1];

irregular_nodes[o][7]=h_mezhdu_uzlami[o][2];

if (irregular_nodes[o][5]>h)

irregular_nodes[o][5]=h;

if (irregular_nodes[o][6]>h)

irregular_nodes[o][6]=h;

if (irregular_nodes[o][7]>h)

irregular_nodes[o][7]=h;

}

if (coord_uzlov[o][1]==0 && coord_uzlov[o][2]>0) //x=0;y>0

{

irregular_nodes[o][4]=h_mezhdu_uzlami[o][1];

irregular_nodes[o][5]=h;

irregular_nodes[o][6]=h_mezhdu_uzlami[o][1];

irregular_nodes[o][7]=h_mezhdu_uzlami[o][2];

if (irregular_nodes[o][4]>h)

irregular_nodes[o][4]=h;

if (irregular_nodes[o][6]>h)

irregular_nodes[o][6]=h;

if (irregular_nodes[o][7]>h)

irregular_nodes[o][7]=h;

}

if (r<h)

{

irregular_nodes[o][4]=r;

irregular_nodes[o][5]=r;

irregular_nodes[o][6]=r;

irregular_nodes[o][7]=r;

}

}

cout<<endl<<"Массив нерегулярных узлов:"<<endl;

cout<<endl<<setw(10)<<"№"<<" "<<"Х"<<" "<<"У"<<" "<<"h слева"<<" "<<"h внизу"<<" "<<"h справа"<<" "<<"h вверху"<<endl;

for (i=1; i<g3; i++)

{

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

cout<<setw(10)<<irregular_nodes[i][j];

cout<<endl;

}

cout<<endl;

getch();

return 0;

}

2. Результат работы программы в С++:

Рисунок 1 – Массив нерегулярных узлов

Полученные координаты узлов были перенесены в программу Excel:

Рисунок 2 – Результат работы программы в Excel

Результат работы программы в MATLAB:

Рисунок 3 – Замена непрерывной расчётной области дискретным набором точек

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

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