Научно-методически статии

ПРОГРАМНИ ЕКСПЕРИМЕНТИ СЪС ЗАДАЧИ ОТ ТИП HERON

Отворен достъп

Резюме. Задачата на Heron е древна математическа задача, която има точно и елегантно решение. В статията са формулирани задачи, които представляват обобщение на задачата на Heron, но за които не са известни точни математически решения. Тези задачи имат практическо приложение и за тях са представени приближени решения чрез програми на C++ и MATLAB.

Ключови думи: Heron type problems, Generalized Heron problems

1. Задачата на Heron

Отправна точка в тази статия е следната древна задача.

Основна задача. Дадени са права \(l\) и две точки \(A\) и \(B\), разположени от една и съща страна на \(l\). Да се намери точка \(M\) от правата \(l\), за която сборът от разстоянията от \(A\) и B до M е минимален (Hadamard, 1962).

Задачата се среща и в разнообразни забавни формулировки. Тя има кратко и красиво решение.

BAMМ1A'l

Фигура 1

Решение

Разглеждаме фиг. 1, на която \(l\) е дадената права, а A и B са точките, които са разположени от едната є страна. Построяваме т. A', симетрична на A по отношение на правата \(l\), а с M означаваме пресеч-ната точка на \(l\) и BA'. Нека \(\mathrm{M}_{1}\) е произволна точка върху \(l\), различна от т. М.

Тъй като \(\mathrm{MA}^{\prime}=\mathrm{MA}\) и \(\mathrm{M}_{1} \mathrm{~A}^{\prime}=\mathrm{M}_{1} \mathrm{~A}\), следва, че:

\(\mathrm{BM}_{1}+\mathrm{M}_{1} \mathrm{~A}=\mathrm{BM}_{1}+\mathrm{M}_{1} \mathrm{~A}^{\prime} \gt \mathrm{BA}^{\prime}=\mathrm{BM}+\mathrm{MA}^{\prime}=\mathrm{BM}+\mathrm{MA}\)

С това исканата точка M е построена и тя е единствена.

В (Hadamard, 1962) под номер 14 е дадена задача (задачата за билярда), която има различна формулировка от задачата на Heron, но практически решението е същото: Дадени са права xy и две точки \(A\) и \(B\), които са от една и съща страна на правата. Да се намери точка M върху правата, за която \(\boxtimes A M x=\boxtimes B M y\).

В тази задача косвено се илюстрира закон от физиката, съгласно който ъгълът, под който пада светлинен лъч върху равнинна повърхност, е равен на ъгъла, под който лъчът се отразява.

По-нататък за краткост точката M, която е решение на задачата на Heron, ще наричаме минималната точка за съответната права \(l\) и двете точки \(\mathrm{P}_{1}, \mathrm{P}_{2}\), а за самата задача и решението є ще използваме означението \(\mathrm{M}=\left(l ; \mathrm{P}_{1}, \mathrm{P}_{2}\right)\).

Може да се отбележи, че изискването в задачата на Heron двете точки да са от едната страна на правата, не е съществено. Когато точките са от различни страни, решението се вижда веднага и всъщност този случай подсказва за решението на основната задача.

Ако не се налагат ограничения за разположението на точките спрямо правата, тогава следва да се разгледат няколко случая. Те са представени в табл. 1, където с \(\mathrm{d}_{\text {мIN }}\) е означено минималното разстояние \(\mathrm{P}_{1} \mathrm{M}+\mathrm{MP}_{2}\).

Таблица 1. Възможни случаи на взаимно разположение на точките и правата

РазположениенаточкитеP1иP2РазположениенаминималнататочкаМ1Точкитесаотеднатастрананаправатаl. Тесаразличнииортогоналнитеимпроекциивър-хуправатасасъщоразлични. Еднорешение:товаеобщиятслучайиточкатаMсеопределяпоначина, посоченвосновнатазадача(фиг. 1), dMIN= P1M + MP2. 2Точкитесаотразличнистранинаправатаl. Еднорешение:точкатаMепресечнататочканаP1P2иl, dMIN= P1P2. 3ТочкитеP1иP2съвпадат, нонележатвърхуправатаl. Еднорешение:точкатаMеортогоналнатапроекциянаточките, dMIN= 2P1M. 4ТочкитеP1иP2саразлични, ноортогоналнитеимпроекциивърхуправатаlсъвпадат. Еднорешение:точкатаMеортогоналнатапроекциянаточките, dMIN= P1M + MP2. 5Еднаотточкитеевърхуправата. Еднорешение: Mсъвпадасточката, коятоевърхуl, dMIN= P1P2. 6Двететочкисавърхуправата. Безброймногорешения: MможедабъдевсякаточкаототсечкатаP1P2, dMIN= P1P2.

Случаите от 2 до 6 са частни и тривиални, но не са безинтересни, когато решението се представя с компютърна програма. Въпреки това, за да не се утежнява програмният код, те няма да бъдат специално разглеждани в програмните решения на някои от задачите.

2. Задачата на Heron в координатна система

Разглеждаме задачата на Heron \(\mathrm{M}=\left(\mathrm{O} x ; \mathrm{P}_{1}, \mathrm{P}_{2}\right)\) в правоъгълна координатна система О \(x y\), в която правата \(l\) сьвпада с оста \(\mathrm{O} x\), а дадените точки \(\mathrm{P}_{1}\left(x_{1}, y_{1}\right)\) и \(\mathrm{P}_{2}\left(x_{2}, y_{2}\right)\), y2), са над оста \(\mathrm{O} x\), т. е. \(x_{1} \neq x_{2}, y_{1} \gt 0, y_{2} \gt 0\).

P2P1M(xM, 0) A2(x2,0) A1(x1,0) yxOl

Фигура 2

Задача 1. Да се пресметнат координатите на минималната точка за \(\mathrm{M}=\left(\mathrm{O} x ; \mathrm{P}_{1}, \mathrm{P}_{2}\right)\)

Решение

