Реферат Разработка программы, вычисляющей интеграл
Работа добавлена на сайт bukvasha.net: 2015-10-28Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
от 25%
договор
Государственное образовательное учреждение высшего профессионального образования
Кубанский государственный технологический университет
(КубГТУ)
Кафедра ________________________________________
(наименование кафедры)
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовому проекту (работе)
по ____________________________________________________________
наименование дисциплины)
на тему _______________________________________________________
(тема курсового проекта (работы))
Выполнил (а) студент (ка) группы ________________________________
_____________________________________________________________
(ф.и.о.)
Допущен к защите______________________________________________
Руководитель проекта___________________________________________
Нормоконтролер _______________________________________________
Защищен _____________________ Оценка _______________________
(дата)
Члены комиссии __________________________________________________
(подпись, дата, расшифровка подписи)
Краснодар
2010
Государственное образовательное учреждение высшего профессионального образования
Кубанский государственный технологический университет
(КубГТУ)
Кафедра ________________________________________
(наименование кафедры)
УТВЕРЖДАЮ
Зав. кафедрой ___________________
_______________________________
З А Д А Н И Е
на курсовое проектирование
Студенту:_________________________ группы__________________ курса
(Ф.И.О.) (№ группы и курса)
факультета ______________________________________________________
специальности __________________________________________________
________________________________________________________________
(шифр и наименование)
Тема проекта:____________________________________________________
Содержание задания:______________________________________________
________________________________________________________________
Объем работы:
а) пояснительная записка к проекту _____________ с.
б) программы.
Рекомендуемая литература:_________________________________________
Срок выполнения проекта: с "___" ______по"___"____20__г.
Срок защиты: "___"____20__г.
Дата выдачи задания: "___"____20__г.
Дата сдачи проекта на кафедру: "___"____20__г.
Руководитель проекта _________________________________
(подпись, ф.и.о., звание, степень)
Задание принял студент _______________________________
(подпись, дата)
Государственное образовательное учреждение высшего профессионального образования
Кубанский государственный технологический университет
(КубГТУ)
Реферат
Пояснительная записка курсового проекта (работы) 33 с., 16 рис., 4 источника.
ОПРЕДЕЛЕННЫЙ ИНТЕГРАЛ, МЕТОД ПРЯМОУГОЛЬНИКОВ, МЕТОД КРИВОЛИНЕЙНЫХ ТРАПЕЦИЙ, МЕТОД СИМПСОНА (ПАРАБОЛ), ПОСТРОЕНИЕ ГРАФИКА.
Объектом исследования является численное интегрирование с применением языка C# и применение принципов объектно-ориентированного программирования.
Цель работы состоит в разработке программы на языке C# демонстрирующей интегрирование различными методами и получении результатов.
К полученным результатам относятся построенный график функции с отображенными пределами интегрирования, численные значения интеграла, вычисленного разными способами, определенные погрешности вычислений.
СОДЕРЖАНИЕ
ВВЕДЕНИЕ
1 Спецификации задачи 6
2 Формулировка задачи 7
3 Описание методов вычислительной математики, используемых при решении 8
3.1 Численное интегрирование 8
3.1.1 Метод прямоугольников 8
3.1.2 Математический вывод формулы метода прямоугольников 10
3.1.3 Метод криволинейных трапеций 12
3.2 Метод Симпсона (парабол) 12
4 Описание методов программирования, примененных в работе 16
4.1 Среда разработки и организация решения 16
4.2 Проект библиотеки классов «IntegralClassLibrary» 16
4.3 Проект «Курсовая работа по ООП» 17
5 Листинги программы 19
5.1 Листинг файла «Integrals.cs» 19
5.2 Листинг файла «MainForm.cs» 21
6 Описание программы 27
7 Результаты тестирования программы 30
8 Заключение 31
Нормативные ссылки
Список используемой литературы
ВВЕДЕНИЕ
Цель курсовой работы является приобретение и углубление знаний в области высокоуровневых методов информатики и программирования, получения дополнительных практических навыков в использовании основных приёмов обработки экспериментальных данных, численного решения определенных интегралов.
Численное интегральное исчисление – часто используемая тема в математике. При решении ряда актуальных физических и технических задач встречаются определенные интегралы от функций, первообразные которых не выражаются через элементарные функции. Кроме того, в приложениях приходится иметь дело с определенными интегралами, сами подынтегральные функции которых не являются элементарными. Это приводит к необходимости использования приближенных методов вычисления определенных интегралов.
1 Спецификации задачи
Разрабатываемая программа должна обладать следующими качествами:
Производить интегрирование заданной функции методом прямоугольников, трапеций, парабол на основе входных данных и выводить результат;
Иметь графический интерфейс, позволяющий вводить исходные данные, а также визуализировать результаты вычислений, выводя на экран график подынтегральной функции, значения вычисленных интегралов и погрешности их вычислений.
При написании исходных текстов программы необходимым условием является использование основных принципов объектно-ориентированного программирования, обработки исключительных ситуаций, потоков выполнения, наличие подключаемых библиотек.
2Формулировка задачи
Данная курсовая работа посвящена разработке программы на языке C#, которая вычисляет определенный интеграл от функции, имеющей первообразную, которую можно вычислить с помощью той или иной приближенной формулы. Для решения этой задачи применяются методы прямоугольников, трапеций и парабол (Симпсона).
Задача курсового проекта – разработать программу на языке C#, такую, чтобы при работе с этой программой пользователь имел возможность:
a) Найти определенный интеграл выше упомянутыми методами от следующей функции:
б) ввести с клавиатуры пределы интегрирования и количество интервалов разбиения (a, b и n);
в) увидеть результаты вычислений на экране в удобном для восприятия виде с отображением графика функции, на введенном с клавиатуры отрезке.
При помощи данной программы нетрудно будет сравнить результаты вычислений одного и того же определенного интеграла найденные разными методами.
Программа должна отвечать следующим требованиям:
a) иметь простой интерфейс;
б) иметь защиту от некорректно введенных данных.
Актуальность реализации программы на компьютере заключается в простом использовании и возможности доработки дизайна и программного кода.
3Описание методов вычислительной математики, используемых при решении
3.1Численное интегрирование
Определенный интеграл
-
(1)
с пределами интегрирования a и b можно трактовать как площадь фигуры, ограниченной ординатами a и b, осью абсцисс x и графиком подынтегральной функции . Обыкновенный определенный интеграл, у которого известна его первообразная , вычисляется по формуле Ньютона-Лейбница . Поэтому для вычисления простых определенных интегралов достаточно вычислить значение .
На практике часто встречаются интегралы, которые не выражаются через элементарные функции или выражаются очень сложно. Нередко подынтегральная функция задается таблицей или графиком. В этих случаях интегралы находятся приближенными методами, которые заключаются в интерполяции на отрезке подходящим полиномом, для которого интеграл вычисляется по формулам численного интегрирования. Обычно отрезок разбивается на частей, к каждой из которых применяется соответствующая простая формула. Таким образом, получают составные (или сложные) формулы численного интегрирования. Для данной курсовой работы предусмотрено рассмотреть три способа численного интегрирования с помощью метода прямоугольников, криволинейных трапеций и метода Симпсона (параболических трапеций).
3.1.1Метод прямоугольников
Промежуток интегрирования делится точками на n равных частей; длина каждой
.
Для единообразия полагаем , . Через обозначаем середины участков Полагаем
Формулой прямоугольников называются следующие приближенные равенства:
– формула левых прямоугольников. | (2) |
– формула правых прямоугольников. | (3) |
– формула средних прямоугольников. | (4) |
Выражения (2), (3), (4) дают площади ступенчатых фигур, изображенных на рисунках 1, 2, 3 соответственно. В большинстве случаев при данном n формула (4) точнее, чем (2) и (3). С увеличением n точность формул (2), (3), (4) неограниченно возрастает.
Предельная погрешность формулы (4) составляет: ,
где – наибольшее значение в промежутке .
Рисунок 1 – Ступенчатая фигура, полученная по методу левых прямоугольников
Рисунок 2 – Ступенчатая фигура, полученная по методу правых прямоугольников
Рисунок 3 – Ступенчатая фигура, полученная по методу средних прямоугольников
Формула (4) наиболее точная, и погрешность по сравнению с формулами (2) и (3) уменьшается в приблизительно 50 раз. Отметим, что для линейной функции формула (4) дает точный ответ, поскольку в этом случае .
3.1.2Математический вывод формулы метода прямоугольников
Пусть на отрезке задана непрерывная функция . Требуется вычислить интеграл , численно равный площади соответствующей криволинейной трапеции.
Рисунок 4 – Ступенчатая фигура, состоящая из элементарных прямоугольников
Разобьем основание этой трапеции, т.е. отрезок , на n равных частей (отрезков) длины (что равняется шагу разбиения) с помощью точек . Можно записать, что , где .
В середине каждого такого отрезка поставим ординату графика функции . Приняв эту ординату за высоту, построим прямоугольник с площадью .
Тогда сумма площадей всех n прямоугольников дает площадь ступенчатой фигуры, представляющую собой приближенное значение искомого определенного интеграла
. | (5) |
Рисунок 5 – Блок-схема к алгоритму решения определенных интегралов по методу прямоугольников
3.1.3Метод криволинейных трапеций
Формула трапеций выводится аналогично формуле прямоугольников: на каждом частичном отрезке криволинейная трапеция заменяется обычной.
Рисунок 6 – Криволинейная фигура, полученная по методу криволинейных трапеций
Разобьем промежуток на n равных частей длины . Абсциссы точек деления . Пусть соответствующие им ординаты графика функции. Тогда расчетные формулы для этих значений примут вид: , , где .
Заменим кривую ломаной линией, звенья которой соединяют концы ординат и , где . Тогда площадь криволинейной трапеции приближенно равна сумме площадей обычных трапеций с основаниями , и высотой :
или | (6) |
– формула трапеций. | (7) |
Абсолютная погрешность приближения, полученного по формуле трапеций (7), оценивается с помощью формулы , где – наибольшее значение в промежутке . Так же, как и формула (4), формула трапеций (7) дает точный результат для линейной функции , поскольку .
3.2Метод Симпсона (парабол)
Если заменить график функции на каждом отрезке разбиения не отрезками прямых, как в методах прямоугольников и трапеций, а дугами парабол, то получим более точную формулу приближенного вычисления определенного интеграла .
Предварительно найдем площадь S криволинейной трапеции, ограниченной сверху графиком параболы , сбоку – прямыми , и снизу – отрезком (см. рисунок 7).
Рисунок 7 – Криволинейная фигура, ограниченная по сторонам прямыми и , а сверху графиком параболы
Пусть парабола проходит через три точки , , , где – ордината параболы в точке ; – ордината параболы в точке ; – ордината параболы в точке .
Площадь криволинейной фигуры, показанной на рисунке 7 равна
| (8) |
Выразим эту площадь через . Из равенств для ординат находим, что , .
Подставляя эти значения c и a в равенство (8), получаем
. | (9) |
Получим теперь формулу парабол для вычисления интеграла .
Для этого отрезок разобьем на 2n равных частей (отрезков) длиной точками , где . В точках деления вычисляем значения подынтегральной функции , где (рисунок 8).
Рисунок 8 – Криволинейная фигура, полученная по методу Симпсона (парабол)
Заменяем каждую пару соседних элементарных криволинейных трапеций с основаниями, равным h, одной элементарной параболической трапецией с основанием, равным 2h. На отрезке парабола проходит через три точки , , . Используя формулу (9), находим .
Аналогично находим
,
.
Сложив полученные равенства, имеем
или
. | (10) |
Формула (10) называется формулой Симпсона (парабол). Абсолютная погрешность вычисления по формуле (10) оценивается соотношением
, где .
Отметим, что формула (9) дает точное значение интеграла во всех случаях, когда – многочлен, степень которого меньше или равна трем (тогда ).
Рисунок 9 – Блок-схема к алгоритму решения определенных интегралов по методу Симпсона (парабол)
4Описание методов программирования, примененных в работе
4.1Среда разработки и организация решения
Курсовая работа выполнена в интегрированной среде программирования MS Visual Studio 2008.
Решение состоит из 2-х проектов:
IntegralClassLibrary;
Курсовая работа по ООП.
4.2Проект библиотеки классов «IntegralClassLibrary»
Проект включает в себя файл «Integrals.cs», в котором определены классы, содержащие методы для осуществления вычислений и свойства для получения результатов расчетов и погрешностей. Этот проект представляет собой библиотеку классов, после компиляции, которой образуется файл «IntegralClassLibrary.dll». Данный файл должен находиться в одной папке с запускаемым файлом программы.
В рамках библиотеки разработана иерархия классов с наследованием.
Базовым классом определен абстрактный класс Integral, в котором объявлены и реализованы все поля, свойства и методы общие для всех классов-наследников.
Рисунок 10 – Схема класса Integral
Accuracy – Свойство для получения погрешности интегрирования;
Square – Свойство для получения вычисленного значения интеграла;
Exact_value( ) – статический метод вычисления точного значения интеграла на основе аналитической формулы;
F( ) – статический метод для вычисления значения функции;
Integral(double a, double b, int n) – конструктор класса, в котором инициализируются поля и вызывается метод Solve( );
Solve( ) – абстрактный метод определяющий общий интерфейс для всех потомков класса, определяется в наследниках содержит алгоритм вычисления уникальный для каждого метода вычисляющего интеграл;
ToString( ) – возвращает текстовую строку, с результатами.
Базовый класс Integral порождает наследников, в которых реализуется абстрактный метод Solve( ), и передаются параметры вычислений конструктору базового класса.
Рисунок 11 – Схема реализации наследования от класса Integral
Каждый класс-наследник содержит конструктор, совпадающий с именем своего класса, а также реализует уже описанный метод Solve( ).
Таким образом, весь код логически общий для всех классов-наследников помещен в базовый класс Integral при помощи механизма наследования.
Реализация вычислений скрыта от пользователей классов Trapezoids, Rectangles, Simpsons, благодаря механизму инкапсуляции.
Полиморфизм проявляется при вызове метода Solve( ) имеющего разные реализации в каждом классе-наследнике. Данный метод не вызывается напрямую пользователем класса, вызов происходит в конструкторе каждого класса. Все три класса имеют одинаковый интерфейс для получения результатов вычисления.
4.3Проект «Курсовая работа по ООП»
Второй проект состоит из файлов:
«MainForm.cs», в котором определен класс главного окна приложения, а также методы и события, отвечающие за взаимодействие разных частей программы;
«SettingsForm.cs» – в файле определен класс окна настроек отображения графики;
«AboutBox.cs» – файл содержит класс окна «О программе».
Обязательным условием успешного построения проекта является соблюдение зависимостей, а именно наличие ссылок на библиотеки DLL: IntegralClassLibrary.dll и ZedGraph.dll. Первая, из которых разрабатывается в рамках первого рассмотренного проекта библиотеки «IntegralClassLibrary». Вторая представляет собой сторонний элемент управления не входящий в комплект поставки MS VS 2008, содержит классы позволяющие выводить графику в пространство указанного компонента, который в свою очередь располагается на главной форме приложения. Файл ZedGraph.dll должен находиться в папке с программой.
5Листинги программы
5.1Листинг файла «Integrals.cs»
using System;
namespace Patsev.Integrals
{
public abstract class Integral //базовый класс
{
public Integral(double a, double b, int n)
{
this.a = a; this.b = b; this.n = n;
//вычисление интеграла
Solve();
//вычисление погрешности
accuracy = Math.Abs(Exact_value(a, b) - square);
}
public static double F(double x) //возвращает значение подинтегральной функции
{
return 1 / Math.Sqrt(1 + x * x);
}
protected static double Exact_value(double a, double b) //точное значение определенного интеграла
{
return Math.Log(Math.Abs(b + Math.Sqrt(1 + b * b))) -
Math.Log(Math.Abs(a + Math.Sqrt(1 + a * a)));
}
abstract protected void Solve(); //{ } //метод, содержащий алгоритм вычислений
public double Square //значение интеграла
{
get
{
return square;
}
}
public double Accuracy //погрешность вычислений
{
get
{
return accuracy;
}
}
public static volatile bool Killed; //Позволяет остановить цикл вычислений
public static bool operator <(Integral x1, Integral x2)
{
if (x1.accuracy < x2.accuracy) return true;
return false;
}
public static bool operator >(Integral x1, Integral x2)
{
if (x1.accuracy > x2.accuracy) return true;
return false;
}
public override string ToString()
{
//return base.ToString();
string s;
if (Killed) return "";
s = Square.ToString() + " / " + Accuracy.ToString();
return s;
}
protected double square, accuracy, a, b;
protected int n;
}
public sealed class Rectangles : Integral //метод прямоугольников
{
public Rectangles(double a, double b, int n) : base(a, b, n){ }
override protected void Solve()
{
double yn = 0, y0, x0 = a, Delta = (b - a) / n;
for (int i = 0; i < n; i++, yn += y0, x0 += Delta)
{
if (Killed) { square = -1; return; }
y0 = F((2 * x0 + Delta) / 2);
}
square = yn * Delta;
}
}
public sealed class Trapezoids : Integral //метод трапеций
{
public Trapezoids(double a, double b, int n) : base(a, b, n){ }
override protected void Solve()
{
double yn = 0, y0, Delta = (b - a) / n, x0 = a + Delta;
for (int i = 1; i < n; i++, yn += y0, x0 += Delta)
{
if (Killed) { square = -1; return; }
y0 = F(x0);
}
square = Delta * ((F(a) + F(b)) / 2 + yn);
}
}
public sealed class Simpsons : Integral //метод парабол
{
public Simpsons(double a, double b, int n) : base(a, b, n) { }
override protected void Solve()
{
double yn1 = 0, yn2 = 0, y0, Delta = (b - a) / n, x0 = a + Delta;
for (int i = 1; i < n; i += 2, yn1 += y0, x0 += 2 * Delta)
{
if (Killed == true) { square = -1; return; }
y0 = F(x0);
}
x0 = a + 2 * Delta;
for (int i = 2; i < n - 1; i += 2, yn2 += y0, x0 += 2 * Delta)
{
if (Killed == true) { square = -1; return; }
y0 = F(x0);
}
square = (b - a) / 3 / n * (F(a) + F(b) + 4 * yn1 + 2 * yn2);
}
}
}
5.2Листинг файла «MainForm.cs»
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using Курсовая_работа_по_ООП;
using ZedGraph;
using Patsev.Integrals;
namespace Курсовая_работа_по_ООП
{
public partial class MainForm : Form
{
public int PointsQuantity { get; set; }
public int PointsSize { get; set; }
public Single LineWidth { get; set; }
double x1 { get; set; }
double x2 { get; set; }
int n { get; set; }
string strMethodRectangles, strTrapezoids, strSimpsons; //Строки для хранения результатов
string strCalcStatus; //информационная строка
public MainForm()
{
InitializeComponent();
}
private void DisambleButtons()
{
StartBtn.Enabled = false;
SettingsBtn.Enabled = false;
txtBoxX1.Enabled = false;
txtBoxX2.Enabled = false;
txtBoxN.Enabled = false;
strMethodRectangles = "";
strTrapezoids = "";
strSimpsons = "";
strCalcStatus = "Вычисление...\nНажмите 'x'\n для отмены.";
DrawGraph();
}
private void EnableButtons(object sender, RunWorkerCompletedEventArgs e)
{
StartBtn.Enabled = true;
SettingsBtn.Enabled = true;
txtBoxX1.Enabled = true;
txtBoxX2.Enabled = true;
txtBoxN.Enabled = true;
strCalcStatus = "";
DrawGraph();
}
private void Integration(object sender, DoWorkEventArgs e)
{
Integral myIntegral;
Patsev.Integrals.Integral.Killed = false;
myIntegral = new Patsev.Integrals.Rectangles(x1, x2, n);
strMethodRectangles = myIntegral.ToString();
myIntegral = new Patsev.Integrals.Trapezoids(x1, x2, n);
strTrapezoids = myIntegral.ToString();
myIntegral = new Patsev.Integrals.Simpsons(x1, x2, n);
strSimpsons = myIntegral.ToString();
}//интегрирование
private void DrawGraph() //вывод графика функции
{
// Получим панель для рисования
GraphPane pane = zedGraph.GraphPane;
// Очистим список текстов и кривых на тот случай, если до этого сигналы уже были нарисованы
pane.CurveList.Clear();
pane.GraphObjList.Clear();
// Печать заголовка
TextObj headline = new TextObj("Значение интеграла / Погрешность", 0.27F, 0.04F);
headline.FontSpec.FontColor = Color.DarkBlue;
headline.FontSpec.IsBold = true;
headline.FontSpec.Size = 8;
headline.FontSpec.IsAntiAlias = true;
// Disable the border and background fill options for the text
headline.FontSpec.Border.IsVisible = false;
headline.FontSpec.Fill.IsVisible = false;
headline.FontSpec.IsUnderline = true;
// Align the text such the the Left-Bottom corner is at the specified coordinates
// use AxisFraction coordinates so the text is placed relative to the ChartRect
headline.Location.CoordinateFrame = CoordType.ChartFraction;
headline.Location.AlignH = AlignH.Left;
headline.Location.AlignV = AlignV.Bottom;
pane.GraphObjList.Add(headline);
//Печать подписей к результатам
string textline = "Метод прямоугольников: \nМетод трапеций: \nМетод парабол:";
TextObj textresults = new TextObj(textline, 0.04F, 0.15F);
textresults.Location.CoordinateFrame = CoordType.ChartFraction;
textresults.FontSpec.Border.IsVisible = false;
textresults.FontSpec.Fill.IsVisible = false;
textresults.FontSpec.IsAntiAlias = true;
textresults.FontSpec.Size = 8;
textresults.Location.AlignH = AlignH.Left;
textresults.Location.AlignV = AlignV.Bottom;
textresults.FontSpec.StringAlignment = StringAlignment.Near;
pane.GraphObjList.Add(textresults);
//Печать результатов
string strresults = strMethodRectangles + "\n" + strTrapezoids + "\n" + strSimpsons;
TextObj results = new TextObj(strresults, 0.27F, 0.15F);
results.Location.CoordinateFrame = CoordType.ChartFraction;
results.FontSpec.FontColor = Color.DarkGreen;
results.FontSpec.Border.IsVisible = false;
results.FontSpec.Fill.IsVisible = false;
results.FontSpec.IsAntiAlias = true;
results.FontSpec.Size = 8;
results.Location.AlignH = AlignH.Left;
results.Location.AlignV = AlignV.Bottom;
results.FontSpec.StringAlignment = StringAlignment.Near;
pane.GraphObjList.Add(results);
//Печать надписи "Вычисление..."
TextObj txtCalc = new TextObj(strCalcStatus, 0.8F, 0.05F);
// use AxisFraction coordinates so the text is placed relative to the ChartRect
txtCalc.Location.CoordinateFrame = CoordType.ChartFraction;
// rotate the text 15 degrees
txtCalc.FontSpec.Angle = -45.0F;
// Text will be red, bold, and 16 point
txtCalc.FontSpec.FontColor = Color.Red;
txtCalc.FontSpec.IsBold = true;
txtCalc.FontSpec.Size = 16;
// Disable the border and background fill options for the text
txtCalc.FontSpec.Border.IsVisible = false;
txtCalc.FontSpec.Fill.IsVisible = false;
// Align the text such the the Left-Bottom corner is at the specified coordinates
txtCalc.Location.AlignH = AlignH.Left;
txtCalc.Location.AlignV = AlignV.Bottom;
pane.GraphObjList.Add(txtCalc);
//Вывод графика:
// Создадим список точек
PointPairList list = new PointPairList();
PointPairList plist = new PointPairList();
double xmin = x1;
double xmax = x2;
// Заполняем список точек
plist.Add(xmin, Integral.F(xmin));
double xp = Math.Max(Math.Abs(xmin) , Math.Abs(xmax));
double dx = 2 * xp * 1.2 / this.PointsQuantity;
for (double x = -xp * 1.2; x <= xp * 1.2; x += dx)
{
// добавим в список точку
list.Add(x, Integral.F(x));
if (x >= xmin && x <= xmax)
plist.Add(x, Integral.F(x));
}
plist.Add(xmax, Integral.F(xmax));
// Set the titles and axis labels
pane.Title.Text = "Интегрируемая функция f(x) = Sqrt(1 + x^2)";
pane.XAxis.Title.Text = "X";
pane.YAxis.Title.Text = "Y";
// Hide the legend
pane.Legend.IsVisible = false;
// Add a curve
LineItem curve = pane.AddCurve("label", list, Color.Red, SymbolType.Circle);
curve.Line.IsSmooth = true;
curve.Line.Width = this.LineWidth;
curve.Symbol.Fill = new Fill(Color.White);
curve.Symbol.Size = this.PointsSize;
// Fill the area under the curves
LineItem pcurve = pane.AddCurve("", plist, Color.Blue, SymbolType.None);
pcurve.Line.IsSmooth = true;
pcurve.Line.Fill = new Fill(Color.White, Color.Blue, 95.0F);
// Fill the axis background with a gradient
pane.Chart.Fill = new Fill(Color.White, Color.SteelBlue, 90.0F);
// Включим отображение сетки
pane.XAxis.MajorGrid.IsVisible = true;
pane.YAxis.MajorGrid.IsVisible = true;
/* Вызываем метод AxisChange (), чтобы обновить данные об осях.
В противном случае на рисунке будет показана только часть графика, которая умещается в интервалы по осям, установленные по умолчанию*/
zedGraph.AxisChange();
// Обновляем график
zedGraph.Invalidate();
}//прорисовка графика
private void ExitBtn_Click(object sender, EventArgs e)
{
Close();
}
private void AboutBtn_Click(object sender, EventArgs e)
{
AboutBox frmAbout = new AboutBox();
frmAbout.ShowDialog();
}
private void StartBtn_Click(object sender, EventArgs e)//запуск потоков вычислений
{
//проверка корректности вводимых значений
try
{
try
{
x1 = Convert.ToDouble(txtBoxX1.Text);
}
catch
{
txtBoxX1.Focus();
txtBoxX1.SelectAll();
throw new Exception("Ошибка при вводе x1");
}
try
{
x2 = Convert.ToDouble(txtBoxX2.Text);
}
catch
{
txtBoxX2.Focus();
txtBoxX2.SelectAll();
throw new Exception("Ошибка при вводе x2");
}
try
{
n = Convert.ToInt32(txtBoxN.Text);
}
catch
{
txtBoxN.Focus();
txtBoxN.SelectAll();
throw new Exception("Ошибка при вводе n");
}
DisambleButtons();
BackgroundWorker bw = new BackgroundWorker();
bw.WorkerSupportsCancellation = true;
bw.DoWork += Integration;
bw.RunWorkerCompleted += EnableButtons;
bw.RunWorkerAsync(null);
}
catch (Exception myexcepton)
{
MessageBox.Show(myexcepton.Message, "Ошибка ввода данных.");
}
}
private void zedGraph_DoubleClick(object sender, EventArgs e)
{
zedGraph.GraphPane.CurveList.Clear();
zedGraph.GraphPane.GraphObjList.Clear();
zedGraph.Invalidate();
}
private void MainForm_Shown(object sender, EventArgs e)
{
x1 = Convert.ToDouble(txtBoxX1.Text);
x2 = Convert.ToDouble(txtBoxX2.Text);
n = Convert.ToInt32(txtBoxN.Text);
DrawGraph();
}
private void SettingsBtn_Click(object sender, EventArgs e) //изменение настроек графика
{
SettingsForm SettingsFrm = new SettingsForm();
SettingsFrm.txtPointsQuantity = this.PointsQuantity.ToString();
SettingsFrm.txtPointsSize = this.PointsSize.ToString();
SettingsFrm.txtLineWidth = this.LineWidth.ToString();
if (SettingsFrm.ShowDialog() == DialogResult.OK)
{
try
{
try
{
this.PointsQuantity = Convert.ToInt32(SettingsFrm.txtPointsQuantity);
}
catch
{
throw new Exception("Ошибка при вводе количества точек на графике");
}
try
{
this.PointsSize = Convert.ToInt32(SettingsFrm.txtPointsSize);
}
catch
{
throw new Exception("Ошибка при вводе размера точек");
}
try
{
this.LineWidth = Convert.ToSingle(SettingsFrm.txtLineWidth);
}
catch
{
throw new Exception("Ошибка при вводе толщины линии");
}
DrawGraph();
}
catch (Exception myexcepton)
{
MessageBox.Show(myexcepton.Message + "\nОшибочные изменения не будут произведены."
, "Ошибка ввода данных.");
}
}
}
private void MainForm_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 120 || e.KeyChar == 1095) //отмена вычислений при нажатии 'x'
{
Patsev.Integrals.Integral.Killed = true;
strMethodRectangles = "";
strTrapezoids = "";
strSimpsons = "";
}
}
}
}
6Описание программы
При запуске программы на экран выводится главное окно программы с отображенными и доступными элементами управления (см. рисунок 12). Текстовые поля исходных данных заполнены значениями по умолчанию, которые можно изменить.
Рисунок 12 – Главное окно программы после запуска
После нажатия кнопки «Расчет» организуется поток выполнения вычислений, при длительных расчетах вычисления можно остановить, нажав клавишу, ‘x’ на клавиатуре (рисунок 13). Во время расчетов программа продолжает реагировать на действия пользователя, возможно минимизировать главное окно, изменить его размер, открыть окно «О программе» (рисунок 14), изменить ориентацию и масштаб графика, а также закрыть программу нажав кнопку «Выход». После проведения расчетов результаты отображаются в левом верхнем углу графика (рисунок 15). Программа допускает изменение отображения графика функции, соответствующие настройки можно изменить при нажатии кнопки «Настройки» (рисунок 16).
Рисунок 13 – Главное окно программы в процессе вычисления интегралов
Рисунок 14 – Окно «О программе»
Рисунок 15 – Главное окно программы после проведения расчетов
Рисунок 16 – Окно «настройки»
7Результаты тестирования программы
Согласно вычисленным результатам приведенным на рисунке 15, разработанная программа выполняет заданный расчет с достаточной точностью. Результат согласуется с расчетами, проведенными вручную или при применении математических пакетов. Согласно приведенным результатам наибольшая точность вычислений достигается при интегрировании методом парабол, наибольшая погрешность наблюдается при интегрировании методом прямоугольников.
В результате тестирования установлено, что разработанная программа отвечает всем основным требованиям, заложенным в поставленную задачу, а именно:
Имеет простой, интуитивно понятный интерфейс пользователя;
Визуализирует вычисления, показывает область интегрирования;
Изменение некоторых параметров прорисовки графика;
Устойчива к вводу некорректных данных;
Позволяет корректно останавливать затяжные вычисления;
Имеется возможность сохранять результаты работы в графической форме;
8Заключение
Итогом данной курсовой работы является программа, реализованная на языке C#, с помощью которой вычисляются определенный интеграл на заданном пользователем отрезке [a, b], разбитом на n равных частей с наглядным графиком функции от которой считается определенный интеграл, построенной на этом отрезке [a, b].
В качестве перспектив развития данной программы можно отметить такие нереализованные возможности как самостоятельный ввод пользователем нужной ему функции, расширение списка методов вычисления определенных интегралов, а так же визуальное улучшение интерфейса программы.
Нормативные ссылки
ГОСТ 2.105-95 ЕСКД. Общие требования к текстовым документам
ГОСТ 2.301-68 ЕСКД. Форматы
ГОСТ 7.1-2003.
Р 50-77-88 Рекомендации. ЕСКД. Правила выполнения диаграмм
Список используемой литературы
Павловская
Ильин В.А., Позняк Э.Г. Основы математического анализа. Часть I. Учебник для физических специальностей и др. Изд. 4.– М.: Наука. Главная редакция физ-мат литературы. 1982, 616 с.
Пискунов Н.С. Дифференциальное и интегральное исчисление. – М.: Наука, 1978-1980, т.т.1, 2
Ильин В. А., Поздняк Э. Г. Основы математического анализа. — М.: Дрофа, 2001.