Диссертация (Разработка СВЧ устройств с использованием методов геометрической оптики), страница 16

PDF-файл Диссертация (Разработка СВЧ устройств с использованием методов геометрической оптики), страница 16 Технические науки (40617): Диссертация - Аспирантура и докторантураДиссертация (Разработка СВЧ устройств с использованием методов геометрической оптики) - PDF, страница 16 (40617) - СтудИзба2019-05-20СтудИзба

Описание файла

Файл "Диссертация" внутри архива находится в папке "Разработка СВЧ устройств с использованием методов геометрической оптики". PDF-файл из архива "Разработка СВЧ устройств с использованием методов геометрической оптики", который расположен в категории "". Всё это находится в предмете "технические науки" из Аспирантура и докторантура, которые можно найти в файловом архиве НИУ ВШЭ. Не смотря на прямую связь этого архива с НИУ ВШЭ, его также можно найти и в других разделах. , а ещё этот архив представляет собой кандидатскую диссертацию, поэтому ещё представлен в разделе всех диссертаций на соискание учёной степени кандидата технических наук.

Просмотр PDF-файла онлайн

Текст 16 страницы из PDF

TracePro дополнительно имеет надстройкудля Solidworks, TracePro моста. TracePro мост позволяет пользователям применить и сохранить оптические свойства непосредственно вмодель SolidWorks через дерево TracePro системы в SolidWorks. Дляобеспечения целостности данных, единая модель используется какдля TracePro трассировка луча и оптического анализа и SolidWorksдля механического проектирования и модификации оптическихсвойств материала. С мостом, пользователям значительно ускоряютитеративный процесс разработки. Пользователи, использующие оптические программы проектирования, такие как OSLO, Zemax илиCode V также могут импортировать эти модели, чтобы создать полный дизайн с использованием оптико-механический встроенный вмульти-документ интерфейс.

После создания оптико-механическоймодели пользователи затем создают источники с помощью встроенного мастера каталогов, импорт моделей из каталога колбы или импортировать файлы лучей созданных из данных измерений, измеренных продуктом Radiant Imaging's ProSourceTM Radiant SourceTM.168Тогда лучи трассируются через систему чтобы найти энергетическиераспределения на любых поверхностях или путь объемного потокачерез любое пространство. Пользователи также могут имитироватьпостоянное появление освещения или систем освещения и отслеживать растровые изображения через оптические системы для проверки однородности, скрытых бликов, вспышки, и вопросы искажения.Так же могут быть смоделированы задачи тепловых эффектов и рассеяния света1.3.