Нека ортогоналните проекции на \(\mathrm{P}_{1}\) и \(\mathrm{P}_{2}\) върху \(\mathrm{O} x\) са точките \(\mathrm{A}_{1}\left(x_{1}, 0\right)\) и \(\mathrm{A}_{2}\left(x_{2}, 0\right)\), а \(\mathrm{M}(, 0)\) е търсената минимална точка (фиг. 2). От подобието на триъгълниците \(\mathrm{P}_{1} \mathrm{MA}_{1}\) и \(\mathrm{P}_{2} \mathrm{MA}_{2}\) следва, че \[ \tfrac{P_{1} A_{1}}{P_{2} A_{2}}=\tfrac{M A_{1}}{A_{2} M}=\tfrac{x_{M}-x_{1}}{x_{2}-x_{M}} \]

Така за стойността на координата \(x\) на т. M се получава:

(1) \[ x_{M}=\tfrac{x_{1} P_{2} A_{2}+x_{2} P_{1} A_{1}}{P_{2} A_{2}+P_{1} A_{1}} \]

Този резултат е обобщен в следващата задача.

Задача 2. Нека Oxy е правоъгълна координатна система, \(\mathrm{P}_{1}\left(x_{1}, y_{1}\right)\) и \(\mathrm{P}_{2}\left(x_{2}, y_{2}\right)\) са точки в равнината, \(\mathrm{a} l\) е права, минаваща през т. O и пресичаща \(\mathrm{O} x\) под ъгъл \(\alpha, 0 \leq \alpha \lt \tfrac{\pi}{2}\). Да се пресметнат координатите (\(x_{\mathrm{M}}, y_{\mathrm{M}}\) ) на минималната точка \(\mathrm{M}=\left(l ; \mathrm{P}_{1}, \mathrm{P}_{2}\right)\).

A2(2, 2) αlyxP1(x1, y1) P2(x2, y2) OA1(1, 1) M(xM, yM) B1(10) M1(xM,0) B2(2,0)

Фигура 3

Решение

От съществено значение в тази задача е стойността на ъгъла \(\alpha\) (фиг. 3).

Ако \(\alpha=∢ \mathrm{P}_{1} \mathrm{O} x\), тогава т. \(\mathrm{P}_{1}\) лежи върху правата \(l\) и това е случай 5 от табл. 1.

Ако \(\alpha=∢ \mathrm{P}_{2} \mathrm{O} x\), тогава т. \(\mathrm{P}_{2}\) лежи върху правата \(l\) и това е случай 5 от табл. 1.

Ако \(∢ \mathrm{P}_{1} \mathrm{O} x=∢ \mathrm{P}_{2} \mathrm{O} x\), това е случай 6 от табл. 1.

- Ако правата \(P_{1} P_{2}\) пресича \(l\) под ъгъл \(\tfrac{\pi}{2}\), това съответства на случай 3 или 4 от табл. 1.

По-долу следва решението на задачата в общия случай (случай 1 от табл. 1).

Ортогоналната проекция на произволна точка P върху правата \(l\) с ъглов коефициент \(\operatorname{tg}(\alpha)\) е линейна трансформация, определена с матрицата:

\[ L=\left(\begin{array}{cc} \cos ^{2}(\alpha) & \sin (\alpha) \cos (\alpha) \\ \sin (\alpha) \cos (\alpha) & \sin ^{2}(\alpha) \end{array}\right) \]

Оттук следва, че за координатите на ортогоналната проекция \(\mathrm{A}_{1}\left(x_{1}^{\prime}, y_{1}^{\prime}\right)\) на т. \(P_{1}\) се получава:

\[ A_{1}\binom{x_{1}^{\prime}}{y_{1}^{\prime}}=L \times\binom{ x_{1}}{y_{1}}=\binom{\cos ^{2}(\alpha) x_{1}+\sin (\alpha) \cos (\alpha) y_{1}}{\sin (\alpha) \cos (\alpha) x_{1}+\sin ^{2}(\alpha) y_{1}} \]

Аналогично за координатите на т. \(\mathrm{A}_{2}\) се получава:

\[ A_{2}\binom{x_{2}^{\prime}}{y_{2}^{\prime}}=L \times\binom{ x_{2}}{y_{2}}=\binom{\cos ^{2}(\alpha) x_{2}+\sin (\alpha) \cos (\alpha) y_{2}}{\sin (\alpha) \cos (\alpha) x_{2}+\sin ^{2}(\alpha) y_{2}} \]

От подобието на триъгълниците \(\mathrm{A}_{2} \mathrm{~B}_{2} \mathrm{O}, \mathrm{MM}_{1} \mathrm{O}\) и \(\mathrm{A}_{1} \mathrm{~B}_{1} \mathrm{O}\) може да се запише:

\[ \tfrac{P_{1} A_{1}}{P_{2} A_{2}}=\tfrac{M A_{1}}{A_{2} M}=\tfrac{M_{1} \dot{B_{1}}}{B_{2} M_{1}}=\tfrac{x_{M}-x_{1}^{\prime}}{x_{2}^{\prime}-x_{M}} \]

Оттук за координатите \((x_{\mathrm{M}}, y_{\mathrm{M}})\) на т. M, изразени с координатите \(\left(x_{1}^{\prime}, y_{1}^{\prime}\right)\) и \(\left(x_{2}^{\prime}, y_{2}^{\prime}\right)\) на ортогоналните проекции на т. \(P_{1}\) и т. \(P_{2}\) върху правата \(l\), се получава: (2)\[ x_{M}=\tfrac{x_{1}^{\prime} P_{2} A_{2}+x_{2}^{\prime} P_{1} A_{1}}{P_{2} A_{2}+P_{1} A_{1}} \]

(3) \[ y_{M}=\operatorname{tg}(\alpha) x_{M}=\operatorname{tg}(\alpha) \tfrac{x_{1}^{\prime} P_{2} A_{2}+x_{2}^{\prime} P_{1} A_{1}}{P_{2} A_{2}+P_{1} A_{1}} \]

Може да се отбележи, че специалният избор на правата \(l\) в тази и в следващите задачи не намалява общността на резултатите в тях.

Задача 3. В условията на задача 2 да се визуализира множеството от минимални точки \(\mathrm{M}(\alpha)=\left(l(\alpha) ; \mathrm{P}_{1}, \mathrm{P}_{2}\right)\) за \(0 \leq \alpha \lt \tfrac{\pi}{2}\).

Решение

Нека \(\alpha_{1}=∢ \mathrm{P}_{1} \mathrm{O} x\) и \(\alpha_{2}=∢ \mathrm{P}_{2} \mathrm{O} x\). Ясно е, че ако \(\alpha\) е в интервала \(\left[\min \left(\alpha_{1}, \alpha_{2}\right)\right.\), \(\left.\max \left(\alpha_{1}, \alpha_{2}\right)\right]\), α2)], тогава задачата се свежда до някой от частните случаи 2, 5 или 6 от табл. 1.

