Python (sympy) неявная функция: получить значения вместо графика?

Я новичок в sympy, но я уже получаю хороший результат, когда я строю неявную функцию (на самом деле формула для овалы Кассини) С помощью sympy:

from sympy import plot_implicit, symbols, Eq, solve
x, y = symbols('x y')
k=2.7
a=3
eq = Eq((x**2 + y**2)**2-2*a**2*(x**2-y**2), k**4-a**4)
plot_implicit(eq)

теперь действительно можно как-то получить x и y значения, соответствующие сюжету? или, наоборот, решить неявное уравнение без построения графика вообще?

спасибо! :-)

1 ответов


это ответ, адресованный вашему

действительно ли возможно каким-то образом получить значения x и y, соответствующие сюжету?

а я говорю "устранение" потому что невозможно получить x и y значения, используемые для рисования кривых - потому что кривые не рисуются с использованием последовательности 2D точек... подробнее об этом позже,


TL; DR

pli = plot_implicit(...)
series = pli[0]
data, action = series.get_points()
data = np.array([(x_int.mid, y_int.mid) for x_int, y_int in data])

давайте начнем с вашего кода

from sympy import plot_implicit, symbols, Eq, solve
x, y = symbols('x y')
k=2.7
a=3
eq = Eq((x**2 + y**2)**2-2*a**2*(x**2-y**2), k**4-a**4)

и построить его, с изюминкой: мы сохраняем Plot объект и распечатать его

pli = plot_implicit(eq)
print(pli)

и

Plot object containing:
[0]: Implicit equation: Eq(-18*x**2 + 18*y**2 + (x**2 + y**2)**2, -27.8559000000000) for x over (-5.0, 5.0) and y over (-5.0, 5.0)

нас интересует этот объект индексируется 0,

ob = pli[0]
print(dir(ob))

это дает (многоточие мое)

['__class__', …, get_points, …, 'var_y']

имя get_points звучит многообещающе, не это?

 print(ob.get_points())

это дает (отредактировано для ясности и с большим разрезом)

([
  [interval(-3.759774, -3.750008), interval(-0.791016, -0.781250)],
  [interval(-3.876961, -3.867195), interval(-0.634768, -0.625003)],
  [interval(-3.837898, -3.828133), interval(-0.693361, -0.683596)],
  [interval(-3.847664, -3.837898), interval(-0.673830, -0.664065)],
  ...
  [interval(3.837895, 3.847661), interval(0.664064, 0.673830)],
  [interval(3.828130, 3.837895), interval(0.683596, 0.693362)],
  [interval(3.867192, 3.876958), interval(0.625001, 0.634766)],
  [interval(3.750005, 3.759770), interval(0.781255, 0.791021)]
  ], 'fill')

что это? документация plot_implicit и

plot_implicit, по умолчанию, использует интервальная арифметика для построения функций.

следующий код plot_implicit.py и plot,py человек понимает, что в этом случае фактический заговор (говоря о matpolotlib backend) - это просто строка код

 self.ax.fill(x, y, facecolor=s.line_color, edgecolor='None')

здесь x и y строятся из списка интервалов, возвращаемых из .get_points() следующим образом

x, y = [], []
for intervals in interval_list:
    intervalx = intervals[0]
    intervaly = intervals[1]
    x.extend([intervalx.start, intervalx.start,
                  intervalx.end, intervalx.end, None])
    y.extend([intervaly.start, intervaly.end,
                  intervaly.end, intervaly.start, None])

так что для каждой пары интервалов matplotlib направлено на рисование заполненного прямоугольника, достаточно маленького, чтобы глаз видел непрерывную линию (обратите внимание на использование None иметь непересекающиеся прямоугольники).

можно сделать вывод, что список пар интервалов

l_xy_intervals = ((pli[0]).get_points())[0]

представляет собой прямоугольные области, где неявное выражение, которое вы строите "правда"