matplotlib 如何在python中绘制根式方程

cu6pst1q  于 2022-12-23  发布在  Python
关注(0)|答案(1)|浏览(145)

我有三个方程如下所示:

如何在python中画出给定X1,Y1,X2,Y2,X3,Y3,t1,t2,t3,S的图形?
我试着去掉平方根,最后得到一个四次方程,然后试着绘图,但我还是得到了4个解,我必须再次验证其中两个正确的根。有没有直接的方法或库来绘制这些类型的方程?

izj3ouym

izj3ouym1#

这并不容易,因为这里有隐式方程,你没有一个y=f(x)公式来画出它,你有的是一些告诉你一对(x,y)是否在曲线上,但不能直接告诉你如果知道y如何求x,或者如果知道x如何求y(我假设你知道"隐式"和"显式"是什么意思,但如果你不知道,那就是.y=f(x)从x中显式地给出y,f(x,y)=0从x中隐式地给出y ......一旦你解了方程f(x,y)=0
因此,我可以看到3个选项来解决这个问题。
1.把隐式公式转换成显式公式,就是解方程,这是你们已经尝试过的,这也许是可能的,我不知道,因为这是堆栈溢出,那是纯数学,我假设它不是,我们也不想这么做。
1.用symsy来做。或者用symsy来解方程并得到一个显式。这只是第一个的计算机辅助版本。你也可以用Wolfram alpha的Maple来做。
1.关于SO的更多细节,我们正在寻找代码版本,假设我们不能解方程,因此尝试绘制方程为真的薄区域。
我假设我们在这里看到的是一个2d区域中的冲击的定位,给定它在3个不同点的检测时间(就像3个地震仪检测到的地震事件,或者就像3个麦克风检测到的触摸屏上的敲击--20年前我发表了一篇关于如何以这种方式制造精确而廉价的触摸屏的论文;当时我很确定那是最实用的方式...而现在我们到处都有便宜的电容屏;但我仍然倾向于认为这些等式是构建这样的触摸屏的一种方法)
因此,在实际应用中,假设速度为S = 1,在(5,5)、(10,10)和(10,2)处有3个探测器,用户触摸了点(6,6),则(t1-t2)S = √ 2-√ 32 ≈ -4.24,(t2-t3)S = 0,(t3-t1)S ≈ 4.24。

3.a计算方程几乎为真的区域的图像

import numpy as np
impost matplotlib.pyplot as plt
X1,Y1=5,5
X2, Y2=10,10
X3,Y3=10,2

# Creates 200x200 images of x and y
xx,yy=xx,yy=np.meshgrid(np.linspace(0,15,200), np.linspace(0,15,200))

# And a black image for the result
res=np.zeros((200,200,3), dtype=np.uint8)

# Helper values: distances d1, d2 and d3 of (x,y) from (Xk,Yk)
d1=np.sqrt((xx-X1)**2+(yy-Y1)**2)
d2=np.sqrt((xx-X2)**2+(yy-Y2)**2)
d3=np.sqrt((xx-X3)**2+(yy-Y3)**2)

# Compute image of area where d1-d2 is almost -4.24, so |d1-d2+4.24|<ε
eps=0.1
# Pixels where d1-d2 is almost -4.24 are red
res[np.abs(d1-d2+4.24)<eps,0]=255
# Pixels where d2-d3 is almost 0 are green
res[np.abs(d2-d3)<eps,1]=255
# Pixels where d3-d1 is almost 4.24 are blue
res[np.abs(d3-d1-4.24)<eps,2]=255

# Show this
plt.imshow(res)
plt.show()

所有3个方程的解都在交点处。注意(0,0)在左上方,y轴向下。另外,以像素为单位缩放。由于我们知道解是(6,6),这200个像素代表0到15的值,我们应该期望解在6 × 200/15 →(80,80)处。
我们可以尝试改变比例,反转图像,然后将eps变细以获得线条,或者尝试找到区域的中间,但我们不会这样做,因为这只是我解释matplotlib中已经有一个函数可以完成所有这些工作的一种方式:contour.
因此,实际上,您永远不会使用解决方案3a,但我想弄清楚contour在实际中的作用:它不解方程,也不神奇地画出一条2D隐式曲线。它所做的是在meshgrid和区域上工作。但是在那个区域找到最好的"线"。

3b.轮廓

import numpy as np
import matplotlib.pyplot as plt
X1,Y1=5,5
X2, Y2=10,10
X3,Y3=10,2

# Creates 200x200 images of x and y
xx,yy=xx,yy=np.meshgrid(np.linspace(0,15,200), np.linspace(0,15,200))

# And a black image for the result
res=np.zeros((200,200,3), dtype=np.uint8)

# Helper values: distances d1, d2 and d3 of (x,y) from (Xk,Yk)
d1=np.sqrt((xx-X1)**2+(yy-Y1)**2)
d2=np.sqrt((xx-X2)**2+(yy-Y2)**2)
d3=np.sqrt((xx-X3)**2+(yy-Y3)**2)

# Plot contour for the 3 equations
plt.contour(xx,yy,d1-d2, [-4.24])
plt.contour(xx,yy,d2-d3, [0])
plt.contour(xx,yy,d3-d1, [4.24])
plt.show()

3c.症状plot_implicit

最后,sympy还有一个函数来完成这个任务,但这意味着你必须创建这些方程的符号版本,而sympy并不能真正解出它们:它仍然是基于网格栅格的薄区域绘图。

import sympy
x,y=sympy.var('x y')
cur1=sympy.plot_implicit(sympy.sqrt((x-X1)**2 + (y-Y1)**2) - sympy.sqrt((x-X2)**2 + (y-Y2)**2) + 4.24, x_var=(x,0,15), y_var=(y,0,15), show=False)
cur2=sympy.plot_implicit(sympy.sqrt((x-X2)**2 + (y-Y2)**2) - sympy.sqrt((x-X3)**2 + (y-Y3)**2), x_var=(x,0,15), y_var=(y,0,15), show=False)
cur3=sympy.plot_implicit(sympy.sqrt((x-X3)**2 + (y-Y3)**2) - sympy.sqrt((x-X1)**2 + (y-Y1)**2) - 4.24, x_var=(x,0,15), y_var=(y,0,15), show=False)
cur1.append(cur2[0]) # Add line of cur2 to cur1 plot
cur1.append(cur3[0]) # Likewise for cur3
cur1.show()

请注意,它与我在第一个解中使用的meshgrid并不完全相同,因为它是自适应的,所以得到的面积更精确,但可以看到它是一个面积,而不是曲线:其具有厚度。
只有解3b是均匀薄的,这仅仅是因为它画了一个轮廓,但它也是一个面积。
所以,严格来说,这三个解都不能画出方程的曲线,除非你解了这些方程,否则你不能画出它们,它们所做的是在所有可能的x和y的组合中,找到那些更接近方程解的,它们看起来像是一维曲线图,但实际上它们是二维曲线图,z尽可能是表示"在曲线上或不在曲线上"的二进制值。
注:给出肯定结论:我最喜欢的选择是3b。只是,不要让它欺骗你,让你认为它画了一条曲线。它只是与3a和3c相同的解决方案,但通过一些智能轮廓检测以细均匀线结束。

相关问题