Всъщност решението на задачата изисква намиране и визуализиране на ГМТ със свойството на т. M. Координатите на точката M са пресметнати в задача 2. Остава графично да се визуализира множеството на точките M. Това е извършено с програмния код на функцията minPoints, написана на MATLAB.

% P1, P2 –даденитедветочкискоординатитесивпървиквадрант% n –бройнаъглитеalpha, закоитосепресмятатминималните%точкизасъответнатаправаfunction minPoints( P1, P2, n) if P2(1) < P1(1) P = P1; P1 = P2; P2 = P;endx1 = P1(1); y1 = P1(2);x2 = P2(1); y2 = P2(2);alpha1 = atan(y1/x1);alpha2 = atan(y2/x2);alphaMin = min(alpha1, alpha2);alphaMax = max(alpha1, alpha2);alpha = 0.0 : pi/n : alphaMin;drawM(alpha);hold onx = x1:0.01:x2;y = y1 + (y2 - y1)/(x2 - x1)*(x - x1);plot(x, y);alpha = alphaMax : pi/n : pi/2 - eps;drawM(alpha);hold offfunction drawM(alpha) % (x1p, y1p) -координатинапроекцията%нат. P1върхуправатаx1p = x1*cos(alpha).^2 + y1*sin(alpha).*cos(alpha);y1p = x1*sin(alpha).*cos(alpha) + y1*sin(alpha).^2;% (x2p, y2p) -координатинапроекцията%нат. P2върхуправатаx2p = x2*cos(alpha).^2 + y2*sin(alpha).*cos(alpha);y2p = x2*sin(alpha).*cos(alpha) + y2*sin(alpha).^2;%ПресмятаненаразстояниятаотP1иP2до%ортогоналнитеимпроекцииимвърхуправата
d1 = sqrt((x1 - x1p).^2 + (y1 - y1p).^2);d2 = sqrt((x2 - x2p).^2 + (y2 - y2p).^2);xM = (x1p.*d2 + x2p.*d1)./(d2 + d1);yM = tan(alpha).*xM;plot(xM, yM, ‘r+') end % End of drawMend % End of minPoints

Резултатите от четири изпълнения на функцията minPoints са показани на фигури 4а, 4б, 4в и 4г. Посочени са и координатите на точките \(\mathrm{P}_{1}\) и \(\mathrm{P}_{2}\).

P1 = [89, 30]; P2 = [35, 87];minPoints( P1, P2, 50);

Фигура 4а

P1 = [40, 30]; P2 = [35, 87];minPoints( P1, P2, 50);

Фигура 4б

P1 = [90, 60]; P2 = [40, 60]; minPoints(P1, P2, 50);

Фигура 4в

P1 = [90, 80]; P2 = [1, 45];minPoints( P1, P2, 50);

Фигура 4г

3. Задачи от тип Heron

Задачата на Heron е прекрасен пример за оптимизационна геометрична задача, подходяща за изучаване още в училище. Задача, в която се търси точка от дадена права или в общия случай от изпъкнала крива, за която сумата от разстоянията 3 до няколко (две или повече) други точки е минимална, представлява обобщение на задачата на Heron и затова тук ще бъде наричана задача от тип Heron.

Следват примери на три задачи от тип Heron.

ОПСОПСОПСОПСОПСЦПС

Фигура 5

Задача 5. Структурата и организацията на пощенските услуги в една държава е следната (фиг.5). Територията на държавата е разделена на \(n(n \gt 2)\) отделни области. В рамките на всяка област има изградена областна пощенска станция (ОПС). Пощенските пратки (писма и колети) се събират и се разнасят до жителите на една и съща област чрез специализирани пощенски автомобили. Ако една пощенска пратка е адресирана до лице от друго селище в същата или друга област, тогава тя се изпраща до съответната ОПС. Областните станции комуникират помежду си чрез централна пощенска станция (ЦПС, т. нар. и хъб), в която ежедневно чрез хеликоптери се пренасят пощенските пратки от и до съответните ОПС, за които адресът на подателя и получателя са от различни области на държавата или евентуално от друга държава. За да се оптимизират разходите по транспортирането на пощенските пратки между ОПЦ и ЦПЦ, е необходимо да се избере място за хъб непосредствено до определена магистрала, така че сумата от разстоянията от всички ОПС до ЦПС да е минимална. Да се пресметнат координатите на новата ЦПС, ако се познават координатите на всяка ОПС и се приеме, че магистралата се описва с линейна функция.

Задача 6. В прав участък от линията на едно метро трябва да се проектира метростанция, която да облужва жителите на квартал, живеещи в \(n\) жилищни блока. Те са разположени от двете страни на линията в рамките на правоъгълна площ с дадени размери. Улиците, по които гражданите могат да се придвижват до линията на метрото, са успоредни и вертикални на линията на метрото. Трябва да се определи точката от линията на метрото, в която да се проектира и построи метростанцията, така че сумата от разстоянията, които живеещите в тези блокове ще изминават до станцията, да е минимална. За всеки блок се предполага, че е представен с координатите на една точка и се знае броят на живеещите в него.

T1, c1T2, c2T3, c3T4, c4T5, c5MA5A2A4A3A1

Фигура 6

Задача 7. Много от жителите на \(n\) селища \(\mathrm{T}_{1}, \mathrm{~T}_{2}, \ldots, \mathrm{~T}_{n}\) работят в град, до който се достига по магистрала. Най-краткият път от селище \(\mathrm{T}_{i}(i=1,2, \ldots, n)\) излиза на магистралата в точка \(\mathrm{A}_{i}\), а разстоянието \(\mathrm{T}_{i} \mathrm{~A}_{i}\) е \(k_{i}\) километра (фиг. 6). За да се намалят транспортните разходи и да се намали трафикът на автомобили по магистралата, една компания иска да инвестира в построяването на паркинг непосредствено до магистралата.

Всеки абонат на паркинга може да паркира колата си, с която идва от дома си, и да продължи с автобус до града или да се присъедини с други абонати, за да формират група за придвижване до града само с един автомобил. Да се определи точката M от магистралата, на която да се построи паркингът, така че сумарното разстояние от селищата до паркинга, което се изминава от абонатите, да бъде минимално. Предполага се, че броят за абонатите на паркинга от селище \(\mathrm{T}_{i}\) е \(\mathrm{c}_{i}, i=1,2, \ldots, n\).

Решенията на тези примерни задачи имат практическа стойност, но за тях не е лесно да се посочи точно решение по подобие на решението на задачата на Heron. Ето защо в подобни случаи полезни могат да бъдат приближени решения, които да бъдат напълно задоволителни за реални практически нужди.

4. Един експеримент: приближено решение на задачата на Heron

По-долу е представен експеримент, при който пресмятането на минималната точка и на съответното разстояние в задачата на Heron ще се извърши по два начина.

Задача 8. Разглежда се задачата \(\mathrm{M}=\left(\mathrm{O} x ; \mathrm{P}_{1}, \mathrm{P}_{2}\right)\), в която точките \(\mathrm{P}_{1}, \mathrm{P}_{2}\) са определени с координатите си \(\left(x_{1}, y_{1}\right)\) и \(\left(x_{2}, y_{2}\right)\). Да се напише програма за приближено пресмятане на минималната точка и съответното минимално разстояние, като резултатът се сравни със стойностите, получени от точния метод, представен в задача 1.

Решение

Приемаме разглеждането на тази задача като експеримент. С него ще може да се сравнят точното и приближеното решение за конкретни точки, чиито координати са случайни числа. Експериментът се базира на два съществени факта от решението на основната задача. Знае се, че задачата има решение и то е единствено.

Реализацията на експеримента е извършена с програмния модул Heron, написан на С++. Във функцията approx се генерира редица от равноотдалечени точки \(\mathrm{T}_{i}\left(t_{i}, 0\right)\) с дадена стъпка \(h, t_{0}=\min \left(x_{1}, x_{2}\right) \leq t_{i} \leq \max \left(x_{1}, x_{2}\right), t_{i}=t_{i-1}+h, i=1,2, \ldots\) За всяка от точките \(\mathrm{T}_{i}\) се пресмятат разстоянията є до дадените точки \(\mathrm{P}_{1}\) и \(\mathrm{P}_{2}\) и като резултат функцията връща минималната точка и съответното разстояние.

Програмата е структурирана като програмен модул в три файла: заглавен файл, файл за реализация на функциите и главна функция, с която е проведен експериментът. Преобразуването на модула в C++ клас е тривиално, но това не е направено, за да не се усложнява излишно програмният код.

За по-компактен запис на кода в заглавния файл Heron.hточката е дефинирана като структура (Point) със съответен конструктор и функция, отпечатваща текущата стойност на точка. Функциите project и distPP са помощни за функцията approx. С първата се пресмята ортогоналната проекция на точка върху права, минаваща през началото на кординатната система и сключваща даден ъгъл с оста Ox. Втората функция пресмята разстоянието между две точки. С функцията heron се пресмятат стойностите на минималната точка съгласно (2) и (3) от задача 2.

//Файл: Heron.h#ifndef HERON_H#dene HERON_H#include <iostream>#include <iomanip>using namespace std;const double PI = 3.1415926;struct Point{double x, y;Point(double x1=0.0, double y1=0.0) {x = x1;y = y1;}void print(int n) {cout <<xed << setprecision(n);cout << “x = “ << setw(10) << x<< “, y = “ << setw(10) << y << endl;}};
double approxL(Point p1, Point p2, double h, Point& p);Point project(Point p, double alpha);Point heron(Point p1, Point p2, double alpha, double& minD);double distPP(Point p1, Point p2);double approxC(Point p1, Point p2, double r, double h, Point& p);bool checkH(Point p1, Point p2, Point p, double eps);#endifПо-долуследватдефинициитенафункциите, деклариранивзаглавнияфайл. #include “Heron.h”//ФункциятапресмятаминималнататочкаpM//иминималноторазстояние(minD) сприближение. //Праватаминавапрезначалотонакоординатнатасистема. // p1, p2 -точки, закоитосепресмятаминималноторазстояние. // h -разстояниемеждудвесъседниточкиотредицата. //Функциятавръща:// pM -точкаотOx, закоятоедостигнатминимумът. // minD –стойностнапресметнатотоминималноразстояние. double approxL(Point p1, Point p2, double h, Point& pM) {double minD = DBL_MAX;double mD;double a = p1.x, b = p2.x;if (a > b) swap(a, b);double x = a;while (x <= b) {Point p(x, 0.0);if (mD < minD) {minD = mD;pM = p;}x = x + h;}return minD;}
//Фукциятапресмятакоординатитенаортогоналната//проекциянаточкаpвърхуправа, минаващапрезначалото//накоординатнатасистемаисключващаъгълalphaсостаOx. //Функциятавръщаточка, коятоеортогоналнапроекциянаp. Point project(Point p, double alpha) {double x, y;x = p.x*pow(cos(alpha), 2) + p.y*sin(alpha)*cos(alpha);y = p.x*sin(alpha)*cos(alpha) + p.y*pow(sin(alpha), 2);return Point(x, y);}//ФункциятареализираалгоритъманаHeronзапресмятанена//минималноторазстояниемеждудветочкиp1иp2додадена//точкаMотправа, минаващапрезначалотонакоординатната//системаисключващаъгълalphaсостаOx. //ФункциятавръщакоординатитенаминималнататочкаM(xM, yM), //кактоистойносттанасъответноторазстояние(minD). Point heron(Point p1, Point p2, double alpha, double& minD) {minD = DBL_MAX;Point p1Pr = project(p1, alpha);Point p2Pr = project(p2, alpha);double d1 = distPP(p1, p1Pr);double d2 = distPP(p2, p2Pr);double d = d1 + d2;double xМ= (d1*p2Pr.x + d2*p1Pr.x)/d;double yМ= (d1*p2Pr.y + d2*p1Pr.y)/d;Point p(xМ, yМ);minD = distPP(p1, p) + distPP(p, p2);return p;}//Функциятапресмятаразстояниетомеждудветочкиp1иp2врав-нината. double distPP(Point p1, Point p2)
{return sqrt(pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2));}

