Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗАДАНИЕ 2. Метод Рунге-Кутта.doc
Скачиваний:
24
Добавлен:
30.04.2015
Размер:
407.55 Кб
Скачать

Создание конструктора программы

1. После команды «Создать проект», выбора приложения WindowsForms, размещения проекта в личной папке студента и задания имени проекта появится окно (форма)Form1.

2. Расширить окно Form1. В меню «Вид» открыть «Панель элементов» и «Окно свойств» (рис. 2).

Рис. 2.

3. В поле Textокна свойств задать имя формы «Решение дифференциального уравнения».

4. Поместить на форму элементы: panel1;button1;button2;checkBox1;dataGridView1;pictureBox1;pictureBox2;panel2;textBox1;textBox2;textBox3;label1;label2;label3 (рис. 3). Номера 1, 2, 3 перечисленных элементов на панели элементов отсутствуют. Они появляются автоматически при помещении элемента на форму. Название элемента отражается в верхней строке панели свойств при щелчке на данном элементе.

Рис. 3.

5. Переименовать элементы формы, используя поле Textпанели свойств:button1 - Решение;button2 - Выход;checkBox1 - График;label1 - ;label2 - ;label3 -. В верхней части элементаdataGridView1 задать имена столбцов таблицы: №;x;y(x);dy/dx(рис. 4).

Рис. 4.

Создание клиентского кода

1. Щелкнуть правой кнопкой на конструкторе, выбрать команду «Перейти к коду».

2. Вставить из примера следующие описания:

double[] x, y, y1; int n = 50;

double h, x0, y0;

int i = 0;

Double My = 0, MaxY = 0, Mx = 0, MaxX = 0, My1 = 0, MaxY1 = 0;

Bitmap myBmp, myBmp2;

3. Щелкнуть дважды на кнопке «Решение» конструктора. На место курсора вставить в код решение уравнения.

4. Вставить остальную часть программы.

5. Щелкнуть дважды на кнопке «Выход» конструктора. На место курсора вставить в код строку: Close();.

Пример оформления отчета

ЗАДАНИЕ Windows Forms Application 2

Решение дифференциального уравнения методом Рунге-Кутта

Вариант 12

Выполнил студент гр. СТ-15

Кузнецов А.И.

1. Постановка задачи

Решить численно дифференциальное уравнение первого порядка методом Рунге-Кутта с шагом при заданных начальных условиях. Решение представить в виде таблицы, содержащей номерточки (51 точка) и значенияв этих точках. Построить график функции и ее производной.

Дифференциальное уравнение:

.

Начальные условия: .

2. Текст клиентского кода (программы)

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace Метод_Рунге_Кутты

