ЛАБОРАТОРНА РОБОТА 4
РОЗВ’ЯЗАННЯ СИСТЕМ ДИФЕРЕНЦІЙНИХ РІВНЯНЬ
Студента ИТ 14-1 Красовского Абхая
Мета роботи– здобути практичні навички розроблення алгоритмів і программ чисельних методів розв’язання систем диференційних рівнянь.
Вариант №11
Задача Коші для системи двох диференційних рівнянь:
Настроений метод Эйлера
Код:
#include <math.h>
double a, h;
int n, i, j, x_0, y_0, t_0, xpr, ypr;
double X[1000];
double Y[1000];
double T[1000];
…
double f1(double t, double x, double y) { return (y + 2 * t + 1); }
double f2(double t, double x, double y) { return x + y + t; }
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
Application::Exit(); }
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
a = Convert::ToDouble(textBox3->Text);// кінець інтервалу
n = Convert::ToInt32(textBox6->Text);// кількість точок
x_0 = Convert::ToInt32(textBox1->Text);// умова Коші
y_0 = Convert::ToInt32(textBox2->Text);// умова Коші
t_0 = Convert::ToInt32(textBox4->Text);// умова Кошi
//розрахунок кроку зміни аргументу х
h = (a - t_0) / n;
//Округлення кроку до 4 знаків після коми
textBox5->Text = Convert::ToString (floor(h*10000)/10000);
X[0] = x_0;
for (int i = 0; i < n; i++) {
X[i + 1] = X[i] + h;
if (X[i] == a) break;
}
Y[0] = y_0;
T[0] = t_0;
//Розрахунок коефіціентів метода Ейлера
for (int i = 0; i < n-1; i++)
{
T[i+1] = X[i] + h;
xpr = X[i] + h * f1(T[i], X[i], Y[i]);
ypr = Y[i] + h * f2(T[i], X[i], Y[i]);
X[i+1] = X[i] + h / 2 * (f1(T[i], X[i], Y[i]) + f1(T[i] + h, xpr, ypr));
Y[i+1] = Y[i] + h / 2 * (f2(T[i], X[i], Y[i]) + f2(T[i] + h, xpr, ypr));
}
Series^ plot1 = chart1->Series[0];
//Очищення компонента Chart1
plot1->Points->Clear();
//Очищення стовбців таблиці
dataGridView1->Columns->Clear();
//Створення двух стовбців у таблиці
dataGridView1->ColumnCount = 3;
//Створення у таблиці рядків
dataGridView1->Rows->Add(n);
dataGridView1->Columns[0]->Name="T";
dataGridView1->Columns[1]->Name="X";
dataGridView1->Columns[2]->Name="Y";
for (int j = 0; j < n; j++)
{
//Заповнення таблиці даними
dataGridView1->Rows[j]->Cells[0]->Value=Convert::ToDouble(floor(T[j]*10000)/10000);
dataGridView1->Rows[j]->Cells[1]->Value=Convert::ToDouble(floor(X[j]*10000)/10000);
dataGridView1->Rows[j]->Cells[2]->Value=Convert::ToDouble(floor(Y[j]*10000)/10000);
//Побудова графіка функції
plot1->Points->AddXY(X[j], Y[j]); } }
Результат: