2011-07-29 120 views
2

我想绘制蝙蝠侠方程式。在sympy或matplotlib中的解决方案将是伟大的(鼠尾草是不酷,因为我使用的是Windows)。问题是,如果我注释掉某些零件的部分图形,但所有的零件都会出现空白图。Matplotlib轮廓不起作用

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/

+0

Python版本您使用的?如果不是3.x,那么您需要'from __future__ import division'来避免与所有这些整数的区分。 – Paul

回答

7

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

很好的与未来的分裂捕捉。我试图使用numpy.lib.scimath。sqrt,它与虚数一起工作,但是这个函数是在太多的区域中定义的,并且有一些不相关的行。谢谢 :) – ubershmekel

0

我知道这似乎有点扯,但如何建立x值的列表,然后计算“蝙蝠侠”的值,在每个那些位置,并存储另一个列表。你可以定义一个函数“蝙蝠侠”,它计算你通过的每个x值的y值。

然后只需用matplotlib绘制这些列表。

编辑:既然你已经让numpy数组存储结果,你可以在计算y值时使用这些数组。

0

我甚至不确定这个方程是如何工作的,因为我看到在第一项(在第一个平方根下,当abs(x)= 3)时出现零点分割,并且虚数显示在最后一项(在最后的平方根下,当{abs(x)-1}^2> 4时,即x> 3或者x < -3)。
我在这里错过了什么?只有结果的实际部分被使用,并且被零忽略或近似的分割?

运行这个,我确实看到很多RunTimeWarnings,并且不太可能matplotlib会完全搞不清可以使用什么数字(NaNs,Infs;尝试在最后打印F)。看起来像只有相对较少的NaN或Infs时它仍然可以管理,这可以解释为你看到了一部分数字。
我会认为matplotlib的轮廓很好,只是被输入混淆了。

+0

如何获得警告,matplotlib是否有调试模式?无论如何,我猜想,虚构的地区不应该绘制(如果结果不是零......)。 matplotlib不支持虚数算术吗?零除只影响可以忽略的一小组点。 – ubershmekel

+0

这很有趣 - 我没有看到数学:) – samb8s

+0

我不知道任何调试模式;也许它是我正在使用的matplotlib,numpy或python版本。看上面的答案,我意识到了什么问题:方程的每个部分都有一定数量的NaN和非NaN; matplotlib将绘制非NaN。但是,如果乘数相加,则最终会出现所有NaN,而且没有任何绘图。非常基本的例子:F1 = [NaN,5,NaN],F2 = [NaN,NaN,3],F3 = [2,NaN,NaN]; F1 * F2 * F3 = [NaN,NaN,NaN]。因此,你需要分别绘制它们中的每一个。它不是将乘以零的东西,而是乘以NaN。 – Evert