Приложение разработано для вычисления площади фигуры методом Монте-Карло. Программа реализована на языке программирования высокого уровня С#.
Для работы приложения требуется наличие следующих программных пакетов:
· операционная система MS Windows XP или более поздняя версия;
· наличие обозревателя MS Internet Explorer 5.0 или выше;
· Microsoft .Net Framework 3.0 или старше.
Программа в дополнительной настройке не нуждается.
Приложение разработано для вычисления площади фигуры методом Монте-Карло. Данное приложение состоит из двух частей (клиентской и серверной). В клиентской части реализован интерфейс WPF. Серверным приложением является веб-служба ASMX/C#.
Проект состоит из следующих файлов:
1) MainWindow.aspx- файл содержащий в себе веб-форму;
2) MainWindow.aspx.cs - файл содержащий в себе код для обработки событий происходящих на форме;
3) Web.config - файл содержащий в себе настройки для корректной работы приложения на базе ASMX/C#
4) WS_MonteKarlo.asmx - файл отвечающий за серверную часть;
5) IceCream.cs - файл, содержащий классы IceCream, Triangle, Circle, Rectangle
) Point.cs - файл, содержащий класс Point.
Для корректной работы приложения требуется:
· операционная система Windows 2000 или старше;
· Microsoft .Net Framework 3.0 или старше;
· 128 Мб оперативной памяти;
· наличие 30 Мб свободного места на жестком диске.
Для запуска программы необходимо запустить проект App3.
Входными данными являются:
· координаты точек.
Выходными данными являются:
· таблица с информацией о работе метода Монте-Карло:
· количество точек для данного опыта;
· количество попавших в фигуру точек;
· площадь фигуры, вычисленная методом Монте-Карло;
· площадь фигуры, вычисленная по правилам геометрии;
· погрешность вычислений;
· время вычислений.
Приложение разработано для вычисления площади треугольника методом Монте-Карло.
Программа выполнится успешно если компьютер удовлетворяет системным требованиям указанным в пункте 6.6.
Получите у человека, который разворачивает приложения, адрес и введите его в браузере. Пример адреса, который вам будет предоставлен - «#"863722.files/image028.gif">
Рис.19. Результаты работы приложения на базе WPF/ASMX/C#
Исследование вычислительной сложности алгоритма производится путем
определения зависимости времени вычисления площади фигуры от количества
генерируемых точек для метода Монте-Карло. Результаты представлены в таблице 1.
Таблица 1. Сравнение вычислительной эффективности приложений
|
Количество точек |
Время выполнения приложения, мс |
||
|
|
Настольное приложение WPF/XBAP |
WEB приложение на базе Asp/JScript |
Веб-приложение на базе WPF/ASMX/C# |
|
1000 |
2 |
39 |
1 |
|
10000 |
6 |
653 |
2 |
|
100000 |
48 |
5053 |
18 |
|
1000000 |
500 |
44898 |
191 |
|
10000000 |
5355 |
438337 |
1745 |
Из таблицы видно, что приложение на базе WPF/ASMX/C# оказалось самым производительным. Также самым медленным по времени выполнения является веб-приложение на базе ASP/JScript. Это связано с тем, что JavaScript чувствителен к количеству переменных и из-за большого количества переменных приложение выполняется медленнее, чем все остальные.
Исследования проводились на ЭВМ со следующими характеристиками:
· процессор - Intel® Core™ i5-3210M CPU @2.50GHz 2.50GHz;
· оперативная память - 4096 Мб;
· операционная система - Windows 7 SP1;
· видеокарта - NVIDIA GeForce 610M 2048Mb.
В ходе работы были разработаны три приложения: настольное приложение WPF/XBAP, веб-приложение на базе ASP/JScript,
приложение на базе WPF/ASMX/C#, решающие одну и ту же задачу приближенного вычисления
площади фигуры методом Монте-Карло. По полученным результатам была исследована
вычислительная эффективность различных технологий программирования, а также
были закреплены знания, полученные в ходе изучения курса "Технологии
программирования".
1. ГОСТ 19.106-78 ЕСПД. Требования к программным документам, выполненным печатным способом.
2. ГОСТ 19.401-78 ЕСПД. Текст программы. Требования к содержанию и оформлению.
. ГОСТ 19.402-78 ЕСПД. Описание программы.
. ГОСТ 19.404-79 ЕСПД. Пояснительная записка. Требования к содержанию и оформлению.
. ГОСТ 2.10 -95 «Общие требования к текстовым документам».
. ГОСТ 19.701 - 90 ЕСПД. Схемы алгоритмов, программ, данных и систем. Условные обозначения и правила выполнения.
. ГОСТ 19.503-79 Руководство системного программиста. Требования к содержанию и оформлению.
. ГОСТ 19.504-79 Руководство программиста. Требования к содержанию и оформлению.
. ГОСТ 19.505-79 Руководство пользователя. Требования к содержанию и оформлению.
. Компьютерное оформление отчетных документов / Составитель Т.И. Матикашвили, ТулГУ, Тула, 2000. -36 с.
11. Библиотека Microsoft MSDN - URL: <http://msdn.microsoft.com/ru-ru/library>
. Шилдт Г. - C# 4.0 полное руководство - Москва: Вильямс, 2011 1056 с.
. Мэтт Зандстра - PHP. Объекты, шаблоны и методики программирования Москва: Вильямс, 2011. - 528 c.
. Никсон Р. - Создаем динамические веб-сайты с помощью PHP, MySQL, JavaScript и CSS - Питер, 2013. - 560 с.
. Эндрю Троелсен -
Язык программирования C# 5.0 и платформа .NET 4.5 Москва: Вильямс, 2013. - 1311
с.
using System;System.Collections.Generic;System.Linq;System.Text;
//using System.Threading.Tasks;
WPF_MonteKarlo
{class Point
{x, y;(float a, float b) { x = a; y = b; }
float PointX
{
{ return x; }
}float PointY
{
{ return y; }
}
}
System;System.Collections.Generic;System.Linq;System.Text;
WPF_MonteKarlo
{IceCream
{abe;ab;abcd;(Point a, Point b, Point e)
{= new Triangle(a, b, e);= new Circle(a, b);= new Rectangle(ab.MinX, abe.MaxX, abe.MinY, abe.MaxY);
}bool PointInIceCream(Point randP)
{(randP.PointX>(ab.CentrPoint.PointX))
{ return abe.PointInLines(randP);}
{ return ab.PointInCircle(randP); }
}float realSquare() { return (abe.Square() + ab.Square());}float minX
{
{ab.MinX;
}
}float maxX
{
{abe.MaxX;
}
}float minY
{
{abe.MinY;
}
}float maxY
{
{abe.MaxY;
}
}float MonteKarloSquare(int count, out int numberPoints, out float rel_delta)
{rand = new Random();= 0;
//DateTime start_date_time = DateTime.Now;(int k = 0; k < count; k++)
{p = new Point(minX + (float)(rand.NextDouble() * (maxX - minX)),+ (float)(rand.NextDouble() * (maxY - minY)));(PointInIceCream(p))
{++;
}
}
//DateTime end_date_time = DateTime.Now;MK_Square = abcd.Square() * ((float)numberPoints / (float)count);_delta = (float)Math.Round((Math.Abs((MK_Square - realSquare()) * 100) / realSquare()) * 10000) / (float)10000.0;MK_Square;
}
}
Triangle
{a, b, e;k1;k2;(Point p1, Point p2, Point p3)
{= p1; b = p2; e = p3;= (e.PointY - a.PointY) / (e.PointX - a.PointX);= (e.PointY - b.PointY) / (e.PointX - b.PointX);
}
float Square()
{
ab = (float)Math.Sqrt(Math.Pow((a.PointX - b.PointX), 2) + Math.Pow((a.PointY - b.PointY), 2));ae = (float)Math.Sqrt(Math.Pow((a.PointX - e.PointX), 2) + Math.Pow((a.PointY - e.PointY), 2));be = (float)Math.Sqrt(Math.Pow((b.PointX - e.PointX), 2) + Math.Pow((b.PointY - e.PointY), 2));polperim = (ab + ae + be) / 2.0f;(float)Math.Sqrt((polperim * (polperim - ab) * (polperim - ae) * (polperim - be)));
}
bool PointInLines(Point p)
{((((p.PointX - a.PointX) * k1 + a.PointY) >= p.PointY) || (((p.PointX - b.PointX) * k2 + b.PointY) <= p.PointY))
{true;
}
{false;
}
}
float MaxX
{
{e.PointX;
}
}
float MinY
{
{a.PointY;
}
}
float MaxY
{
{b.PointY;
}
}
}Circle
{Centr;r;(Point p1, Point p2)
{= (p2.PointY - p1.PointY) / 2;= new Point(p1.PointX,
p1.PointY + r);
}
float Square()
{(float)(Math.PI * Math.Pow(r, 2) / 2.0);
}
bool PointInCircle(Point p1)
{(p1.PointX < Centr.PointX)
{((Math.Pow(p1.PointX - Centr.PointX, 2) + Math.Pow(p1.PointY - Centr.PointY, 2)) <= Math.Pow(r, 2));
}{ return false; }
}
float MinX
{
{Centr.PointX - r;
}
}
Point CentrPoint
{
{Centr;
}
}
}
Rectangle
{MinX, MaxX, MinY, MaxY;(float MiX, float MaX, float MiY, float MaY)
{= MiX;= MaX;= MiY;= MaY;
}float Square()
{(MaxX - MinX) * (MaxY - MinY);
}
}
}
<Page x:Class="app1.Page1"="http://schemas.microsoft.com/winfx/2006/xaml/presentation":x="http://schemas.microsoft.com/winfx/2006/xaml":mc="http://schemas.openxmlformats.org/markup-compatibility/2006":d="http://schemas.microsoft.com/expression/blend/2008":Ignorable="d":DesignHeight="300" d:DesignWidth="300"="Page1">
<Grid Margin="0,0,-326,0">
<TextBox x:Name="KoordinX_A" HorizontalAlignment="Left" Height="23" Margin="61,52,0,0" TextWrapping="Wrap" Text="-8" VerticalAlignment="Top" Width="54" LostFocus="LostFocusTB"/>
<TextBox x:Name="KoordinX_B" HorizontalAlignment="Left" Height="23" Margin="61,75,0,0" TextWrapping="Wrap" Text="-8" VerticalAlignment="Top" Width="54" LostFocus="LostFocusTB"/>
<TextBox x:Name="KoordinX_D" HorizontalAlignment="Left" Height="23" Margin="61,98,0,0" TextWrapping="Wrap" Text="37" VerticalAlignment="Top" Width="54" LostFocus="LostFocusTB"/>
<TextBox x:Name="KoordinY_A" HorizontalAlignment="Left" Height="23" Margin="146,52,0,0" TextWrapping="Wrap" Text="-9" VerticalAlignment="Top" Width="54" LostFocus="LostFocusTB"/>
<TextBox x:Name="KoordinY_B" HorizontalAlignment="Left" Height="23" Margin="146,75,0,0" TextWrapping="Wrap" Text="17" VerticalAlignment="Top" Width="54" LostFocus="LostFocusTB"/>
<TextBox x:Name="KoordinY_D" HorizontalAlignment="Left" Height="23" Margin="146,98,0,0" TextWrapping="Wrap" Text="-9" VerticalAlignment="Top" Width="54" LostFocus="LostFocusTB"/>
<Button x:Name="Button1" Content="Расчёт" HorizontalAlignment="Left" Margin="243,49,0,0" VerticalAlignment="Top" Width="149" RenderTransformOrigin="0.427,0.455" Click="Button1_Click"/>
<ListBox x:Name="List" HorizontalAlignment="Left" Height="153" Margin="0,147,0,0" VerticalAlignment="Top" Width="626"/>
<Label Content="A" HorizontalAlignment="Left" Margin="10,49,0,0" VerticalAlignment="Top"/>
<Label Content="B" HorizontalAlignment="Left" Margin="10,73,0,0" VerticalAlignment="Top" RenderTransformOrigin="0.623,0.128"/>
<Label Content="D" HorizontalAlignment="Left" Margin="10,98,0,0" VerticalAlignment="Top"/>
<Label Content="X" HorizontalAlignment="Left" Margin="68,21,0,0" VerticalAlignment="Top"/>
<Label Content="Y" HorizontalAlignment="Left" Margin="153,21,0,0" VerticalAlignment="Top"/>
<Button Content="Очистить" HorizontalAlignment="Left" Margin="243,73,0,0" VerticalAlignment="Top" Width="149" Click="Button2_Click"/>
<Button
Content="Контрольный пример" HorizontalAlignment="Left"
Margin="243,99,0,0" VerticalAlignment="Top"
Width="149" Click="Button3_Click"/>
</Grid>
</Page>
System;System.Collections.Generic;System.Linq;System.Text;System.Threading.Tasks;System.Windows;System.Windows.Controls;System.Windows.Data;System.Windows.Documents;System.Windows.Input;System.Windows.Media;System.Windows.Media.Imaging;System.Windows.Navigation;System.Windows.Shapes;
app1
{
/// <summary>
/// Логика взаимодействия для Page1.xaml
/// </summary>partial class Page1 : Page
{Page1()
{();
}
ax = -8;bx = -8;dx = 37;ay = -9;by = 17;dy = -9;
bool check()
{result = true; // ошибок нетNumber;Error = "";
(float.TryParse(KoordinY_A.Text, out Number)) // проверка координаты Y точки А
{(float.Parse(KoordinY_A.Text) >= float.Parse(KoordinY_B.Text))
{+= "Координата Y точки A не может быть больше координаты Y точки В ";
KoordinY_A.Text = ay.ToString();= false;
}(float.Parse(KoordinY_A.Text) > float.Parse(KoordinY_D.Text))
{+= "Координата Y точки A не может быть больше координаты Y точки D";
KoordinY_A.Text = ay.ToString();= false;
}
}
{= false;
}
(float.TryParse(KoordinY_B.Text, out Number)) // проверка координаты Y точки B
{(float.Parse(KoordinY_B.Text) <= float.Parse(KoordinY_A.Text))
{
+= "Координата Y точки B не может быть меньше координаты Y точки А";
KoordinY_B.Text = by.ToString();= false;
}(float.Parse(KoordinY_B.Text) <= float.Parse(KoordinY_D.Text))
{+= "Координата Y точки B не может быть меньше координаты Y точки D";
KoordinY_B.Text = by.ToString();= false;
}
}
{= false;
}
(float.TryParse(KoordinX_A.Text, out Number)) //проверка координаты Х точки А
{(float.Parse(KoordinX_A.Text) >= float.Parse(KoordinX_D.Text))
{+= "Координата X точки A не может быть больше координаты X точки D";
KoordinX_A.Text = ax.ToString();= false;
}
}
{= false;
}
(float.TryParse(KoordinX_B.Text, out Number)) //проверка координаты Х точки B
{(float.Parse(KoordinX_B.Text) >= float.Parse(KoordinX_D.Text))
{+= "Координата X точки B не может быть больше координаты X точки D";
KoordinX_B.Text = bx.ToString();= false;
}
}
{= false;
}(float.TryParse(KoordinX_D.Text, out Number)) //проверка координаты Х точки Е
{((float.Parse(KoordinX_D.Text) <= float.Parse(KoordinX_A.Text)) || (float.Parse(KoordinX_D.Text) <= float.Parse(KoordinX_B.Text)))
{+= "Координата X точки D не может быть меньше координаты X точки А и В";
KoordinX_D.Text = dx.ToString();= false;
}
}
{= false;
}
(float.TryParse(KoordinY_D.Text, out Number)) // проверка координаты Y точки Е
{((float.Parse(KoordinY_D.Text) < float.Parse(KoordinY_A.Text)))
{+= "Координата Y точки D не может быть меньше координаты Y точки А";
KoordinY_D.Text = dy.ToString();= false;
}((float.Parse(KoordinY_D.Text) >= float.Parse(KoordinY_B.Text)))
{+= "Координата Y точки D не может быть больше координаты Y точки В";
KoordinY_D.Text = dy.ToString();= false;
}
}
{= false;
}(result == false)
{.Show(Error, "Введено некорректное значение координат", MessageBoxButton.OK, MessageBoxImage.Warning);result;
}
{result;
}
}
void LostFocusTB(object sender, RoutedEventArgs ee)
{EventTextBox = (TextBox)sender;Number = 0.0f;TextInTextBox = EventTextBox.Text.Replace(".", ",");(float.TryParse(TextInTextBox, out Number))
{(EventTextBox.Equals(KoordinX_A)) // проверка координаты X точки А
{_B.Text = KoordinX_A.Text;= float.Parse(KoordinX_A.Text);= float.Parse(KoordinX_B.Text);
}
(EventTextBox.Equals(KoordinX_B)) // проверка координаты X точки B
{_A.Text = KoordinX_B.Text;= float.Parse(KoordinX_B.Text);=
float.Parse(KoordinX_A.Text);
}(EventTextBox.Equals(KoordinX_D)) // проверка координаты X точки D
{= float.Parse(KoordinX_D.Text);
}(EventTextBox.Equals(KoordinY_A)) // проверка координаты Y точки A
{_D.Text = ay.ToString();= float.Parse(KoordinY_D.Text);= float.Parse(KoordinY_A.Text);
}(EventTextBox.Equals(KoordinY_B)) // проверка координаты Y точки B
{= float.Parse(KoordinY_B.Text);
}(EventTextBox.Equals(KoordinY_D)) // проверка координаты Y точки D
{= float.Parse(KoordinY_A.Text);= float.Parse(KoordinY_D.Text);_A.Text = dy.ToString();
}
(KoordinX_A.Text != "" && KoordinX_B.Text != "" && KoordinX_D.Text != "" && KoordinY_A.Text != ""
&& KoordinY_B.Text != "" && KoordinY_D.Text != "")
{.IsEnabled = true;
}
{.IsEnabled = false;
}
}
{cur_result = MessageBox.Show("Введено некорректное значение координаты\n",
//"Будет поставлено предыдущее значение",
"Введено некорректное значение координаты", MessageBoxButton.OK,
MessageBoxImage.Exclamation);(cur_result == MessageBoxResult.OK)
{(EventTextBox.Equals(KoordinX_A))
{_A.Text = ax.ToString();
}(EventTextBox.Equals(KoordinX_B))
{_B.Text = bx.ToString();
}(EventTextBox.Equals(KoordinX_D))
{_D.Text = dx.ToString();
}(EventTextBox.Equals(KoordinY_A))
{_A.Text = ay.ToString();
}(EventTextBox.Equals(KoordinY_B))
{_B.Text = by.ToString();
}(EventTextBox.Equals(KoordinY_D))
{_D.Text = ay.ToString();
}
}
}
}void Button1_Click(object sender, RoutedEventArgs e)
{(check())
{.Items.Clear();a = new Point(ax, ay);b = new Point(bx, by);d = new Point(dx, dy);icecream = new IceCream(a, b, d);perc;one_line;
List.Items.Add("Кол-во точек " + "Попавшие точки " + "S Монте-Карло " + "Реальная S " + "Погрешность " + "Время расчёта, мc");
float square = icecream.realSquare();(int i = 3; i < 8; i++)
{space = " ";numberPoints = 0;rel_delta = 0;MK_Square = 0;start_date_time = DateTime.Now;_Square = icecream.MonteKarloSquare((int)Math.Pow(10, i), out numberPoints, out rel_delta);end_date_time = DateTime.Now;arv_time = end_date_time - start_date_time;(int j = 1; j < 9 - i; j++) { space += " "; }= MK_Square / square;(perc >= 1) { perc = perc - 1; } else { perc = 1 - perc; }_line = Math.Pow(10, i) + space + " " + numberPoints.ToString() + space + " " + MK_Square.ToString(format: "F") + " " +.ToString(format: "F") + " " + perc.ToString(format: "P") + " " + arv_time.TotalMilliseconds;.Items.Add(one_line); //List.Items.Add("____________________________");
}
}{ }
}void Button2_Click(object sender, RoutedEventArgs ee)
{_A.Text = KoordinX_B.Text =_D.Text = KoordinY_A.Text =_B.Text = KoordinY_D.Text = "";.IsEnabled = false;
}
void Button3_Click(object sender, RoutedEventArgs ee)
{= bx = -8;= 37;= dy = -9;= 17;
_A.Text = ax.ToString();_B.Text = bx.ToString();_D.Text = dx.ToString();_A.Text = ay.ToString();_B.Text = by.ToString();_D.Text = dy.ToString();.IsEnabled = true;
}
}
}
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Расчет площади методом
Монте-Карло</title>
<script>changeAX() {.getElementById("bx").value = document.getElementById("ax").value;
}changeBX() {.getElementById("ax").value = document.getElementById("bx").value;
}Reset() {.KoordinX_A.value = "";.KoordinX_B.value = "";.KoordinX_D.value = "";.KoordinY_A.value = "";.KoordinY_B.value = "";.KoordinY_D.value = "";
}Example() {.KoordinX_A.value = "10";.KoordinX_B.value = "10";.KoordinX_D.value = "40";.KoordinY_A.value = "0";.KoordinY_B.value = "10";.KoordinY_D.value = "0";
}
</script>
</script>
</head>
<body>
<form action="MonteKarlo.asp" method="POST" name="MonteKarlo">
<div id="container">
<img src="icecream2.jpg" width="50%" align="right">
<table border="2" width="49%" height="25%" bgcolor="Azure" bordercolor="Black">
<tr>
<th colspan="3">Координаты треугольника ABD</th>
</tr>
<tr>
<td width="14%">Точка А:</td>
<td width="43%"><input type="text" value="10" name="KoordinX_A" size="20" onchange="changeAX();" id="ax"></td>