Моделювання процесів теплопереносу

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
КН
Кафедра:
Кафедра електронні обчислювальні машини

Інформація про роботу

Рік:
2005
Тип роботи:
Лабораторна робота
Предмет:
Моделювання

Частина тексту файла (без зображень, графіків і формул):

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ Національний Університет “Львівська політехніка” Кафедра “Електронні обчислювальні машини” Лабораторна робота №2 з дисципліни “МОДЕЛЮВАННЯ” на тему : “Моделювання процесів теплопереносу” Коляса Р. Р. Львів – 2005 Мета роботи: Розробити програму для візуального відображення просторово-часового розподілу температури однорідного стержня шляхом чисельного інтегрування диференційного рівняння теплопровідності. Загальні відомості Одним із ефективних методів аналізу температурних режимів (як електронних пристроїв в цілому, так і окремих їх компонентів) є моделювання процесів теплопереносу за допомогою засобів обчислювальної техніки. Основою такого моделювання є чисельне інтегрування диференційних рівнянь, які описують процеси теплообміну. Рівняння теплопровідності (дифузії) у загальному випадку може бути записане наступним чином:   де ( - густина матеріалу об’єкту, p – коефіцієнт температуропроводності, q – коефіцієнт теплопередачі. Функція  описує температуру об’єкту або різницю температур між температурою об’єкту та зовнішнього середовища. Функція  визначає інтенсивність зовнішніх джерел тепла. Відомо, що рівняння  належить до рівнянь параболічного типу. Для знаходження розв’язку цього рівняння в обмеженій частині простору необхідно задати певним чином початкові та граничні умови. Існує декілька типів граничних умов (граничні умови першого, другого та третього роду), в залежності від температурних режимів на границі області визначення рівняння (1). Початкові умови описують стан системи в початковий момент часу. Для рівняння  задається неперервна функція :   де G – область, в якій визначено функції  та . Граничні умови визначають поведінку розв’язку на границі області G. Досліджувана система може знаходитись в контакті з іншими системами, які певним чином впливатимуть на неї. Характер цього впливу визначається типом граничних умов. Граничні умови першого роду :   визначають значення функції  на деякій поверхні S. Фізично це означає, що задається температура на границі області G. Граничні умови другого роду:   визначають потік тепла через границю S. При цьому похідна визначена за напрямком зовнішньої нормальні до S. Граничні умови третього роду:   дозволяють об’єднати граничні умови першого та другого роду та визначають теплообмін із зовнішнім середовищем за законом Ньютона. Граничні і початкові умови повинні бути узгодженими на поверхні S:   Розглянемо однорідний стержень довжиною l. Кінці стержня контактують із іншими середовищем, через які може здійснюватися теплообмін. Вважатимемо, що стержень знаходиться в середовищі із деякою постійною температурою. Якщо під  розглядати різницю температур між температурою стержня і температурою навколишнього середовища, то процес теплообміну може бути описаний за допомогою наступного рівняння теплопровідності:   де  - коефіцієнт температуропроводності, q – коефіцієнт теплопередачі.  Для такої системи розглянемо граничні умови третього роду, як найбільш загальні:   Шляхом відповідного вибору функцій  можна отримати граничні умови першого або другого роду. Зокрема, якщо через лівий кінець стержня проходить певний потік тепла, то покладаємо . Якщо температура правого кінця стержня підтримується постійною, то . Якщо через кінці стержня здійснюється теплообмін із зовнішнім середовищем за законом Ньютона (потік теплоти пропорційний градієнту температури), то . При цьому . Можна навести низку прикладів систем, процеси в яких описуються рівняннями (7) –(8). Корпус напівпровідникового приладу. З одного боку може міститися джерело тепла, тобто сам прилад, а з іншого – шасі пристрою або зовнішнє середовище. Відвід тепла від приладу здійснюється через теплопередачу до шасі та зовнішнього середовища. Радіатор для напівпровідникових приладів. Можливими є декілька варіантів розміщення приладів. Зокрема, прилади можуть бути розміщені з обох кінців стержня, а відвід тепла здійснюватиметься через теплообмін із зовнішнім середовищем уздовж стержня. Розглянемо реалізацію методу скінчених різниць (методу сіток) на прикладі рівняння  із граничними умовами . Ідея методу полягає в заміні частинних похідних у рівнянні  різницевими співвідношеннями. З цією метою розіб’ємо двовимірну область D, що утворена просторовою координатою х,  та часовою координатою t, , прямокутною сіткою із кроком h по x та кроком  по часу. Під  позначимо значення функції  в вузлах сітки із координатами  та . Не зменшуючи загальності покладемо у рівнянні  коефіцієнт температуропроводності  та замінимо похідні різницевими співвідношеннями. Існує декілька варіантів апроксимації похідних. Використовуючи для обчислення похідних апроксимаційну схему першого порядку, отримуємо:     Підставивши співвідношення  та  в  отримуємо наступну різницеву схему:   Дана схема називається явною, оскільки дозволяє безпосередньо знайти значення  за значенням , отриманими в попередній момент часу. Формулу  можна переписати наступним чином:   Серйозним недоліком явної різницевої схеми є необхідність забезпечення малого кроку по t. Дійсно, із  випливає, що коли ,  то розв’язок буде нестійким. Значно менш чутливими до вибору кроку інтегрування є так звані неявні схеми. Вони можуть бути отримані, якщо значення похідної за координатою  обчислювати не в момент часу , а в момент . Відповідно до цього маємо:   Оскільки   то отримуємо наступну неявну різницеву схему:   Рівність  можна записати у вигляді   Співвідношенню  в загальному випадку відповідає нескінченна система лінійних алгебраїчних рівнянь, яка у випадку обмеженої області D буде скінченої розмірності. Для знаходження розв’язку рівняння  за допомогою методу сіток необхідно записати дискретні наближення, що відповідають початковим та граничним умовам. Початкові умови  можна подати наступним чином:   Для запису граничних умов  похідні замінюємо їх дискретними наближеннями, використовуючи апроксимаційні формули першого порядку:   Розглянемо рекурентні співвідношення із урахуванням граничних та початкових умов для явної схеми типу . Граничні та початкові умови.   Рекурентні співвідношення із урахуванням граничних умов.     Аналогічно можна отримати систему лінійних рівнянь для неявної схеми типу . Для отримання більш компактних співвідношень введемо наступні позначення:   Тоді система алгебраїчних рівнянь набуває вигляду:     При використанні неявної схеми граничні умови записуються аналогічно та виражаються співвідношеннями . Зауважимо, що співвідношення  еквівалентне співвідношенню , із заміною відліку часу в точці  на відлік в точці . Порядок використання явної і неявної схеми є однаковим. Для вибраного значення ,  знаходимо значення  за значеннями , використовуючи співвідношеннями    для явної схеми, або шляхом розв’язку системи рівнянь  із використанням співвідношень , якщо схема є неявною. Коли , то значення  знаходимо за співвідношеннями , що випливають із граничних та початкових умов. Текст програми: #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "NRUTIL.H" #include <math.h> //-------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; #define NR_END 1 #define FREE_ARG char* #define NRANSI #define TINY 1.0e-20; int alpha0=0,alpha1=0; int beta0=1,beta1=1; int eta0=1,eta1=1; int q=20; float L=1; float T=0.1; int M=10; int N=50; float *U; float U0,Um; float **Matrix; float **matrix(long nrl, long nrh, long ncl, long nch) /* allocate a float matrix with subscript range m[nrl..nrh][ncl..nch] */ { long i, nrow=nrh-nrl+1,ncol=nch-ncl+1; float **m; /* allocate pointers to rows */ m=(float **) malloc((size_t)((nrow+NR_END)*sizeof(float*))); if (!m) nrerror("allocation failure 1 in matrix()"); m += NR_END; m -= nrl; /* allocate rows and set pointers to them */ m[nrl]=(float *) malloc((size_t)((nrow*ncol+NR_END)*sizeof(float))); if (!m[nrl]) nrerror("allocation failure 2 in matrix()"); m[nrl] += NR_END; m[nrl] -= ncl; for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol; /* return pointer to array of pointers to rows */ return m; } float *vector(long nl, long nh) /* allocate a float vector with subscript range v[nl..nh] */ { float *v; v=(float *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(float))); if (!v) nrerror("allocation failure in vector()"); return v-nl+NR_END; } int *ivector(long nl, long nh) /* allocate an int vector with subscript range v[nl..nh] */ { int *v; v=(int *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(int))); if (!v) nrerror("allocation failure in ivector()"); return v-nl+NR_END; } void nrerror(char error_text[]) /* Numerical Recipes standard error handler */ { /*fprintf(stderr,"Numerical Recipes run-time error...\n"); fprintf(stderr,"%s\n",error_text); fprintf(stderr,"...now exiting to system...\n");*/ exit(1); } void lubksb(float **a, int n, int *indx, float b[]) { int i,ii=0,ip,j; float sum; for (i=1;i<=n;i++) { ip=indx[i]; sum=b[ip]; b[ip]=b[i]; if (ii) for (j=ii;j<=i-1;j++) sum -= a[i][j]*b[j]; else if (sum) ii=i; b[i]=sum; } for (i=n;i>=1;i--) { sum=b[i]; for (j=i+1;j<=n;j++) sum -= a[i][j]*b[j]; b[i]=sum/a[i][i]; } } void ludcmp(float **a, int n, int *indx, float *d) { int i,imax,j,k; float big,dum,sum,temp; float *vv; vv=vector(1,n); *d=1.0; for (i=1;i<=n;i++) { big=0.0; for (j=1;j<=n;j++) if ((temp=fabs(a[i][j])) > big) big=temp; if (big == 0.0) nrerror("Singular matrix in routine ludcmp"); vv[i]=1.0/big; } for (j=1;j<=n;j++) { for (i=1;i<j;i++) { sum=a[i][j]; for (k=1;k<i;k++) sum -= a[i][k]*a[k][j]; a[i][j]=sum; } big=0.0; for (i=j;i<=n;i++) { sum=a[i][j]; for (k=1;k<j;k++) sum -= a[i][k]*a[k][j]; a[i][j]=sum; if ( (dum=vv[i]*fabs(sum)) >= big) { big=dum; imax=i; } } if (j != imax) { for (k=1;k<=n;k++) { dum=a[imax][k]; a[imax][k]=a[j][k]; a[j][k]=dum; } *d = -(*d); vv[imax]=vv[j]; } indx[j]=imax; if (a[j][j] == 0.0) a[j][j]=TINY; if (j != n) { dum=1.0/(a[j][j]); for (i=j+1;i<=n;i++) a[i][j] *= dum; } } free_vector(vv,1,n); } void free_vector(float *v, long nl, long nh) /* free a float vector allocated with vector() */ { free((FREE_ARG) (v+nl-NR_END)); } //-------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { Memo1->Text="Press Start"; } //-------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { float fi; float ef; float k1,k2; float gama1,gama2; float h=0.002,teta=0.1; int *indx=ivector(1,M-1); float d; AnsiString str; fi=1+ (2*teta/pow(h,2)) + q*teta; ef=teta/pow(h,2); k1=alpha0/(alpha0-beta0*h); k2=-eta0/(alpha0/h-beta0); gama1=alpha1/(alpha1+beta1*h); gama2=eta1/(alpha1/h+beta1); Matrix=matrix(1,M-1,1,M-1); U=vector(1,M-1); //-------Обрахунок Матриці-------- for (int i=3;i<=M-1;i++) for(int j=1;j<i-1;j++) Matrix[i][j]=Matrix[j][i]=0; Matrix[1][1]=fi-ef*k1; Matrix[1][2]=-ef; Matrix[M-1][M-1]=fi-ef*gama1; Matrix[M-1][M-2]=-ef; for(int i=2;i<=M-2;i++) { Matrix[i][i]=fi; Matrix[i][i-1]=Matrix[i][i+1]=-ef; } for (int i=1;i<=M-1;i++) { for(int j=1;j<=M-1;j++) str.cat_printf("% 10.2f ",Matrix[i][j]); str.cat_printf("%c%c",13,10); } Memo1->Text=str; for (int k=1;k<=M-1;k++) U[k]=0; U0=(alpha0*U[1]/h-eta0)/(alpha0/h-beta0); Um=(alpha1*U[M-1]/h+eta1)/(alpha1/h+beta1); U[1]+=ef*k2; U[M-1]+=ef*gama2; ludcmp(Matrix,M-1,indx,&d); lubksb(Matrix,M-1,indx,U); str=""; Image1->Canvas->MoveTo(0,Image1->Height-(U0-0.998)*100000); for (int k=1;k<=M-1;k++) Image1->Canvas->LineTo(40*k,Image1->Height-(U[k]-0.998)*100000); Image1->Canvas->LineTo(40*M,Image1->Height-(Um-0.998)*100000); str.cat_printf("%.10f%c%c",U0,13,10); for (int k=1;k<=M-1;k++) { //Image1->Canvas->LineTo(40*k,Image1->Height-(U[k]-0.998)*100000); str.cat_printf("%.10f%c%c",U[k],13,10); } str.cat_printf("%.10f%c%c",Um,13,10); str.cat_printf("----------------%c%c",13,10); for (int i=1;i<50;i++) { U[1]+=ef*k2; U[M-1]+=ef*gama2; lubksb(Matrix,M-1,indx,U); U0=k1*U[1]+k2; Um=gama1*U[M-1]+gama2; Image1->Canvas->MoveTo(0,Image1->Height-(U0-0.998)*100000); str.cat_printf("%.10f%c%c",U0,13,10); for (int k=1;k<=M-1;k++) { Image1->Canvas->LineTo(40*k,Image1->Height-(U[k]-0.998)*100000); str.cat_printf("%.10f%c%c",U[k],13,10); } str.cat_printf("%.10f%c%c",Um,13,10); str.cat_printf("----------------%c%c",13,10); Image1->Canvas->LineTo(40*M,Image1->Height-(Um-0.998)*100000); } Memo1->Text=str; } Результат виконання програми:  Висновок: На даній лабораторній роботі ми дослідили і змоделювали процеси теплопереносу однорідного стержня шляхом чисельного інтегрування диференційного рівняння теплопровідності засобами мови С++. Обчислення проводили з використанням неявної схеми.
Антиботан аватар за замовчуванням

13.02.2013 14:02-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!