Читайте также:
|
|
Решение дифференциального уравнения методом Рунге-Кутта
Вариант 1
Выполнил студент гр. СТ-11
Матушкин Д.М.
Постановка задачи
Решить численно дифференциальное уравнение первого порядка методом Рунге-Кутта с шагом при заданных начальных условиях. Решение представить в виде таблицы, содержащей номер № точки (51 точка) и значения в этих точках. Построить график функции и ее производной .
Дифференциальное уравнение:
dy/dx = sin(3y/1+x2)+1
Начальные условия: .
Текст клиентского кода (программы)
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 WindowsFormsApplication2
{
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 button2_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 Math.Sin((3*S)/(1+(D*D))) + 1;
}
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 button1_Click(object sender, EventArgs e)
{
Close();
}
}
}
Дата добавления: 2015-07-26; просмотров: 75 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Расчет нормы времени | | | Профилактика ПК |