Расширение "Исследование неявных функций двух переменных"

Расширение предназначено для исследования неявных функций двух переменных. Оно позволяет:
табулировать значения аргументов функции f(x,y)=0, заданной аналитическим выражением зависимости связи двух переменных;
вывести значения пар x,y, обеспечивающих выполнение условия f(x,y)=0;
при установленном расширении grafik.php позволяет построить график исследуемой функции.
Для возможности использования расширения в системе должны быть установлены файлы f1.php и 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()
Вывод

Значения пар x и y

N
0
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
X
-0,990
-0,990
-0,949
-0,949
-0,909
-0,909
-0,869
-0,869
-0,828
-0,828
-0,788
-0,788
-0,747
-0,747
-0,707
-0,707
-0,667
-0,667
-0,626
-0,626
-0,586
-0,586
-0,545
-0,545
-0,505
-0,505
-0,465
-0,465
-0,424
-0,424
-0,384
-0,384
-0,343
-0,343
-0,303
-0,303
-0,263
-0,263
-0,222
-0,222
-0,182
-0,182
-0,141
-0,141
-0,101
-0,101
-0,061
-0,061
-0,020
-0,020
0,020
0,020
0,061
0,061
0,101
0,101
0,141
0,141
0,182
0,182
0,222
0,222
0,263
0,263
0,303
0,303
0,343
0,343
0,384
0,384
0,424
0,424
0,465
0,465
0,505
0,505
0,545
0,545
0,586
0,586
0,626
0,626
0,667
0,667
0,707
0,707
0,747
0,747
0,788
0,788
0,828
0,828
0,869
0,869
0,909
0,909
0,949
0,949
0,990
0,990
Y
-0,142
0,142
-0,314
0,314
-0,417
0,417
-0,495
0,495
-0,560
0,560
-0,616
0,616
-0,664
0,664
-0,707
0,707
-0,745
0,745
-0,780
0,780
-0,810
0,810
-0,838
0,838
-0,863
0,863
-0,885
0,885
-0,906
0,906
-0,923
0,923
-0,939
0,939
-0,953
0,953
-0,965
0,965
-0,975
0,975
-0,983
0,983
-0,990
0,990
-0,995
0,995
-0,998
0,998
-1,000
1,000
-1,000
1,000
-0,998
0,998
-0,995
0,995
-0,990
0,990
-0,983
0,983
-0,975
0,975
-0,965
0,965
-0,953
0,953
-0,939
0,939
-0,923
0,923
-0,906
0,906
-0,885
0,885
-0,863
0,863
-0,838
0,838
-0,810
0,810
-0,780
0,780
-0,745
0,745
-0,707
0,707
-0,664
0,664
-0,616
0,616
-0,560
0,560
-0,495
0,495
-0,417
0,417
-0,314
0,314
-0,142
0,142
В приведённом примере табулированы значения функции x^2+y^2=1, описывающей круг. Для каждого значения x получена пара значений y. При этом, в силу построения базисного массива vx некоторые важные значения (-1,0), (0,-1), (0,1), (1,0) были пропущены.

Функция vtz() - вывод табулированных пар значений

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

Нанесение точек неявной функции на график

При наличии установленного расширения grafik.php с помощью функции gtz() можно представить табулированные точки в графическом виде. Подробнее см. Графики.
Однако надо иметь ввиду, что при использовании функции gtz() в общем случае не следует соединять точки табулированных данных, поскольку это, как правило, приводит к появлению совсем не того представления графика, которое ожидалось. Это связано с особенностями реализации алгоритма соединения точек.
Рассмотрим пример вывода табулированных значений, полученных в предыдущем примере (массив rv) при стандартных значениях параметров функции gtz.
Разметка
@gtz(rv)
Вывод
Видно, что получен явно не тот результат, который ожидался, поскольку в данном случае для каждого значения x имеется пара значений y и система нелепым образом последовательно соединяет все затабулированные пары (x,y), в то время как следовало бы последовательно соединять только значения y. В рамках данной реализации функции gtz правильно нарисовать такой график невозможно. Поэтому нужно вывести только точки и не соединять их, либо прибегнуть к пошаговому построению графика.
В первом случае нужно просто указать функции gtz не соединять точки, установив в ноль параметр s. см. Графики.
Разметка
@gtz(rv,'s:0')
Вывод
Чтобы получить более слитное изображение можно просто затабулировать и вывести побольше точек. Но в этом случае страница будет выводиться довольно долго, поскольку табулирование неявной функции требует немалых вычислений, а изображение всё равно получится "дырявым". Удовлетворительного решения этой задачи в общем виде пока нет.
pow(x*x+y*y-1,3)-x*x*y*y*y

pow(x*x+y*y+1,2)-4*x*x-1

r1:pow(x*x+y*y-1,3)-x*x*y*y*y
r2:pow(x*x+y*y+1,2)-4*x*x-1
Оцените публикацию по предложенной шкале
-5  -4  -3  -2  -1  0  +1  +2  +3  +4  +5

Статистика Код