Същинският експеримент се извършва в главната функция на програмата. В нея за всяка стъпка \(h,\left(h=10^{-s}, \mathrm{~s}=0,1,2, \ldots, 7\right)\) двете точки се генерират десет пъти със случайни координати (\(x, y\) ) в интервалите: \(1 \leq\) \(x \leq 100\) и \(0 \leq y \leq 50\). За всяка двойка точки се пресмятат приближените и точните стойности на минималната точка и на съответното минимално разстояние.

//Файл: HeronExperiment.cpp//Експеримент, формулиранвзадача8#include <iostream>#include “Heron.h”#include <cstdlib>#include <ctime>using namespace std;int main() {srand(unsigned int (time(0)));//Стартираненагенератора//напсевдослучайничислаdouble a = 1.0, b = 100.0;//ИнтервализаXdouble c = 0.0, d = 50.0;//ИнтервализаYdouble errM_Total, errD_Total // errM, err_Total -грешкав//координататаXdouble errM, errD;//errD, err_Total-грешкав//разстояниетоdouble h = 1.0;//СтъпкапоостаXtime_t tb, te;//ПроменливизаизмерваненавреметоPoint pM, p;int n = 10;cout << scientic << setprecision(16);for (int st=1; st<8; st++) {errM_Total = 0.0, errD_Total = 0.0;cout << left << setw(26) << “Errors for min point”<< left << setw(26) << “Errors for min distance” << endl;
for (int i=0; i<n; i++) {//Генериратсепсевдослучайникоординативинтервалите:double p1x = (b-a)*rand()/RAND_MAX + a;// (a, b) double p1y = (d-c)*rand()/RAND_MAX + c;// (c, d) double p2x = (b-a)*rand()/RAND_MAX + a;// (a, b) double p2y = (d-c)*rand()/RAND_MAX + c;// (c, d) Point p1(p1x,p1y), p2(p2x, p2y);// p1, p2 -дветочкиdoubleminD1;//минималноторазстояниеdouble alpha = 0.0;//ъгълнаправата//спрямоостаOxpM = heron(p1, p2, alpha, minD1);//Експеримент:Приближено(итеративно) пресмятанеtb = time(0);//Началонаизпълнениетоdouble minD2 = approxL(p1, p2, h, p);//Приближен(итеративен) методte = time(0);//КрайнаизпълнениетоerrM = fabs(pM.x - p.x);//ГрешкавпресмятанетонакоординатаerrD = fabs(minD1 - minD2);//Грешкавпресмятанетонаразстояниетоout << setw(26) << errM << setw(26) << errD << endl;errM_Total += errM;errD_Total += errD;}cout << “Step = “ << h << endl;//СтъпкаhпоXdouble elapsed = ((double) (te - tb)) / CLOCKS_PER_SEC;cout << “Execution time for \'approx\' = “ << elapsed << endl;cout << “Average error for minPoint = “ << errM_Total/n << endl;cout << “Average error for minDist = “ << errD_Total/n << endl << endl;h = h/10.0;//Новастъпка}return 0;}

По-долу са приведени резултатите от изпълнението на програмата само за стъпки \(h=10^{0}, 10^{-4}\) и \(10^{-6}\). Отпечатани са абсолютните и средните грешки от пресмятанията, както и времето за изпълнение на функцията за съответната стъпка (табл. 2).

Таблица 2. Извадка от резултатите на експеримента от задача 8

Errors for min pointErrors for min distance2.8866672572007701e-003 1.4530472469687084e-0071.1274219156476306e-003 1.4028344708094664e-0083.8754061789127547e-002 3.1160067095470367e-0051.1202230856799389e-002 9.8888237971550552e-0064.6601264227348338e-003 1.1387409415419825e-0074.9885086629684494e-002 2.8644056065729728e-0052.7421482087259363e-002 1.7195142277159903e-0051.7456261090394776e-002 8.7953738727719610e-0062.1044828013415895e-002 7.8731189887548680e-0064.1085869993722213e-002 5.6820032398263720e-005Step = 1.0000000000000001e-001Execution time for ‘approx' = 0.0000000000000000e+000Average error for minPoint = 2.1552403605598690e-002Average error for minDist = 1.6064982165886477e-005Errors for min pointErrors for min distance8.4881643072520774e-005 1.1924683462893881e-0104.5223040986286378e-004 1.1749634154512023e-0083.0460122957975955e-004 3.4031238271836628e-0082.0810234004287054e-004 6.1453420130419545e-0101.2876654088245232e-004 3.6835956507275114e-0101.7103966857234809e-004 8.9126217517332407e-0104.0696975851517436e-004 6.8856564894304029e-0094.0098363976426299e-004 3.9265586337933200e-0092.7341373852252104e-004 2.0927970467710111e-0093.0623992627454300e-004 2.9986466643094900e-009Step = 1.0000000000000000e-003Execution time for ‘approx' = 0.0000000000000000e+000Average error for minPoint = 2.7372288950893163e-004Average error for minDist = 6.3677934036832085e-009Errors for min pointErrors for min distance4.2637637420739338e-008 0.0000000000000000e+0003.4051080888275465e-007 0.0000000000000000e+0002.9652249189382474e-007 0.0000000000000000e+0004.0785594990211393e-007 1.4210854715202004e-0146.8620099824556746e-008 0.0000000000000000e+0006.1577844689963968e-007 0.0000000000000000e+0004.5829490957771668e-007 6.3238303482648917e-0132.7479455866341596e-007 7.1054273576010019e-0151.9542123652627197e-007 0.0000000000000000e+0002.1990502574453785e-007 4.2632564145606011e-014Step = 1.0000000000000002e-006Execution time for ‘approx' = 1.7999999999999999e-002Average error for minPoint = 2.9203411653355717e-007Average error for minDist = 6.9633188104489823e-014

Вижда се, че резултатите, получени от итеративния метод за приближено пресмятане на минималната точка и съответното разстояние, са много добри. Това дава основание функцията approx да се обобщи за \(n\) точки. Нейният прототип ще съдържа масив от \(n\) точки:

double approx(Point pts[], int n, double h, Point& p)

Самата дефиниция на функцията approx в по-голямата си част ще остане същата. Единствено операторът mD = distPP(p1, Point(t, 0.0)) + distPP(p2, Point(t, 0.0));

трябва да се замени с оператора:

mD = sumDist(pts, n, p), където параметърът T съответства на текущата точка от правата, която е кадидат за минималната точка. Следва кодът на функцията sumDist:

double sumDist(Point pts[], int n, Point p) {double d = 0.0;for (int i = 0; i<n; i++) d = d + distPP(pts[i], p);return d;}

Положителният резултат от този експеримент е добър повод да се пристъпи към втори експеримент, в който правата \(l\) ще бъде заменена с изпъкнала крива и по-конкретно с дъга от окръжност.

5. Втори експеримент

Разглеждаме задачата от тип Heron \(\mathrm{M}=\left(\mathrm{k} ; \mathrm{P}_{1}, \mathrm{P}_{2}\right)\), в която k е дъга от окръжност. Целта е експериментално да се провери една хипотеза, чиято идея се основава на метода на Heron, а именно, че ъгълите между \(\mathrm{P}_{1} \mathrm{M}\) и \(\mathrm{P}_{2} \mathrm{M}\) с допирателната на окръжността k в т. M са равни (физичен закон за отражението). За тази цел разглеждаме следната задача.

1P2P1kOyxM2L2L1N

Фигура 7

Задача 9. Дадена е окръжност с радиус \(r\) и център в началото на правоъгълна координатна система, \(\mathrm{k}(\mathrm{O}, r)\). Дадени са и две точки в първи квадрант, определени с координатите си , \(\mathrm{P}_{1}\left(x_{1}, y_{1}\right)\) и \(\mathrm{P}_{2}\left(x_{2}, y_{2}\right)\).

a) Да се намери точка \(\mathrm{M}\left(x_{M}, y_{M}\right)\) от дъгата на окръжността k в първи квадрант (\(x \gt 0\), \(y \gt 0\) ), за която сборът от разстоянията от M до \(\mathrm{P}_{1}\) и \(\mathrm{P}_{2}\) да е минимален (фиг. 7).

