Python 画一个圆的方程式
以下公式用于对二维空间中的点进行分类:Python 画一个圆的方程式,python,numpy,matplotlib,plot,equation,Python,Numpy,Matplotlib,Plot,Equation,以下公式用于对二维空间中的点进行分类: f(x1,x2) = np.sign(x1^2+x2^2-.6) 所有点都在空间X=[-1,1]X[-1,1]中,每个X的拾取概率相同 现在我想想象一下这个圆,它等于: 0 = x1^2+x2^2-.6 x1的值应在x轴上,x2的值应在y轴上 这一定是可能的,但我很难将方程转换为绘图。绘制x值并计算相应的y值如何 import numpy as np import matplotlib.pyplot as plt x = np.linspace(-1
f(x1,x2) = np.sign(x1^2+x2^2-.6)
所有点都在空间X=[-1,1]X[-1,1]
中,每个X的拾取概率相同
现在我想想象一下这个圆,它等于:
0 = x1^2+x2^2-.6
x1的值应在x轴上,x2的值应在y轴上
这一定是可能的,但我很难将方程转换为绘图。绘制x值并计算相应的y值如何
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-1, 1, 100, endpoint=True)
y = np.sqrt(-x**2. + 0.6)
plt.plot(x, y)
plt.plot(x, -y)
产生
这显然可以做得更好,但这只是为了演示…您可以使用等高线图,如下所示(基于上的示例): 这将生成以下图表 最后,一些一般性发言:
x^2
并不意味着它在python中的作用,您必须使用x**2
x1
和x2
对我来说是非常误导的,特别是如果你声明x2
必须在y轴上李>
plt.gca()。通过使轴相等,设置_aspect('equal')
使图形看起来实际上是圆形的@BasJansen的解决方案肯定能让你达到目的,它要么效率很低(如果你使用了很多网格点),要么不准确(如果你只使用了很少的网格点) 你可以很容易地直接画出这个圆。给定
0=x1**2+x**2-0.6
,则x2=sqrt(0.6-x1**2)
(如Dux所述)
但你真正想做的是把笛卡尔坐标变换成极坐标
x1 = r*cos(theta)
x2 = r*sin(theta)
如果在圆方程中使用这些子条件,您将看到r=sqrt(0.6)
现在,您可以将其用于绘图:
import numpy as np
import matplotlib.pyplot as plt
# theta goes from 0 to 2pi
theta = np.linspace(0, 2*np.pi, 100)
# the radius of the circle
r = np.sqrt(0.6)
# compute x1 and x2
x1 = r*np.cos(theta)
x2 = r*np.sin(theta)
# create the figure
fig, ax = plt.subplots(1)
ax.plot(x1, x2)
ax.set_aspect(1)
plt.show()
结果:
产生:
使用复数绘制圆
想法:将一个点乘以复指数()旋转圆上的点
import numpy as np
import matplotlib.pyplot as plt
num_pts=20 # number of points on the circle
ps = np.arange(num_pts)
# j = np.sqrt(-1)
pts = (np.exp(2j*np.pi/num_points)**ps)
fig, ax = plt.subplots(1)
ax.plot(pts.real, pts.imag , 'o')
ax.set_aspect(1)
plt.show()
可能的重复我有点不好意思,我没有想到这一点。。。更好的解决方案@Dux我在我的标准食谱中有一个类似的情节,我只需要稍微修改一下(我最初的答案比要求的更复杂)。您建议的方法也会起作用(如果您连接了功能),您的方法对大多数用户来说更容易理解;)谢谢这似乎是一种直接的方法。当我试图发布问题时,使用“**”更改了文本的输出。使用
plt.gca()。在调用plt.show()
来实现一个圆之前设置“aspect('equal')
,这不是一种非常低效的画圆方法吗?您需要创建两个包含10000个变量的网格,然后在其上运行轮廓算法。请参阅我的答案,了解不同的方法。这是否与@Bas Jansen或我的答案中绘制x1
和x2
一样有效,因为您仍然在笛卡尔网格上绘制,并且这些点之间的插值将是线性的而不是曲线的?您只是简单地展示了一种可能更优雅的方法来计算圆上的点……所有的解决方案在绘制圆时都具有相同的效率。然而,@Bas-Jansen的答案在创建数据方面效率很低。你的解与我的解非常相似,唯一的区别是在我的解中,点(构成圆)的间距相等。当您显示点时(使用plt.plot(x,y,'.')
和ax.set\u aspect(1)
),您是否尝试过用您的方法闭合圆,您会看到差异?
# x**2 + y**2 = r**2
r = 6
x = np.linspace(-r,r,1000)
y = np.sqrt(-x**2+r**2)
plt.plot(x, y,'b')
plt.plot(x,-y,'b')
plt.gca().set_aspect('equal')
plt.show()
import numpy as np
import matplotlib.pyplot as plt
num_pts=20 # number of points on the circle
ps = np.arange(num_pts)
# j = np.sqrt(-1)
pts = (np.exp(2j*np.pi/num_points)**ps)
fig, ax = plt.subplots(1)
ax.plot(pts.real, pts.imag , 'o')
ax.set_aspect(1)
plt.show()