ЗАДАНИЕ 4
Вычисление определенного интеграла
Цель задания
1. Получение навыков в написании процедур, имеющих параметры-функции.
2. Знакомство с алгоритмами численных методов интегрирования.
Постановка задачи
Вычислить определенный интеграл с переменным верхним пределом от функций в диапазоне
с шагом
. Построить графики функций
и определенных интегралов
в указанном диапазоне изменения .
Варианты задания
В каждом варианте n задания берутся функции
с номерами n; n+1; n+2 (h=0,01 во всех вариантах)
№ функции | Функции ![]() | ![]() | ![]() |
![]() | -1,5 | 2,5 | |
![]() | -2 | 3,5 | |
![]() | -5 | ||
![]() | -6,5 | ||
![]() | 0,2 | ||
![]() | -2 | 4,5 | |
![]() | -4 | 9,8 | |
![]() | 0,6 ![]() | ||
![]() | -7 | ||
![]() | -1 | ||
![]() | -2 | ||
![]() | -8 | ||
![]() | -2 | 3,5 | |
![]() | -4 | ||
![]() | -1 | 1,8 | |
![]() | -5 | ||
![]() | -0,7 | 7,9 | |
![]() | -10 | 2,3 |
Содержание отчета
1. Постановка задачи для конкретного варианта.
2. Текст клиентского кода программы.
3. Результаты работы программы.
Методические указания
1. Вычисление определенного интеграла оформить процедурой с параметром-функцией, а вычисление значений подынтегральных функций – функциями, имеющими сигнатуру делегата.
2. Windows-форма (конструктор) создается по рис. 1. Управляющие кнопки: Вычисление (button1); Построение (button2); Выход (button3). Элементы на панели1: a= (label1); b= (label2); h= (label3); textBox1; textBox2; textBox3. Элементы на панели2 (сверху вниз): radioButton1; radioButton2; radioButton3 (выбор функции и значения устанавливаются при отладке).
3. Создание клиентского кода.
· Дополнить раздел using System: using System.Drawing.Drawing2D;
· Вставить в код описания:
// Описание делегата
public delegate Double y(Double x1);
Double a, b, h;
double[] X, Y, Iny;
int i, n;
Bitmap myBmp, myBmp2;
double Mx, My, My1, MaxY1, MaxY, MaxX;
· Щелкнуть дважды на кнопке “Вычисление” конструктора, на место курсора вставить в код соответствующий обработчик события.
Рис. 1.
· Щелкнуть дважды на кнопке “Построение” конструктора, на место курсора вставить блок построения графика функции и определенного интеграла от нее с переменным верхним пределом.
· Щелкнить дважды на кнопке “Выход” конструктора, вставить в код команду Close();.
· Вставить из примера остальную часть кода.
Пример оформления отчета
ЗАДАНИЕ 4
Вычисление определенного интеграла
Вариант 20
Выполнил студент гр. СТ-12
Смирнов В.Н.
Постановка задачи
Вычислить определенный интеграл с переменным верхним пределом от функций в диапазоне
с шагом
. Построить графики функций
и определенных интегралов
в указанном диапазоне изменения .
Текст клиентского кода (программы)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
namespace Интегралы
{
public partial class Form1: Form
{
// Описание делегата
public delegate Double y(Double x1);
Double a, b, h;
double[] X, Y, Iny;
int i, n;
Bitmap myBmp, myBmp2;
double Mx, My, My1, MaxY1, MaxY, MaxX;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
dataGridView1.Rows.Clear();
a = Convert.ToDouble(textBox1.Text);
b = Convert.ToDouble(textBox2.Text);
h = Convert.ToDouble(textBox3.Text);
// Создание экземпляра делегата
y fx;
fx = null;
int s = 0;
if (this.radioButton1.Checked) s = 1;
if (this.radioButton2.Checked) s = 2;
if (this.radioButton3.Checked) s = 3;
switch (s)
{
// Использование делегата
case 1: fx = new y(f1); break;
case 2: fx = new y(f2); break;
case 3: fx = new y(f3); break;
default:
String Str = "Выберите функцию";
//Вывод сообщения
MessageBox.Show(Str, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
//Вызов процедуры вычисления интеграла
Integral(a, b, h, fx);
}
private void button2_Click(object sender, EventArgs e)
{
// Построение графика
int[] yint, y1int, xint;
if (X == null || Y == null || Iny == null) return;
MaxY = 0;
MaxX = 0;
MaxY1 = 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(Iny[i]) > MaxY1)
{
MaxY1 = System.Math.Abs(Iny[i]);
}
}
My = (pictureBox1.Height) / 2.2 / MaxY;
My1 = (pictureBox1.Height) / 2.8 / 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(Iny[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);
//Стиль линии с наконечниками
P4.SetLineCap(LineCap.Flat, LineCap.ArrowAnchor, DashCap.Flat);
//Кисть для шрифта на рисунке
Brush B2 = new SolidBrush(Color.Black);
System.Drawing.Font E = new Font("time new roman", 14);
// Вывод надписей на рисунке
gr1.DrawString("y интеграл от y", 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();
}
private void button3_Click(object sender, EventArgs e)
{
Close();
}
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("Интеграл от y(x)", E, B2, 7, 37);
pictureBox2.Image = myBmp2;
}
// Процедура вычисления интеграла с переменным
// верхним пределом методом трапеций
void Integral(double a, double b, double h, y f)
{
n = Convert.ToInt32(Math.Abs((b - a) / h));
Y = new double[n + 1];
X = new double[n + 1];
Iny = new double[n + 1];
X[0] = a;
Y[0] = f(X[0]);
Iny[0] = 0;
for (i = 1; i < n + 1; i++)
{
dataGridView1.Rows.Add();
X[i] = a + i * h;
Y[i] = f(X[i]);
Iny[i] = Iny[i - 1] + (Y[i] + Y[i - 1]) / 2 * h;
}
for (i = 0; i < n + 1; i++)
{
// Заполнение таблицы
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 = Iny[i];
}
}
// Функции, соответствующие делегату y(x)
double f1(Double x)
{
return Math.Sin(x) + 2 * x;
}
double f2(Double x)
{
return Math.Cos(2 * x) - x;
}
double f3(Double x)
{
return x * x - x * x * x;
}
}
}