б) За точката M, определена в а), да се провери дали \(∢ \mathrm{P}_{1} \mathrm{ML}_{1}\) е равен на \(∢ \mathrm{P}_{2} \mathrm{ML}_{2}\) в случая, когато правата \(\mathrm{L}_{1} \mathrm{~L}_{2}\) е допирателна към окръжността k в т. M.

В тази задача ролята на правата \(l\) от предишните задачи е поета от допирателната \(L_{1} L_{2}\) към окръжността в точка M (фиг. 7). Но тъй като \(\mathrm{OM} \perp \mathrm{L}_{1} \mathrm{~L}_{2}\), за да се докаже, че \(\nless \mathrm{P}_{1} \mathrm{ML}_{1}=∢ \mathrm{P}_{2} \mathrm{ML}_{2}\), е достатъчно да се докаже, че . \(∢ \varphi_{1}=∢ \varphi_{2}\)

В зависимост от разположението на точките спрямо окръжността могат да се разгледат множество частни случаи (табл. 3).

Таблица 3. Възможни случаи на взаимно разположение на точките и окръжността

РазположениенаточкитеP1иP2РазположениенаминималнататочкаМ1ТочкитеP1иP2саизвънкръга, праватаP1P2пресичаокръжност-тавдветочкиM1иM2. Дверешения: M = M1илиM = M2, dMIN = |P1P2|. 2P1иP2савърхуокръжността. Дверешения: M = P1илиM = P2, dMIN = |P1P2|. 3ПраватаP1P2едопирателнакъмокръжносттавточкатаM. Еднорешение: Mетърсенатаминималнаточка, dMIN= |P1P2|. 4Еднаотточкитеевърхуокръж-ността, адругатаевътреилиизвънкръга. Еднорешение: Mеточката, коятоевърхуокръжността, dMIN= |P1P2|. 5Еднаотточкитеевътревкръга, адругатаеизвънкръга. Еднорешение: MепресечнататочканаP1P2сокръжността, dMIN= |P1P2|. 6ДвететочкиP1иP2съвпадат. Еднорешение:минималнататочкаМепресечнататочканаокръжносттаиправатаOP1. 7ИдвететочкиP1иP2едновре-менносаизвънкръгаиправатаP1P2непресичаокръжността. Общслучай(хипотеза):минималнататочкаМеточкаотокръжността, закоятоправатаOMеъглополовящанаъгълаP1MP2 (≮ϕ1=≮ϕ2), фиг. 7. 8ИдвететочкиP1иP2едновре-менносавътрекръга. Общслучай:тозислучайеаналогиченнаслучай6.

