from pylab import polyfit, polyval, plot, grid, xlabel, ylabel, show
x1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
y1 = [2, 3, 1, 5, 4, 3, 2, 4, 5, 9]
x2 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
y2 = [8, 7, 8, 5, 4, 3, 4, 3, 2, 1]
m1, b1 = polyfit(x1, y1, 1)
yp1 = polyval([m1, b1], x1)
plot(x1, yp1)
m2, b2 = polyfit(x2, y2, 1)
yp2 = polyval([m2, b2], x2)
plot(x2, yp2)
plot(x1, yp1)
plot(x2, yp2)
grid(True)
xlabel('x')
ylabel('y')
show()
我正在尝试使用上面的代码对同一图表上的某些数据进行两次线性拟合。最佳拟合的线恰好相交,我对这个交叉点感兴趣。如何从python中获取该点,然后在图表上绘制它?
换句话说,我想在yp1
和yp2
相交的地方放一个大胖圈并打印该值。
答案 0 :(得分:1)
这是一个简单的数学问题,并不是特定于Python。
你有两个方程和两个未知数(两条线相交的点的纵坐标,xs
和坐标ys
。)
ys = m1 * xs + b1
ys = m2 * xs + b2
您可以将其置于矩阵形式,以获得方程组,然后您可以使用numpy.linalg.solve
轻松解决。
转换涉及重新排序这些方程的项,例如,像这样:
m1 * xs - 1 * ys = - b1
m2 * xs - 1 * ys = - b2
矩阵制剂现在应该变得明显:
⎧m1 -1⎫ ⎧xs⎫ ⎧ -b1 ⎫
| | . | | = | |
⎩m2 -1⎭ ⎩ys⎭ ⎩ -b2 ⎭
使用执行线性代数的库可轻松解决此问题,例如numpy.linalg
(您导入的子集)。
import numpy # part of pylab but I prefer loading specific modules, not a whole blob
# matrix form: A * X = B
A = numpy.array([[m1, -1], [m2, -1]])
B = numpy.array([[-b1], [-b2]])
# notice that X is simply a column vector: array([[xs],[ ys]])
xs,ys = numpy.linalg.solve(A,B)
# final step, plot the point of intersection with e.g. a black single dot:
plt.plot(xs, ys, 'ko ')
有关求解线性方程组的更多信息,我建议您通过阅读任何基础数学书来提升您的知识。当然,也会在维基百科上提供A primer。