ANSYS.1.3.1 ANSYS HFSS Physical Optics Solver.ANSYS HFSS (http://www.ansys.com/)предлагает решение физической оптики (PО) как часть IE решателя. В PО, источник излучения используется для освещения геометрии, таким образом, вызывая PO потоки, которые затем переизлучаются. Этот асимптотический метод является чрезвычайно полезным при решении оченьбольших задач электромагнитного излучения и рассеяния. Приложения включают в себя моделирование больших зеркальных антенн,а также эффективная площадь рассеяния (ЭПР) крупных объектов,таких как самолеты и корабли.

Эта возможность позволяет освещатьлюбою крупную структуры по случайной возбужденной планарнойили использовать связанное HFSS моделирование в качестве источника.169Выше приведена диаграмма направленности антенны, установленной на Международной космической станции с использованием метода физической оптики.1.4. FEKOДанный (http://www.feko.info/) программный продукт так жеиспользует метод PО.1.4.1 Общая применимость техники.PО разработана для использования в случаях, когда моделируются электрически очень большие металлические или диэлектрические структуры. PО является асимптотически высокочастотнымчисленным методом того же происхождения что и однородная теория дифракции, но основан на токах, а не лучи. Пользователи обычно предпочитают решение методом моментов (MoM) во первых икогда они понимают, что структура является электрически слишкомбольшой чтобы решить с помощью имеющихся у них ресурсов(платформа памяти, время) они возвращаются к Multilevel FastMultipole Method (MLFMM) и если они не могут решить проблему вдоступных ресурсах, то PО.1701.4.2 Технические принципы (Hybrid MoM/PO).FEKO сочетает текущую основу точного MoM с PO, учитываядвунаправленную связь между MoM и PO поддерживаемую врешении, то есть модификацируя матрицу взаимодействия,обеспечивая точность.

Практическим примером было бы рассчитать влияние на входное сопротивление рупорной антенны,обработанных с MoM, когда в непосредственной близости обрабатывают большую структуры с помощью PO. FEKO триангулирует PO области, точно так же как и MoM решения, чтоделает ее простой задачей для переключения между вариантами решения.FEKO реализует ряд расширений к PO:Токи Фока для учета поверхностных волн за границей теневой области в “неосвещенной” зоне.Коррекция условий для достижения более точного представления вблизи краев и клиньев.Большие элементы PO (LE-PO): альтернативный набор базисных функций для PO, основанных на функции плоскойволны. LE-PO не поддерживает многократных отражений,но позволяет сетки размером в несколько длин волн. Этоприводит к резкой экономии вычислительных затрат посравнению со стандартными PO, в случаях, когда LE-POприменимо.1.4.3 Типичное применение PO.Типичным примером того, как MoM / РО гибридизация могутбыть применены с хорошим результатом, является анализ зеркальных антенн.

Большое зеркальной антенны может бытьслишком большим, чтобы проанализированной с помощьюMLFMM, в этом случае сочетание MoM и PO является идеальным решением. Фидерная системы, как правило, моделируется MoM для достижения высокой точности тока на этой171части конструкции, при этом сам отражатель моделируется сPO. В таком случае, стандартный и LE- PO будут пригодны.Следует отметить, что виды портов волновода могут быть использованы в MoM области гибридного MoM / РО анализа,позволяя FEKO очень эффективно иметь дело с рупорнымиоблучателями.PO моделирование зеркальной антенны с MoM моделированием запитки.172Приложение 2. Исходный текст вычислительной процедуры для организации векторных вычислений на видеокарте производителя NVidia.//FileName: f1.h#ifndef __CUDATEST_MY_F1_#define __CUDATEST_MY_F1_#define BLOCK_DIM 16#define CUDA_DEBUG#ifdef CUDA_DEBUG#define CUDA_CHECK_ERROR(err)\if (err != cudaSuccess){\printf("Cudaerror:%s\n",cudaGetErrorString(err));\printf("Error in file: %s, line: %i\n", __FILE__,__LINE__);\}\#else#define CUDA_CHECK_ERROR(err)#endif#define _real floatdouble TestSlowGPU( int i );double TestFastGPU( int i );double TestCPU( int i );void SetIteration( int i );int GetIteration( void );void SetMatrixSize( int nWidth1, int nHeight1 );int GetMatrixSize( void );int GetByteMatrixSize( void );int GetnWidth( void );int GetnHeight( void );173#endif/////////////////////////////////////////////////////////////////FileName: cudaInfo.cu#include <stdio.h>#include <conio.h>#include "f1.h"static int nIteration;static int nMatrixSize;static int nWidth;static int nHeight;static int nByteSize;void SetIteration( int i ){nIteration = i;return;}int GetIteration( void ){return nIteration;}void SetMatrixSize( int nWidth1, int nHeight1 ){nWidth = nWidth1;nHeight = nHeight1;nMatrixSize = nWidth*nHeight;nByteSize = nMatrixSize * sizeof(_real);return;}int GetMatrixSize( void ){return nMatrixSize;}int GetnWidth( void ){return nWidth;}int GetnHeight( void )174{return nHeight;}int GetByteMatrixSize( void ){return nByteSize;}/*void SetBlockDim( int i ){nBlockDim = i;return;}int GetBlockDim(void ){return nBlockDim;}*//////////////////////////////////////////////////////////////////FileName: cudaInfo.cu#include <stdio.h>#include <conio.h>#include <cuda_runtime_api.h>#include "f1.h"///////////////////////////////////////////////////////////////int main( int argc, char *argv[] ){int deviceCount, nWidth111, nHeight111;cudaDeviceProp deviceProp;FILE *fp;double f1, f2, f3;SetIteration( 1000 );nWidth111 = 16*16*4*5;nHeight111 = 16*16*4*5;if( argc > 3 ){sscanf( argv[3],"%d", &nWidth111);sscanf( argv[4],"%d", &nHeight111);};SetMatrixSize( nWidth111, nHeight111 );175//SetBlockDim(nBlockDim);if( argc > 2 ){if((fp = fopen(argv[1], "r")) != NULL){fclose(fp);}else{if( (fp = fopen(argv[1], "w")) != NULL){fprintf(fp," \t \t");fprintf(fp,"DeviceName\t");fprintf(fp,"TotalGlobalMemory\t");fprintf(fp,"SharedMemoryPerBlock\t");fprintf(fp,"RegisterSperBlock\t");fprintf(fp,"WarpSize\t");fprintf(fp,"MemoryPitch\t");fprintf(fp,"MaxThreadSper block\t");fprintf(fp,"MaxThreadsDimensions1\tMaxThreadsDimensions2\tMaxThreadsDimensions3\t");fprintf(fp,"MaxGridSize1\tMaxGridSize2\tMaxGridSize3\t");fprintf(fp,"ClockRate\t");fprintf(fp,"TotalConstantMemory\t");fprintf(fp,"ComputeCapability\t");fprintf(fp,"TextureAlignment\t");fprintf(fp,"DeviceOverlap\t");fprintf(fp,"MultiprocessorCount\t");fprintf(fp,"KernelExecutionTimeoutEnabled\t");fprintf(fp, "TestForSlowGPU_msec\t");fprintf(fp, "TestForFastGPU_msec\t");fprintf(fp, "TestForCPU_msec\t");fprintf(fp, "MatrixSized\t");fprintf(fp, "ByteMatrixSize_MByte\t");fclose(fp);};};if( (fp = fopen(argv[1], "a")) != NULL)176{cudaGetDeviceCount(&deviceCount);for (int i = 0; i < deviceCount; i++){//Получаем информацию об устройствеcudaGetDeviceProperties(&deviceProp,i);//Выводим иформацию об устройствеfprintf(fp, "\n%s\t%d\t%s\t", argv[2],i+1, deviceProp.name);fprintf(fp,"%d\t",fprintf(fp,"%d\t",fprintf(fp,"%d\t",fprintf(fp,"%d\t",fprintf(fp,"%d\t",fprintf(fp,"%d\t",deviceProp.totalGlobalMem);deviceProp.sharedMemPerBlock);deviceProp.regsPerBlock);deviceProp.warpSize);deviceProp.memPitch);deviceProp.maxThreadsPerBlock);fprintf(fp, "%d\t%d\t%d\t",deviceProp.maxThreadsDim[0],deviceProp.maxThreadsDim[1],deviceProp.maxThreadsDim[2]);fprintf(fp, "%d\t%d\t%d\t",deviceProp.maxGridSize[0],deviceProp.maxGridSize[1],deviceProp.maxGridSize[2]);fprintf(fp,"%d\t",fprintf(fp,"%d\t",fprintf(fp,"%d.%d\t",deviceProp.clockRate);deviceProp.totalConstMem);deviceProp.major, deviceProp.minor);177fprintf(fp,"%d\t",fprintf(fp,"%d\t",fprintf(fp,"%d\t",deviceProp.textureAlignment);deviceProp.deviceOverlap);deviceProp.multiProcessorCount);fprintf(fp, "%s\t",deviceProp.kernelExecTimeoutEnabled ? "true" : "false");f1 = TestSlowGPU( i );f2 = TestFastGPU( i );f3 = TestCPU( i );fprintf(fp, "%lg\t", f1);fprintf(fp, "%lg\t", f2);fprintf(fp, "%lg\t", f3);fprintf(fp, "%d\t", GetMatrixSize());fprintf(fp,"%d\t",GetByteMatrixSize()/1024/1024);}fclose(fp);printf("\nVideoCardforcomputer%sDatawrite to %s\n", argv[2], argv[1]);};};//Сколько устройств CUDA установлено на PC.cudaGetDeviceCount(&deviceCount);printf("Device count: %d\n\n", deviceCount);for (int i = 0; i < deviceCount; i++){//Получаем информацию об устройствеcudaGetDeviceProperties(&deviceProp, i);//Выводим иформацию об устройствеprintf("Device name: %s\n", deviceProp.name);printf("Totalglobalmemory:%d\n",deviceProp.totalGlobalMem);printf("ShareddeviceProp.sharedMemPerBlock);memoryperblock:%d\n",178printf("Registersperblock:%d\n",deviceProp.regsPerBlock);printf("Warp size: %d\n", deviceProp.warpSize);printf("Memory pitch: %d\n", deviceProp.memPitch);printf("Maxthreadsperblock:%d\n",deviceProp.maxThreadsPerBlock);printf("Max threads dimensions: x = %d, y = %d, z = %d\n",deviceProp.maxThreadsDim[0],deviceProp.maxThreadsDim[1],deviceProp.maxThreadsDim[2]);printf("Max grid size: x = %d, y = %d, z = %d\n",deviceProp.maxGridSize[0],deviceProp.maxGridSize[1],deviceProp.maxGridSize[2]);printf("Clock rate: %d\n", deviceProp.clockRate);printf("Totalconstantmemory:%d\n",deviceProp.totalConstMem);printf("Computecapability:%d.%d\n",deviceProp.major,deviceProp.minor);printf("Texturealignment:%d\n",deviceProp.textureAlignment);printf("Device overlap: %d\n", deviceProp.deviceOverlap);printf("Multiprocessorcount:%d\n",deviceProp.multiProcessorCount);printf("Kernel execution timeout enabled: %s\n",deviceProp.kernelExecTimeoutEnabled ? "true" : "false");f2 = TestFastGPU( i );f3 = TestCPU( i );printf("Test for Slow GPU = %lg msec\n", f1);printf("Test for Fast GPU = %lg msec\n", f2);printf("Test for CPU = %lg msec\n", f3);printf("MatrixSize = %d\n", GetMatrixSize());printf("ByteMatrixSize=GetByteMatrixSize()/1024/1024);}printf("\nPress any key to exit...\n");getch();return 0;}%dMByte\n",179/////////////////////////////////////////////////////////////////FileName: cudaInfo.cu#include <stdio.h>#include <conio.h>#include <cuda_runtime_api.h>#include <windows.h>#include "f1.h"__host__voidMultMatrixCPU(_real*a,_real*Rezalt,intnWidth, int nHeight);__global__ void MultMatrixFast(_real* a, _real* b, int nWidth,_real* Rezalt );///////////////////////////////////////////////////////////////////////////////double TestFastGPU( int j ){//return 0;int nIteration = GetIteration();int i,n;double d = 0.;//Выделяем память под матрицы на хосте_real* a = new _real[GetMatrixSize()];_real* b = new _real[GetMatrixSize()];_real* Rezalt = new _real[GetMatrixSize()];//Заполняем исходную матрицу даннымиfor (i = 0; i < GetMatrixSize(); i++){a[i] = i;b[i] = i;};_real* adev =NULL;_real* bdev =NULL;_real* Rezaltdev =NULL;//Выделяем глобальную память для храния данных на девайсе180CUDA_CHECK_ERROR(cudaMalloc((void**)&adev,GetByteMatrixSize()));CUDA_CHECK_ERROR(cudaMalloc((void**)&bdev,GetByteMatrixSize()));CUDA_CHECK_ERROR(cudaMalloc((void**)&Rezaltdev,GetByteMatrixSize()));//Копируем исходную матрицу с хоста на девайсCUDA_CHECK_ERROR(cudaMemcpy(adev,a,GetByteMatrixSize(), cudaMemcpyHostToDevice));CUDA_CHECK_ERROR(cudaMemcpy(bdev,b,GetByteMatrixSize(), cudaMemcpyHostToDevice));//Конфигурация запуска ядраdim3 threads = dim3(BLOCK_DIM*BLOCK_DIM);//dim3blocks=dim3(GetnWidth()/threads.x,=dim3(GetnWidth()/BLOCK_DIM,GetnHeight() / threads.x);dim3blocksGetnHeight() / BLOCK_DIM);cudaEvent_t start;cudaEvent_t stop;//Создаемevent'ыдлясинхронизацииизамеравремениработы GPUCUDA_CHECK_ERROR(cudaEventCreate(&start));CUDA_CHECK_ERROR(cudaEventCreate(&stop));printf("GPUfastcomputeIteration:%d\n",GetIteration());//Отмечаем старт расчетов на GPUcudaEventRecord(start, 0);cudaMemcpy(a,adev,GetByteMatrixSize(),(b,bdev,GetByteMatrixSize(),Rezaltdev,GetByteMatrixSize(),cudaMemcpyDeviceToHost);cudaMemcpycudaMemcpyDeviceToHost);cudaMemcpy(Rezalt,cudaMemcpyDeviceToHost);//n = GetMatrixSize();181//for( i = 0; i < n; i++)//{//printf("i = %d: GPUSlow_a = %lg; GPUSlow_b = %lg;GPUSlowRez = %lg;\n", i, a[ i ], b[ i ],//Rezalt[ i ]);};for ( i = 0; i < GetIteration(); i++){MultMatrixFast<<<blocks,threads>>>(adev,bdev,GetnWidth(), Rezaltdev);};//Копируем результат с девайса на хостcudaMemcpy(Rezalt,Rezaltdev,GetByteMatrixSize(), cudaMemcpyDeviceToHost);//Отмечаем окончание расчетаcudaEventRecord(stop, 0);float time = 0.;//Синхронизируемя с моментом окончания расчетовcudaEventSynchronize(stop);//for( i = 0; i < n; i++)//{//printf("i = %d: GPUSlow_a = %lg; GPUSlow_b = %lg;GPUSlowRez = %lg; Width = %d\n", i, a[ i ], b[ i ],GetnWidth()//Rezalt[ i ],);};//Рассчитываем время работы GPUcudaEventElapsedTime(&time, start, stop);d = time;//Выводим время расчета в консольprintf ("GPU fast compute time: %lg msec\n", d);//Чистим ресурсы на видеокартеCUDA_CHECK_ERROR(cudaFree(adev));CUDA_CHECK_ERROR(cudaFree(bdev));CUDA_CHECK_ERROR(cudaFree(Rezaltdev));CUDA_CHECK_ERROR(cudaEventDestroy(start));CUDA_CHECK_ERROR(cudaEventDestroy(stop));182//Записываем матрицу-результат в файлprintMatrixToFile("after.txt",outputMatrix,height, width);//Чистим память на хостеdelete[] a;delete[] b;delete[] Rezalt;return d;}///////////////////////////////////////////////////////////////////////////////double TestCPU( int j ){int nIteration = GetIteration();int nStart;int i;double d = 0.;//Выделяем память под матрицы на хосте_real* a= new _real[GetMatrixSize()];_real* Rezalt = new _real[GetMatrixSize()];//Заполняем исходную матрицу даннымиfor (i = 0; i < GetMatrixSize(); i++){a[i] = i;};nStart = GetTickCount();for (i = 0; i < nIteration; i++){MultMatrixCPU(GetnHeight());}//int n;//n = GetMatrixSize();//for( i = 0; i < n; i++)//{a,Rezalt,GetnWidth(),183//printf("i = %d: GPUSlow = %lg;\n", i, Rezalt[ i ]);//};//Выводим время выполнения функции на CPU (в миллиекундах)d = GetTickCount() - nStart;printf ("CPU compute time: %lg msec\n", d);return d;}///////////////////////////////////////////////////////////////////////////////__global__ void MultMatrixFast(_real* a, _real* b, int width,_real* Rezalt ){int nInd;int bx = blockIdx.x;// block indexint by = blockIdx.y;int tx = threadIdx.x;// thread indexint ty = threadIdx.y;//Indexofthefirstsub-matrix of A processed by the blockint aBegin = width * BLOCK_DIM * by;int aEnd = aBegin + width - 1;// Step size used to iteratethrough the sub-matrices of Aint aStep = BLOCK_DIM;//Indexofthefirstsub-matrix of B processed by the blockint bBegin = BLOCK_DIM * bx;// Step size used to iteratethrough the sub-matrices of B//int bStep = BLOCK_DIM * height;int bStep = BLOCK_DIM * width;//float Rezalt = 0.0f;// computed subelement// Shared memory for the sub-matrix ofA__shared__ float as [BLOCK_DIM*BLOCK_DIM];184// Shared memory for the sub-matrixof B__shared__ float bs [BLOCK_DIM*BLOCK_DIM];//for ( int ia = aBegin, ib = bBegin; ia <= aEnd; ia +=aStep, ib += bStep )// Load the matrices from globalmemory to shared memory;as [tx] = a [tx];bs [tx] = b [tx];__syncthreads();// Synchronize to make sure thematrices are loaded// Multiply the two matrices together;as [tx] *= bs [tx];//as [tx] += bs [tx];Rezalt [tx] = as [tx];// Synchronize to make sure thatthe preceding//computationisdonebeforeloading two new// sub-matrices of A and B in thenext iteration__syncthreads();// Write the block sub-matrix toglobal memory;// each thread writes one element}///////////////////////////////////////////////////////////////////////////////__host__voidMultMatrixCPU(_real*a,nWidth, int nHeight){int nInd, x, y;for ( y = 0; y < nHeight; y++){for ( x = 0; x < nWidth; x++)_real*Rezalt,int185{nInd = x + y*nWidth;//Rezalt[ nInd ] = a[ nInd ]*a[ nInd ];Rezalt[ nInd ] = a[ nInd ]+a[ nInd ];}};return;}186Приложение 3.

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5301
Авторов
на СтудИзбе
416
Средний доход
с одного платного файла
Обучение Подробнее