Расширение "Исследование неявных функций двух переменных"
Расширение предназначено для исследования неявных функций двух переменных. Оно позволяет:
табулировать значения аргументов функции 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
r2:pow(x*x+y*y+1,2)-4*x*x-1
Оцените публикацию по предложенной шкале