ЛАБОРАТОРНА РОБОТА 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();
}
Результат: