МИНИСТЕРСТВО ОБРАЗОВАНИЯ И
НАУКИ
ЛУГАНСКОЙ НАРОДНОЙ
РЕСПУБЛИКИ
МАЛАЯ АКАДЕМИЯ НАУК
УЧАЩЕЙСЯ МОЛОДЕЖИ
|
Отделение (номинация): «Компьютерные
науки»
Секция: «Информатика и кибернетика»
|
«Графическое
решение уравнений в среде программирования Delphi»
Луганск – 2015
Содержание
ВВЕДЕНИЕ…………………………………………………………………….3
РАЗДЕЛ
1.Теоретическая часть проекта……………………………………4
РАЗДЕЛ
2.Создание программы «GRAPHICAL SOLUTION OF
EQUATIONS»
или «ГРУ»………………………………………8
ВЫВОДЫ………………………………………………………………..........17
СПИКОК
ИСПОЛЬЗОВАНЫХ ИСТОЧНИКОВ………………………………..……………………………..18
ВВЕДЕНИЕ
В наше время очень
актуальны разные сервисы для построения графиков
функций в двумерной
системе координат. Однако все они схожи меж собою,
и позволяют разве, что
просто построить график, но не позволяют увидеть
закономерности построения
функции(уравнения) на отдельно взятом промежутке.
Целью создания программы
является построение функции(уравнения) на данном промежутке и определение
типа функции, шаблона по
которому ее необходимо строить. А также список
координат абсцисс точек удовлетворяющий
данную функцию.
Задачей проекта является создание и
разработка новой программы для использования на основе построения графиков и получения
результатов
решения графических уравнений по школьным
и ВУЗ программам.
Актуальность программы в ее простоте
установки, в использовании и доступности. Также ведется разработка онлайн
варианта программы (сайта).
.
РАЗДЕЛ
1.Теоретическая часть проекта
К
примеру нам дано простейшее уравнение sqr(x)-2x-3=0.(Примечание sqr(x)=)
Попробуем
решить его графическим способом. Перенесем все слагаемые, кроме
sqr(x), в правую часть уравнения :
sqr(x)=2x+3
введем переменную y :
=
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
Код Delphi
|
1
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;
|
|
|
А теперь, если Вы чего-либо не поняли, давайте
разберем этот код.
Код Delphi
|
1
|
Type TFunc = function (x: real):
real;
|
|
|
Здесь я создал тип-функцию, для того, чтобы
передавать в функцию построения графика можно было передавать имя функции в эту
процедуру.
Код Delphi
|
1
|
procedure DrawGraph (f: TFunc;
a: real; b: real; C: TCanvas);
|
|
|
Заголовок функции. Параметры: f – функция, график, которой будем строить. a –
начальное значение переменной “x”. b – конечное значение переменной “x”. C –
канва, на которой будем рисовать.
Код Delphi
|
1
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);
|
|
|
В этом куске кода мы считаем масштабы по осям
координат, и среднее значения высоты и ширины канвы, чтобы отобразить оси
координат.
Код Delphi
|
1
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 черным цветом и рисуем желтым цветом оси координат.
Код Delphi
|
1
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
Оставьте свой комментарий
Авторизуйтесь, чтобы задавать вопросы.