.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')
Чтобы получить более слитное изображение можно просто затабулировать и вывести побольше точек. Но в этом случае страница будет выводиться довольно долго, поскольку табулирование неявной функции требует немалых вычислений, а изображение всё равно получится "дырявым". Удовлетворительного решения этой задачи в общем виде пока нет.