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轴上
  • (多亏了Dux)您可以添加
    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()