.n Исследование неявных функций двух переменных
.a 
.d 33333
.s
* Расширение "Исследование неявных функций двух переменных"
Расширение предназначено для исследования неявных функций двух переменных. Оно позволяет: 
- табулировать значения аргументов функции f(x,y)=0, заданной аналитическим выражением зависимости связи двух переменных;
- вывести значения пар x,y, обеспечивающих выполнение условия f(x,y)=0;
- при установленном расширении grafik.php позволяет построить график исследуемой функции. 

Для возможности использования расширения в системе должны быть установлены файлы x_f1.api, x_f1.php, x_f1.txt, x_f2.api, x_f2.php, которые не входят в базовую комплектацию. 

**Функция tnv() - табулирование неявной функции
Функция tnv(formula,vx,vy[,tv]) возвращает векторы пар значений rx, ry при которых выражение formula равно нулю с точностью до tv. Параметрами функции являются:
- formula - выражение, зависящее от переменных, обозначаемых как x и y; 
- vx - массив значений аргумента x, для каждого из которых вычисляются последовательности значений y,  обеспечивающих равенство нулю выражения formula;
- vy - массив начальных значений аргумента y;
- tv - точность приближения выражения formula к нулю. По умолчанию tv=0.0001

Выражение formula должно описывать некоторые вычисления, зависящие от переменных, обозначаемых буквами х и y. Имена передаваемых массивов значений аргументов vx,vy должно отличаться от обозначений х и y. Более того, при использовании в статье функции tnv в ней не должны использоваться другие значимые переменнные, имеющие обозначение х и y, поскольку в результате действий функции они будут изменены.  

Алгоритм работы функции состоит в следующем: 
- элементы векторов vx и vy упорядочиваются по возрастанию;
- перебираются значения вектора vx;
- для каждого из значений вектора vx перебираются все значения вектора vy;
- каждой образованной пары (x,y) вычисляется значение выражения formula;
- если для последовательных пар y1 и y2 значения выражений formula(x,y1) и formula(x,y2) имеют разный знак, то на отрезке [y1,y2] методом пополамного деления выполняется уточнения значения y, котором абсолютное значение выражения formula отличается от нуля не более, чем на величину tv - abs(formula(x,y)) < tv;
- полученная пара значений запоминается и вычисления производятся, начиная со следующего после y2 значения.

За счёт реализации данного алгоритма функция tnv находит все пары x,y в области [min(x),max(x)], [min(y),max(y)], при которых выражение formula(x,y)=0. Однако, в зависимости от заданной серии vx, функция может не "поймать" те или иные пары.

Функция tnv возвращает двумерный массив, в котором строка с именем x содержит значения x, а строка с именем y содержит соответствующие им значения y, при которых formula(x,y)=0.

''Разметка'/
/
 ~vx=tzd(-2,2,100)
 ~vy=tzd(-2,2,100)
 ~rv=tnv("x*x+y*y-1",vx,vy)
 :::Значения пар x и y
 @vtz()
/
''Вывод'/
~vx=tzd(-2,2,100)
~vy=tzd(-2,2,100)
~rv=tnv("x*x+y*y-1",vx,vy)
:::Значения пар x и y
@vtz()

В приведённом примере табулированы значения функции x^2+y^2=1, описывающей круг. Для каждого значения x получена пара значений y. При этом, в силу построения базисного массива vx некоторые важные значения (-1,0), (0,-1), (0,1), (1,0) были пропущены.  

**Функция vtz() - вывод табулированных пар значений 
Функция vtz([tpz]) выводит содержимое массива, полученного функцией tnv. Если параметр не задаётся, то выводятся значения, полученные при последнем вызове функции tnv. В предыдущем примере была реализована именно такая возможность. 

**Нанесение точек неявной функции на график 
При наличии установленного расширения grafik.php с помощью функции gtz() можно представить табулированные точки в графическом виде. Подробнее см. !dok/x_grafik.s. 

Однако надо иметь ввиду, что при использовании функции gtz() в общем случае не следует соединять точки табулированных данных, поскольку это, как правило, приводит к появлению совсем не того представления графика, которое ожидалось. Это связано с особенностями реализации алгоритма соединения точек.

Рассмотрим пример вывода табулированных значений, полученных в предыдущем примере (массив rv) при стандартных значениях параметров функции gtz. 

''Разметка'/
 @gtz(rv)
''Вывод'/
@gtz(rv)

Видно, что получен явно не  тот результат, который ожидался, поскольку в данном случае для каждого значения x имеется пара значений y и система нелепым образом последовательно соединяет все затабулированные пары (x,y), в то время как следовало бы последовательно соединять только значения y. В рамках данной реализации функции gtz правильно нарисовать такой график невозможно. Поэтому нужно вывести только точки и не соединять их, либо прибегнуть к пошаговому построению графика.  

В первом случае нужно просто указать функции gtz не соединять точки, установив в ноль параметр s. см. !dok/x_grafik.s. 
''Разметка'/
 @gtz(rv,'s:0')
''Вывод'/
@gtz(rv,'s:0')

Чтобы получить более слитное изображение можно просто затабулировать и вывести побольше точек. Но в этом случае страница будет выводиться довольно долго, поскольку табулирование неявной функции требует немалых вычислений, а изображение всё равно получится "дырявым". Удовлетворительного решения этой задачи в общем виде пока нет.

~vx=tzd(-2,2,100)
~vy=tzd(-2,2,100)
~r1=tnv("pow(x*x+y*y-1,3)-x*x*y*y*y",vx,vy)
@gtz(r1,'s:0')
@vc("pow(x*x+y*y-1,3)-x*x*y*y*y")

~vx=tzd(-2,2,100)
~vy=tzd(-3,3,100)
~r2=tnv("pow(x*x+y*y+1,2)-4*x*x-1",vx,vy)
@gtz(r2,'s:0')
@vc("pow(x*x+y*y+1,2)-4*x*x-1")

~d('r1')=r1
~d('r2')=r2
@gtz(d,'s:0')
@vc("r1:pow(x*x+y*y-1,3)-x*x*y*y*y<br>r2:pow(x*x+y*y+1,2)-4*x*x-1")