{

public partial class Form1 : Form

{

double[] x, y, y1; int n = 50;

double h, x0, y0;

int i = 0;

Double My = 0, MaxY = 0, Mx = 0, MaxX = 0, My1 = 0, MaxY1 = 0;

Bitmap myBmp, myBmp2;

public Form1()

{

InitializeComponent();

}

private void button1_Click(object sender, EventArgs e)

{

//Решение

dataGridView1.Rows.Clear();

x = new double[n + 1];

y = new double[n + 1];

y1 = new double[n + 1];

x0= Convert.ToDouble(textBox1.Text);

y0= Convert.ToDouble(textBox2.Text);

h= Convert.ToDouble(textBox3.Text);

x[0] = x0;

y[0] = y0;

y1[0] = dydx(x[0], y[0]);

for (i = 1; i < n + 1; i++)

{

x[i] = x0 + h * i;

y[i] = y[i - 1] + dy(x[i - 1], y1[i - 1]);

y1[i] = dydx(x[i], y[i]);

}

for (i = 0; i < n + 1; i++)

{

// Заполнение таблицы

dataGridView1.Rows.Add();

dataGridView1.Rows[i].Cells[0].Value = i;

dataGridView1.Rows[i].Cells[1].Value = x[i];

dataGridView1.Rows[i].Cells[2].Value = y[i];

dataGridView1.Rows[i].Cells[3].Value = y1[i];

}

if (checkBox1.Checked)

{

postroenie();

}

}

double dydx(double D, double S)

{

//Выражение для производной

return 9 * Math.Cos(Math.PI * D) * Math.Exp(-D) - S;

}

double dy(double D, double S)

{

//Коэффициенты k1,k2,k3,k4

double k1, k2, k3, k4;

k1 = h * dydx(x[i - 1], y[i - 1]);

k2 = h * dydx(x[i - 1] + h / 2, y[i - 1] + k1 / 2);

k3 = h * dydx(x[i - 1] + h / 2, y[i - 1] + k2 / 2);

k4 = h * dydx(x[i - 1] + h, y[i - 1] + k3);

return 1.0 / 6 * (k1 + 2 * k2 + 2 * k3 + k4);

}

void postroenie()

{

// Построение графика

int[] yint, y1int, xint;

if (x == null || y == null || y1 == null) return;

MaxY = 0;

MaxY1 = 0;

MaxX = 0;

myBmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);

Graphics gr1 = Graphics.FromImage(myBmp);

Pen P1 = new Pen(Color.Red, 2);

gr1.DrawRectangle(P1, 1, 1, pictureBox1.Width - 2, pictureBox1.Height - 2);

for (int i = 0; i < n + 1; i++)

{

if (System.Math.Abs(y[i]) > MaxY)

{

MaxY = System.Math.Abs(y[i]); ;

}

if (System.Math.Abs(x[i]) > MaxX)

{

MaxX = System.Math.Abs(x[i]);

}

if (System.Math.Abs(y1[i]) > MaxY1)

{

MaxY1 = System.Math.Abs(y1[i]);

}

}

My = (pictureBox1.Height) / 2.2 / MaxY;

My1 = (pictureBox1.Height) / 2.2 / MaxY1;

Mx = (pictureBox1.Width) / 2.2 / MaxX;

yint = new int[n + 1];

y1int = new int[n + 1];

xint = new int[n + 1];

for (int i = 0; i < n + 1; i++)

{

yint[i] = (pictureBox1.Height) / 2 - Convert.ToInt32(y[i] * My);

y1int[i] = (pictureBox1.Height) / 2 - Convert.ToInt32(y1[i] * My1);

xint[i] = pictureBox1.Width / 2 + Convert.ToInt32(x[i] * Mx);

}

Pen P2 = new Pen(Color.Green, 6);

for (int i = 0; i < n; i++)

{

gr1.DrawLine(P2, xint[i], yint[i], xint[i + 1], yint[i + 1]);

}

Pen P3 = new Pen(Color.Brown, 6);

for (int i = 0; i < n; i++)

{

gr1.DrawLine(P3, xint[i], y1int[i], xint[i + 1], y1int[i + 1]);

}

Pen P4 = new Pen(Color.Black, 3);

//Кисть для шрифта на рисунке

Brush B2 = new SolidBrush(Color.Black);

System.Drawing.Font E = new Font("time new roman", 14);

// Вывод надписей на рисунке

gr1.DrawString("y dy/dx", E, B2, pictureBox1.Width / 2 - 20, 0);

gr1.DrawString("x", E, B2, pictureBox1.Width - 20, pictureBox1.Height / 2);

gr1.DrawLine(P4, 10, (pictureBox1.Height) / 2, pictureBox1.Width - 10, (pictureBox1.Height) / 2);

gr1.DrawLine(P4, pictureBox1.Width / 2, (pictureBox1.Height) - 10, pictureBox1.Width / 2, 10);

pictureBox1.Image = myBmp;

legenda();

}

void legenda()

{// Вывод легенды

myBmp2 = new Bitmap(pictureBox2.Width, pictureBox2.Height);

Graphics gr1 = Graphics.FromImage(myBmp2);

Pen P1 = new Pen(Color.Green, 6);

gr1.DrawLine(P1, pictureBox2.Width / 2, 20, pictureBox2.Width - 10, 20);

Pen P2 = new Pen(Color.Brown, 6);

gr1.DrawLine(P2, pictureBox2.Width / 2, 50, pictureBox2.Width - 10, 50);

Brush B2 = new SolidBrush(Color.Black);

System.Drawing.Font E = new Font("time new roman", 14);

gr1.DrawString("y(x)", E, B2, 7, 7);

gr1.DrawString("dy/dx", E, B2, 7, 37);

pictureBox2.Image = myBmp2;

}

private void button2_Click(object sender, EventArgs e)

{

Close();

}

}

}