На фиг. 7 е представен общият случай 7, който се има предвид при решението на задачата. Ще бъде използван опитът от задача 8 и координатите на минималната точка ще се пресметнат с приближение. Това се реализира с функцията approxK. Тя е твърде сходна с функцията approxL, но има един допълнителен параметър \(r\)– радиус на окръжността.

//ФункциятапресмятаM = (k, p1, p2), // M -точкаотокръжносттаk(O, r) //сцентървначалотонакоординатнатасистема, //закоято: 0 < x(k) < max(p1.x, p2.x),
// k = 1, 2, ... eредицаотравноотстоящиточки//съсстъпкаh. // p1, p2 -точки, закоитосепресмятаминималноторазстояние. //Функциятавръща:// pM -точкаотOx, закоятоедостигнатминимумът. // minD –стойностнапресметнатотоминималноразстояние. double approxC(Point p1, Point p2, double r, double h, Point& pM) {Point p;double b = min(r, max(p1.x, p2.x));double mD;double minD = DBL_MAX;double x = b;while (x >= 0) {p = Point(x, sqrt(r*r - x*x));mD = distPP(p1, p) + distPP(p, p2);if (mD < minD) {minD = mD;pM = p;}x = x - h;}return minD;}

И тази функция, както и функцията approxL, може да се обобщи и броят на точките да е целочислен параметър \(n, n \gt 2\), а операторът

mD = distPP(p1, p) + distPP(p, p2) ;

трябва да се замени с обръщение към функцията sumDist:

mD = sumDist(pts, n, p)

С функцията checkH се проверява дали ъглите са равни. Точността, с която се извършва проверката (сравняването на реалните числа), е определена от параметъра eps.

Алгоритъмът, заложен в кода на функцията checkH, използва зависимостите между ъглите на две пресичащи се прави с ъглови коефициенти съответно m1 и m2. Тогава за ъгъла между тях, изразен чрез ъглите θ1 и θ2, се получава:

