Контур Matplotlib не работает - PullRequest
2 голосов
/ 29 июля 2011

Я пытаюсь построить уравнение Бэтмена. Решение в Sympy или Matplotlib будет отличным (Sage не круто, потому что я использую Windows). Проблема в том, что, если я закомментирую определенные части, появляется часть рисунка, но со всеми частями F *= я получаю пустой график.

import matplotlib.pyplot
from numpy import arange
from numpy import meshgrid
from numpy import sqrt
from numpy import real

delta = 0.01
xrange = arange(-7.0, 7.0, delta)
yrange = arange(-3.0, 3.0, delta)
x, y = meshgrid(xrange,yrange)

F = 1
F *= (((x/7) ** 2) * sqrt(abs(abs(x) - 3)/(abs(x) - 3)) + ((y / 3) ** 2) * sqrt(abs(y + (3 * sqrt(33)) / 7)/(y + (3 * sqrt(33)) / 7)) - 1)
F *= (abs(x/2) - ((3 * sqrt(33) - 7)/112) * x**2 - 3 + sqrt(1 - (abs(abs(x) - 2) - 1) ** 2 ) - y)
F *= (9 * sqrt(abs((abs(x) - 1) * (abs(x) - 3/4))/((1 - abs(x)) * (abs(x) - 3/4))) - 8 * abs(x) - y)
F *= (3 * abs(x) + 0.75 * sqrt(abs((abs(x) - 3/4) * (abs(x) - 1/2))/((3/4 - abs(x)) * (abs(x) - 1/2))) - y)
F *= ((9/4) * sqrt(abs((x - 1/2) * (x + 1/2))/((1/2 - x) * (1/2 + x))) - y)
F *= ((6 * sqrt(10)) / 7 + (3/2 - abs(x)/2) * sqrt(abs(abs(x) - 1)/(abs(x) - 1)) - ((6 * sqrt(10))/ 14) * sqrt(4 - (abs(x) - 1) ** 2 ) - y)
G = 0

matplotlib.pyplot.contour(x, y, (F - G), [0])
matplotlib.pyplot.show()

Что здесь происходит? Если график равен нулю для одного мультипликатора, он все равно должен быть таким, независимо от того, какие другие мультипликаторы я добавлю туда.

источник уравнения Бэтмена: http://www.reddit.com/r/pics/comments/j2qjc/do_you_like_batman_do_you_like_math_my_math/

Ответы [ 3 ]

7 голосов
/ 29 июля 2011

Параметр sqrt отрицателен для многих точек, поэтому конечными продуктами являются все NaN.Вы можете построить каждый фактор следующим образом:

from __future__ import division  # this is important, otherwise 1/2 will be 0
import matplotlib.pyplot
from numpy import arange
from numpy import meshgrid
from numpy import sqrt
from numpy import real


delta = 0.01
xrange = arange(-7.0, 7.0, delta)
yrange = arange(-3.0, 3.0, delta)
x, y = meshgrid(xrange,yrange)

F1 = (((x/7) ** 2) * sqrt(abs(abs(x) - 3)/(abs(x) - 3)) + ((y / 3) ** 2) * sqrt(abs(y + (3 * sqrt(33)) / 7)/(y + (3 * sqrt(33)) / 7)) - 1)
F2 = (abs(x/2) - ((3 * sqrt(33) - 7)/112) * x**2 - 3 + sqrt(1 - (abs(abs(x) - 2) - 1) ** 2 ) - y)
F3 = (9 * sqrt(abs((abs(x) - 1) * (abs(x) - 3/4))/((1 - abs(x)) * (abs(x) - 3/4))) - 8 * abs(x) - y)
F4 = (3 * abs(x) + 0.75 * sqrt(abs((abs(x) - 3/4) * (abs(x) - 1/2))/((3/4 - abs(x)) * (abs(x) - 1/2))) - y)
F5 = ((9/4) * sqrt(abs((x - 1/2) * (x + 1/2))/((1/2 - x) * (1/2 + x))) - y)
F6 = ((6 * sqrt(10)) / 7 + (3/2 - abs(x)/2) * sqrt(abs(abs(x) - 1)/(abs(x) - 1)) - ((6 * sqrt(10))/ 14) * sqrt(4 - (abs(x) - 1) ** 2 ) - y)


for f in [F1,F2,F3,F4,F5,F6]:
    matplotlib.pyplot.contour(x, y, f, [0])
matplotlib.pyplot.show()

результирующий график: enter image description here

0 голосов
/ 29 июля 2011

Я даже не уверен, как это уравнение будет работать, так как я вижу деления на ноль, возникающие в первом члене (под первым квадратным корнем, когда abs (x) = 3), и мнимые числа, отображаемые в последнем термин (под последним квадратным корнем, когда {abs (x) -1} ^ 2> 4, то есть x> 3 или x <-3). <br /> Что мне здесь не хватает? Используется ли только действительная часть результата, и деления на ноль игнорируются или аппроксимируются?

Запустив это, я действительно вижу много RunTimeWarnings, и не исключено, что matplotlib полностью запутается, с какими числами работать (NaNs, Infs; попытка напечатать F в конце). Похоже, что это все еще удается, когда есть только относительно небольшое количество NaN или Infs, что объясняет, что вы видите часть фигуры.
Я думаю, что контур matplotlib в порядке, просто смущен вводом.

0 голосов
/ 29 июля 2011

Я знаю, что это может показаться неудачным, но как насчет создания списка значений x, а затем вычисления значения "batman" в каждой из этих позиций и сохранения в другом списке. Вы можете определить функцию "batman", которая вычисляет значение y для каждого значения x, которое вы передаете.

Тогда просто нанесите эти списки с помощью matplotlib.

РЕДАКТИРОВАТЬ: Поскольку вы уже создали массивы для хранения результатов, вы можете использовать их при вычислении значений у.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...