Проектная работа конкурс МАН «Графическое решение уравнений в среде программирования Delphi»


МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ
ЛУГАНСКОЙ НАРОДНОЙ РЕСПУБЛИКИ
МАЛАЯ АКАДЕМИЯ НАУК УЧАЩЕЙСЯ МОЛОДЕЖИ
Отделение (номинация): «Компьютерные науки»Секция: «Информатика и кибернетика»
«Графическое решение уравнений в среде программирования Delphi»
Луганск – 2015
Содержание
ВВЕДЕНИЕ…………………………………………………………………….3
РАЗДЕЛ 1.Теоретическая часть проекта……………………………………4
РАЗДЕЛ 2.Создание программы «GRAPHICAL SOLUTION OF
EQUATIONS» или «ГРУ»………………………………………8
ВЫВОДЫ………………………………………………………………..........17
СПИКОК ИСПОЛЬЗОВАНЫХ ИСТОЧНИКОВ………………………………..……………………………..18

ВВЕДЕНИЕ
В наше время очень актуальны разные сервисы для построения графиков
функций в двумерной системе координат. Однако все они схожи меж собою,
и позволяют разве, что просто построить график, но не позволяют увидеть
закономерности построения функции(уравнения) на отдельно взятом промежутке.
Целью создания программы является построение функции(уравнения) на данном промежутке и определение
типа функции, шаблона по которому ее необходимо строить. А также список
координат абсцисс точек удовлетворяющий данную функцию.
Задачей проекта является создание и разработка новой программы для использования на основе построения графиков и получения результатов
решения графических уравнений по школьным и ВУЗ программам.
Актуальность программы в ее простоте установки, в использовании и доступности. Также ведется разработка онлайн варианта программы (сайта).
.
РАЗДЕЛ 1.Теоретическая часть проекта
К примеру нам дано простейшее уравнение sqr(x)-2x-3=0.(Примечание sqr(x)=x2)
Попробуем решить его графическим способом. Перенесем все слагаемые, кроме sqr(x),   в правую часть уравнения : sqr(x)=2x+3
введем переменную y :x2   =   y   =   2x + 3; построим графики полученных функций.

Рис 1.1
  Точки пересечения прямой   y = 2x+3   c параболой   y = x 2  имеют координаты   (–1; 1)   и   (3; 9).   Абсциссы этих точек являются  решением нашего квадратного уравнения:   x 1 = –1 ,   x 2 = 3 .         Проверим, подставив полученные решения в уравнение   x 2 – 2x – 3 = 0.               (−1) 2 – 2 • (−1) – 3 = 0     ⇒   1 + 2 – 3 = 0   — верное числовое равенство.                3² – 2 • 3 – 3 = 0  ⇒   9 – 6 – 3 = 0   — верное числовое равенство.              Значит, уравнение   x 2 – 2x – 3 = 0   имеет два решения:                                              x 1   =   –1 ,           x 2   =   3 .