\(\begin{aligned} & \theta=\theta_{2}-\theta_{1} \text { или } \theta=\pi-\left(\theta_{2}-\theta_{1}\right) . \\ & \operatorname{tg}(\theta)=\operatorname{tg}\left(\theta_{2}-\theta_{1}\right)=\cfrac{\operatorname{tg}\left(\theta_{2}\right)-\operatorname{tg}\left(\theta_{1}\right)}{1+\operatorname{tg}\left(\theta_{2}\right) \operatorname{tg}\left(\theta_{1}\right)}=\cfrac{m_{2}-m_{1}}{1+m_{1} m_{2}} \end{aligned}\)

В нашия случай трябва да се пресметнат ъгловите коефициенти \(m, m_{1}\) и \(m_{2}\) на правите \(\mathrm{OM}, \mathrm{P}_{1}\) М и \(\mathrm{P}_{2}\) М и съответно те са:

\(m=\cfrac{y_{M}}{x_{M}}, \quad m_{1}=\cfrac{y_{M}-y_{1}}{x_{M}-x_{1}}, \quad m_{2}=\cfrac{y_{M}-y_{2}}{x_{M}-x_{2}} \)

Следва кодът на функцията.

//ФункциятапроверявадаливточкатаMотокръжносттасрадиусr, в//коятоизразътp1M + Mp2достигаmax, ъгълътмеждуp1и//допирателнатавт. Меравеннаъгъламеждуp2идопирателнатавт. М//Точността, скоятосеправипроверката, сеопределяотпараметъраeps. //Стъпката, скоятосетърситочкатаM, еопределенаотпараметъраh. bool checkH(Point p1, Point p2, Point pM, double eps) {double sM = pM.y/pM.x;double s1 = (pM.y - p1.y)/(pM.x -p1.x);double s2 = (pM.y - p2.y)/(pM.x -p2.x);double tg1 = (sM - s1)/(1 + sM*s1);double tg2 = (s2 - sM)/(1 + sM*s2);return (tg2 - tg1) <= eps;}

По-долу следва главната функция на програмата.

//Експеримент, формулиранвзадача9#include <iostream>#include “Heron.h”#include <cstdlib>#include <ctime>using namespace std;int main() {srand(unsigned int (time(0)));//Стартираненагенератора//напсевдослучайничислаdouble a1 = 1.0, a2 = 101.0;// (a1, a2) -интервал//заабсцисатаdouble r = 83.47;//Радиуснаокръжността:// 33.27,7.47, 83.47
double b1 = sqrt(r*r - a1*a1);// (b1, b2) -интервал//заординататаdouble b2 = 100.0;//Генериратсепсевдослучайникоординативинтервалите:double p1x = (a2 - a1)*rand()/RAND_MAX + a1;// (a1, a2) double p1y = (b2 - b1)*rand()/RAND_MAX + b1;// (b1, b2) double p2x = (a2 - a1)*rand()/RAND_MAX + a1;// (a1, a2) double p2y = (b2 - b1)*rand()/RAND_MAX + b1;// (b1, b2) Point p1(p1x,p1y), p2(p2x, p2y);// p1, p2 -//дветочкиPoint pM;//Минималнаточкаdouble minD;//Минималноразстояниеbool test;//Резултатоттеста://1-успешен, 0 -неуспешенdouble h, eps; //Стъпка(h), точностзатеста(eps) cout<< “radius = “ << r << endl;cout<< “P1: “; p1.print(6);cout<< “P2: “; p2.print(6);cout<<“\nstep”<<setw(8) <<“eps”<<setw(11) <<“pM.x”<< setw(23) <<“pM.y” << setw(31) << “min distance” << setw(14) << “test” << endl;//Експеримент:Приближено(итеративно) пресмятанеfor (double s=1; s<7; s++) {h = pow(10.0, -s);for (double e=1; e<=s; e++) {eps = pow(10.0, -e);//Пресмятаненаminточкаиразстояниеdouble minD = approxC(p1, p2, r, h, pM);test = checkH(p1, p2, pM, eps);//Тестваненахипотезатаcout << setprecision(1) << setw(8) << h << setw(9) << eps;cout << scientic << setprecision(14);cout << setw(23) << pM.x << setw(23) << pM.y<< setw(23) << minD << setw(2) << test << endl;
}}return 0;}

Програмата е изпълнена многократно и резултатите на три от тях са дадени в табл. 4.

Таблица 4. Извадка от резултатите на експеримента от задача 9

