Добавил:
abhai2013@gmail.com Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
9
Добавлен:
30.06.2018
Размер:
126.6 Кб
Скачать

ЛАБОРАТОРНА РОБОТА 3. ЧИСЕЛЬНЕ РОЗВ’ЯЗАННЯ РІВНЯННЯ ТЕПЛОПРОВІДНОСТІ МЕТОДОМ СІТОК

Студента ИТ 14-1 Красовского Абхая

Мета роботи – здобути практичні навички розроблення алгоритмів і програм чисельного розв’язку змішаної крайової задачі для диференцій- ного рівняння теплопровідності методом сіток.

Вариант №11

Блок-схема метода сеток

Код:

#include <math.h>

#include <float.h>

#include <time.h>

double H, k, lamda, L, left, right, center, bottom;

int D_x, D_y, MaxTime, x, i, j, t;

double D[10000][10000];

using namespace System::Windows::Forms::DataVisualization::Charting;

//Гранична умова на лівому кінці

double p (double t) { return 6 * t; }

//Гранична умова на правому кінці

double q (double t){ return 0.84; }

//Початкова форма струни

double f (double x){ return (x - 0.2) * (x + 1) + 0.2; }

//Заповнення нульового прошарку

void zero_level (int x){

for (x = 0; x <= D_x; x++)

D[x][0] = f(x * H);

}

//Заповнення лівої сторони

void left_side (int t) {

for (t = 0; t <= D_y; t++)

D[0][t] = p(t * k);

}

//Заповнення правої сторони

void right_side (int t){

for (t = 0; t <= D_y; t++)

D[D_x][t] = q(t * k);

}

// Обнуление массива D

void clearD (int i,int j){

for (i = 0; i <= D_x; i++)

for (j = 0; j <= D_y; j++)

D[i][j] = 0;

}

//функція розрахунку масиву D

void all_levels (int t, int x, double left, double right, double center, double bottom){

clearD(i,j);

zero_level(x);

left_side(t);

right_side(t);

for (t = 1; t <= D_y; t++)

for (x = 1; x <= (D_x - 1); x++)

{

left = D[x-1][t-1] * (lamda);

right = D[x+1][t-1] * (lamda);

center = D[x][t-1] * (1 - 2 * lamda);

bottom = D[x][t-2] * (-1);

D[x][t] = left + right + center;

}

}

//функція побудови графіка коливання струни

void Build_Graph (int t){

int x;

Series^ plot1 = chart1->Series[0];

plot1->Points->Clear();

for (x = 0; x <= D_x; x++)

plot1->Points->AddXY(x * H,D[x][t]);

}

private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {

toolStripStatusLabel1->Text = "";

toolStripStatusLabel2->Text = "";

}

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {

H = Convert::ToDouble(textBox3->Text);

k = Convert::ToDouble(textBox4->Text);

L = Convert::ToDouble(textBox1->Text);

MaxTime = Convert::ToInt32(textBox2->Text);

D_x = int(L / H);

D_y = int (MaxTime / k);

lamda = float(k) / float(H);

button2->Enabled = true;

}

private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {

timer1->Enabled = true;

all_levels(t, x, left, right, center, bottom);

Build_Graph(x);

button1->Enabled = false;

}

private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e) {

timer1->Start();

timer1->Enabled = true;

if (int(clock()) / 10 <= D_y)

if (fabs((int(clock() / 10) * k) - int(int(clock() / 10) * k)) <0.000001)

{

if (int(int(clock())*k) == 10)

{

timer1->Enabled = false;

button1->Enabled = false;

}

if (int(int(clock() / 10) * k) == 0)

{

timer1->Enabled = false;

button1->Enabled = false;

}

Build_Graph(int(clock() / 10));

toolStripStatusLabel1->Text = "Час - " + Convert::ToString(int(clock()/10*k)) + " сек ";

toolStripStatusLabel2->Text = " кількість ітерацій - " + Convert::ToString(int(clock() / 10));

}

}

private: System::Void button3_Click_1(System::Object^ sender, System::EventArgs^ e) {

Application::Exit();

}

Результат:

Соседние файлы в папке Второй триместр