Все довольно просто, но вот как реализовать все это в программном коде?...Все довольно просто, но вот как реализовать все это в программном коде?
В этом нам помогут библиотеки функций(в дальнейшем шаблоны функций).
Вот основные шаблоны функций которые я использовал:
Y= Описание
x^n или p(x,n) Возведение в степень: xn, например p(x,3) 
root(x,n) Корень n-ой степени из x. Например: root(x,3) есть корень 3й степени из x.
sqrt() Квадратный корень. Эквивалентно root(аргумент,2)
cbrt() Кубический корень. Эквивалентно root(аргумент,3)
logn(x,a) Логарифм x по основанию a
ln() Натуральный логарифм (c основанием e)
lg() Логарифм по основанию 10 (Десятичный логарифм), то же, что и logn(аргумент,10).
lb() Логарифм по основанию 2
exp() Экспоненциальная функция (e в заданной степени), эквивалентно e^аргументsin() Синус
cos() Косинус
tan() Тангенс
cot() Котангенс
sec() Секанс, определяется как 1/cos()
csc() Косеканс, определяется как 1/sin()
asin() Арксинус
acos() Арккосинус
atan() Арктангенс
acot() Арккотангенс
asec() Арксеканс, обратный секанс
acsc() Арккосеканс, обратный косеканс
sinh() Гиперболический синус, синус
cosh() Гиперболический косинус, косинус
tanh() Гиперболический тангенс
coth() Гиперболический котангенс
sech() Гиперболический секанс
csch() Гиперболический косеканс
asinh() Гиперболический арксинус, функция обратная sinh()
acosh() Гиперболический арккосинус, функция обратная cosh()
atanh() Гиперболический арктангенс, функция обратная tanh()
acoth() Гиперболический арккотангенс, функция обратная cotanh()
asech() Гиперболический арксеканс, функция обратная sech()
acsch() Гиперболический арккосеканс, функция обратная csch()
gaussd(x,среднее,сигма) Нормальное распределение (Распределение Гаусса). Например gaussd(x,0,1) есть нормальное стандартное расперделение со средним значением 0 и стандартным отклонением 1.
min(число1,число2) Вычисляет наименьшее из 2х значений
max(число1,число2) Вычисляет наибольшее из 2х значений
round() Округляет аргумент до целого значения
floor() Округление вниз
ceil() Округление вверх
abs() или | | Модуль (абсолютное значение)
sgn() Функция сигнум, определяет знак аргумента
sgn(x)  =    1 for x > 0
 0 for x = 0
-1 for x < 0
RandСлучайное число от 0 до 1
Попробуем создать алгоритм решения графических уравнений в программной среде:
Ввод уравнения ⇒ проверка наличия изначального «y» ⇒ поиск шаблонов в левой части уравнения ⇒ если находим их то присваиваем их переменной «y1» ⇒ поиск шаблонов в правой части уравнения ⇒ если находим присваиваем значение «y2»
В итоге у нас получается два уравнения.
Но как же нам построить сам график в Delphi?
Построение графика. Теория.Для начала предлагаю немного теории. Мы собираемся писать процедуру построения графика функции на определенной поверхности, заданной свойством Canvas. Я предлагаю поставить оси координат в середине этой области, а график растянуть так, чтобы он растянулся на всю область. Строить мы будем методом lineto. Поэтому нам нужно определиться с шагом изменения величины аргумента. Я предлагаю взять его обратным к масштабу по оси ординат. Так наш график будет выглядеть плавно при любой функции и любом начальном и конечном значении абсциссы. Масштаб по оси абсцисс считается, отношение ширины поверхности к разнице максимального и минимального значения абсциссы. Масштаб по оси ординат считается аналогично: отношение высоты поверхности к разнице между максимальным и минимальным значениями данной функции на данном интервале.
После построения мы просто записываем точки пересечения данных графиков функций отдельные переменные, а затем просто выводим абсциссы(x) данных точек.
Они и будут являться решением нашего уравнения.
РАЗДЕЛ 2.Создание программы «GRAPHICAL SOLUTION OF EQUATIONS» или «ГРУ»
Перейдем к практике:
Процедура DrawGraph
Код Delphi1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79 Type TFunc = function (x: real): real;
 
procedure DrawGraph (f: TFunc; a: real; b: real; C: TCanvas);
 
var x, y, h: real;
 
    max, min: real;
 
    sx, sy: real;
 
    xmid, ymid: integer;
 
begin
 
sx := (c.ClipRect.Right)/(b-a);
 
 h := 1/sx;
 
 xmid := c.ClipRect.Right div 2;
 
 ymid := c.ClipRect.Bottom div 2;
 
 x := a;
 
 max := f( x);
 
 min := max;
 
 while x<=b do
 
  begin
 
   y := f( x);
 
   if y<min then min := y;
 
   if y>max then max := y;
 
   x := x + h;
 
  end;
 
 sy := c.ClipRect.Bottom/ (max-min);
 
 c.Brush.Color := clBlack;
 
 c.FillRect(Rect(0, 0, c.ClipRect.Right, c.ClipRect.Bottom));
 
 c.Pen.Color := clYellow;
 
 c.MoveTo(0, ymid);
 
 c.LineTo(c.ClipRect.Right, ymid);
 
 c.MoveTo(xmid, 0);
 
 c.LineTo(xmid, c.ClipRect.Bottom);
 
 x := a;
 
 y := f(x);
 
 c.Pen.Color := clWhite;
 
 c.MoveTo(xmid+round(sx*x), ymid-round(sy*y));
 
 while x<=b do
 
  begin
 
   y := f(x);
 
   c.LineTo(xmid+round(sx*x), ymid-round(sy*y));
 
   x := x + h;
 
  end;
 