radius = 7.47P1: x = 63.147893, y = 75.745046P2: x = 12.319315, y = 60.575455stepepspM.xpM.ymin distancetest0.10.1 3.17000000000001e+000 6.76402247187278e+000 1.45993377523788e+002 11.0e-002 1.0e-001 3.19000000000009e+000 6.75461323837268e+000 1.45993285530871e+002 11.0e-002 1.0e-002 3.19000000000009e+000 6.75461323837268e+000 1.45993285530871e+002 11.0e-003 1.0e-001 3.19299999999893e+000 6.75319561393025e+000 1.45993283736262e+002 11.0e-003 1.0e-002 3.19299999999893e+000 6.75319561393025e+000 1.45993283736262e+002 11.0e-003 1.0e-003 3.19299999999893e+000 6.75319561393025e+000 1.45993283736262e+002 11.0e-004 1.0e-001 3.19320000000638e+000 6.75310104766390e+000 1.45993283728143e+002 11.0e-004 1.0e-002 3.19320000000638e+000 6.75310104766390e+000 1.45993283728143e+002 11.0e-004 1.0e-003 3.19320000000638e+000 6.75310104766390e+000 1.45993283728143e+002 11.0e-004 1.0e-004 3.19320000000638e+000 6.75310104766390e+000 1.45993283728143e+002 11.0e-005 1.0e-001 3.19322000012608e+000 6.75309159058240e+000 1.45993283728098e+002 11.0e-005 1.0e-002 3.19322000012608e+000 6.75309159058240e+000 1.45993283728098e+002 11.0e-005 1.0e-003 3.19322000012608e+000 6.75309159058240e+000 1.45993283728098e+002 11.0e-005 1.0e-004 3.19322000012608e+000 6.75309159058240e+000 1.45993283728098e+002 11.0e-005 1.0e-005 3.19322000012608e+000 6.75309159058240e+000 1.45993283728098e+002 11.0e-006 1.0e-001 3.19321599940220e+000 6.75309348233547e+000 1.45993283728096e+002 11.0e-006 1.0e-002 3.19321599940220e+000 6.75309348233547e+000 1.45993283728096e+002 11.0e-006 1.0e-003 3.19321599940220e+000 6.75309348233547e+000 1.45993283728096e+002 11.0e-006 1.0e-004 3.19321599940220e+000 6.75309348233547e+000 1.45993283728096e+002 11.0e-006 1.0e-005 3.19321599940220e+000 6.75309348233547e+000 1.45993283728096e+002 11.0e-006 1.0e-006 3.19321599940220e+000 6.75309348233547e+000 1.45993283728096e+002 1radius = 83.47P1: x = 64.591418, y = 88.429298P2: x = 17.302988, y = 84.382984stepepspM.xpM.ymin distancetest0.10.1 2.16914181951348e+001 8.06022535459386e+001 4.94006015808695e+001 11.0e-002 1.0e-001 2.17314181951398e+001 8.05914782295743e+001 4.94005540789146e+001 11.0e-002 1.0e-002 2.17314181951398e+001 8.05914782295743e+001 4.94005540789146e+001 11.0e-003 1.0e-001 2.17354181951946e+001 8.05903995267427e+001 4.94005537167977e+001 11.0e-003 1.0e-002 2.17354181951946e+001 8.05903995267427e+001 4.94005537167977e+001 11.0e-003 1.0e-003 2.17354181951946e+001 8.05903995267427e+001 4.94005537167977e+001 1
1.0e-004 1.0e-001 2.17352181940773e+001 8.05904534672429e+001 4.94005537160548e+001 11.0e-004 1.0e-002 2.17352181940773e+001 8.05904534672429e+001 4.94005537160548e+001 11.0e-004 1.0e-003 2.17352181940773e+001 8.05904534672429e+001 4.94005537160548e+001 11.0e-004 1.0e-004 2.17352181940773e+001 8.05904534672429e+001 4.94005537160548e+001 11.0e-005 1.0e-001 2.17352481851790e+001 8.05904453786469e+001 4.94005537160398e+001 11.0e-005 1.0e-002 2.17352481851790e+001 8.05904453786469e+001 4.94005537160398e+001 11.0e-005 1.0e-003 2.17352481851790e+001 8.05904453786469e+001 4.94005537160398e+001 11.0e-005 1.0e-004 2.17352481851790e+001 8.05904453786469e+001 4.94005537160398e+001 11.0e-005 1.0e-005 2.17352481851790e+001 8.05904453786469e+001 4.94005537160398e+001 11.0e-006 1.0e-001 2.17352432668690e+001 8.05904467051153e+001 4.94005537160392e+001 11.0e-006 1.0e-002 2.17352432668690e+001 8.05904467051153e+001 4.94005537160392e+001 11.0e-006 1.0e-003 2.17352432668690e+001 8.05904467051153e+001 4.94005537160392e+001 11.0e-006 1.0e-004 2.17352432668690e+001 8.05904467051153e+001 4.94005537160392e+001 11.0e-006 1.0e-005 2.17352432668690e+001 8.05904467051153e+001 4.94005537160392e+001 11.0e-006 1.0e-006 2.17352432668690e+001 8.05904467051153e+001 4.94005537160392e+001 1radius = 33.27P1: x = 83.276925, y = 59.081570P2: x = 12.496170, y = 91.216633stepepspM.xpM.ymin distancetest0.10.1 1.69699999999998e+001 2.86166385167792e+001 1.35730337958670e+002 11.0e-002 1.0e-001 1.69499999999979e+001 2.86284893069836e+001 1.35730322955179e+002 11.0e-002 1.0e-002 1.69499999999979e+001 2.86284893069836e+001 1.35730322955179e+002 11.0e-003 1.0e-001 1.69519999999846e+001 2.86273050775046e+001 1.35730322766513e+002 11.0e-003 1.0e-002 1.69519999999846e+001 2.86273050775046e+001 1.35730322766513e+002 11.0e-003 1.0e-003 1.69519999999846e+001 2.86273050775046e+001 1.35730322766513e+002 11.0e-004 1.0e-001 1.69519999999929e+001 2.86273050774997e+001 1.35730322766513e+002 11.0e-004 1.0e-002 1.69519999999929e+001 2.86273050774997e+001 1.35730322766513e+002 11.0e-004 1.0e-003 1.69519999999929e+001 2.86273050774997e+001 1.35730322766513e+002 11.0e-004 1.0e-004 1.69519999999929e+001 2.86273050774997e+001 1.35730322766513e+002 11.0e-005 1.0e-001 1.69520100001666e+001 2.86272991557753e+001 1.35730322766513e+002 11.0e-005 1.0e-002 1.69520100001666e+001 2.86272991557753e+001 1.35730322766513e+002 11.0e-005 1.0e-003 1.69520100001666e+001 2.86272991557753e+001 1.35730322766513e+002 11.0e-005 1.0e-004 1.69520100001666e+001 2.86272991557753e+001 1.35730322766513e+002 11.0e-005 1.0e-005 1.69520100001666e+001 2.86272991557753e+001 1.35730322766513e+002 11.0e-006 1.0e-001 1.69520059877378e+001 2.86273015317844e+001 1.35730322766512e+002 11.0e-006 1.0e-002 1.69520059877378e+001 2.86273015317844e+001 1.35730322766512e+002 11.0e-006 1.0e-003 1.69520059877378e+001 2.86273015317844e+001 1.35730322766512e+002 11.0e-006 1.0e-004 1.69520059877378e+001 2.86273015317844e+001 1.35730322766512e+002 11.0e-006 1.0e-005 1.69520059877378e+001 2.86273015317844e+001 1.35730322766512e+002 11.0e-006 1.0e-006 1.69520059877378e+001 2.86273015317844e+001 1.35730322766512e+002 1

Дотук всичко беше само експеримент върху една хипотеза. Резултатът от експеримента е отличен. Сега е ред хипотезата да се преформулира като теорема и да се докаже или... опровергае.

REFERENCES

Hadamard, J. (1962). Lectii de geometrie elementara. Geometrie plana, Editia a doua. Traducere din limba franceza completata cu resolvarile problemelor. Bucuresti: Editura tehnica.

Година LIX, 2016/2 Архив

стр. 121 - 142 Изтегли PDF