end;
А теперь, если Вы чего-либо не поняли, давайте разберем этот код.
Код Delphi1 Type TFunc = function (x: real): real;
Здесь я создал тип-функцию, для того, чтобы передавать в функцию построения графика можно было передавать имя функции в эту процедуру.
Код Delphi1 procedure DrawGraph (f: TFunc; a: real; b: real; C: TCanvas);
Заголовок функции. Параметры: f – функция, график, которой будем строить. a – начальное значение переменной “x”. b – конечное значение переменной “x”. C – канва, на которой будем рисовать.
Код Delphi1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 sx := (c.ClipRect.Right)/(b-a);
 
 h := 1/sx;
 
 xmid := c.ClipRect.Right div 2;
 
 ymid := c.ClipRect.Bottom div 2;
 
 x := a;
 
 max := f( x);
 
 min := max;
 
 while x<=b do
 
  begin
 
   y := f( x);
 
   if y<min then min := y;
 
   if y>max then max := y;
 
   x := x + h;
 
  end;
 
 sy := c.ClipRect.Bottom/ (max-min);
В этом куске кода мы считаем масштабы по осям координат, и среднее значения высоты и ширины канвы, чтобы отобразить оси координат.
Код Delphi1
2
3
4
5
6
7
8
9
10
11
12
13 c.Brush.Color := clBlack;
 
 c.FillRect(Rect(0, 0, c.ClipRect.Right, c.ClipRect.Bottom));
 
 c.Pen.Color := clYellow;
 
 c.MoveTo(0, ymid);
 
 c.LineTo(c.ClipRect.Right, ymid);
 
 c.MoveTo(xmid, 0);
 
 c.LineTo(xmid, c.ClipRect.Bottom);
Здесь мы заливаем весь TCanvas черным цветом и рисуем желтым цветом оси координат.
Код Delphi1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19  x := a;
 
 y := f(x);
 
 c.Pen.Color := clWhite;
 
 c.MoveTo(xmid+round(sx*x), ymid-round(sy*y));
 
 while x<=b do
 
  begin
 
   y := f(x);
 
   c.LineTo(xmid+round(sx*x), ymid-round(sy*y));
 
   x := x + h;
 
  end;
Ну и, наконец, нарисовали график нужной нам функции.Небольшой пример:Положим на форму одну кнопку и один компонент TImage. Создадим обработчик функции OnClick для кнопки примерно следующего характера, и следующую функцию для расчета функции(уравнения)
Код Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 Function f(x: real): real;
 
Begin
 
 Result := sin(x)*cos(x);
 
End;
 
 
procedure TForm1.Button1Click(Sender: TObject);
 
begin
 
 DrawGraph (f, -10, 10, Image1.Canvas);
 
end;
Ладно, с этим все понятно. А как узнать точки пересечения?
Нужно пройти по графику от начала до конца и с заданной точностью eps определить эти точки.
Вот пример кода:
x:=a;
n:=0;
while x<=b do
if abs(f1(x)-f2(x))<eps then
 begin
  inc(n);
  x1[n]:=x;
  y1[n]:=f1(x);
 end;

ВЫВОДЫ.
Разработанный мной проект позволит ускорить и облегчить процесс решения графических уравнений. Данная программа была установлена в компьютерном классе Стахановской гимназии №7, и апробирована среди учащихся 11 классов.
Для всех желающих преподавателей и учащихся, кому необходимо получить доступ к моей программе, могут воспользоваться моим сайтом.
Ссылка на сайт будет указана в справочном окне программы.
Я считаю, что с поставленной задачей я справился. Над улучшением и модернизацией этой программы я буду работать в дальнейшем.

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ:
http://www.cyberforum.ru
http://www.webmath.ru/web/function_library.php