2016-04-18 9 views
-1

У меня есть данные с одной независимой переменной х и два зависимых переменных y1 и y2, как показано ниже:Как найти точку пересечения двух сегментов линии в Python?

x  y1  y2 
-1.5 16.25 1.02 
-1.25 17  1.03 
-1  15  1.03 
-0.75 9  1.09 
-0.5 5.9  1.15 
-0.25 5.2  1.17 
0  4.77 1.19 
+0.25 3.14 1.35 
+0.5 2.5  1.54 
+0.75 2.21 1.69 
+1  1.91 1.96 
+1.25 1.64 2.27 
+1.5 1.52 2.56 
+1.75 1.37 3.06 
+2  1.24 4.12 
+2.25 1.2  4.44 
+2.5 1.18 4.95 
+2.75 1.12 6.49 
+3  1.07 10 

Так, здесь значение x where y1 = y2 находится где-то около +1. Как читать данные и вычислять их в python?

+4

Кажется, что у вас есть задание, вы можете показать что-то, что вы уже пробовали. –

+0

@SiddharthGupta Это не задание. Добавление упрощения проблемы, над которой я работаю. Я сделал это визуально в Excel с помощью простых линейных диаграмм. Хотите перевести это в код. – sfactor

+0

Возможно использование matplotlib и рисования графики – Taylan

ответ

1

Наивный решение выглядит следующим образом:

txt = """-1.5 16.25 1.02 
-1.25 17  1.03 
-1  15  1.03 
-0.75 9  1.09 
-0.5 5.9  1.15 
-0.25 5.2  1.17 
0  4.77 1.19 
+0.25 3.14 1.35 
+0.5 2.5  1.54 
+0.75 2.21 1.69 
+1  1.91 1.96 
+1.25 1.64 2.27 
+1.5 1.52 2.56 
+1.75 1.37 3.06 
+2  1.24 4.12 
+2.25 1.2  4.44 
+2.5 1.18 4.95 
+2.75 1.12 6.49 
+3  1.07 10""" 

import numpy as np 
# StringIO behaves like a file object, use it to simulate reading from a file 
from StringIO import StringIO 

x,y1,y2=np.transpose(np.loadtxt(StringIO(txt))) 
p1 = np.poly1d(np.polyfit(x, y1, 1)) 
p2 = np.poly1d(np.polyfit(x, y2, 1)) 
print 'equations: ',p1,p2 

#y1 and y2 have to be equal for some x, that you solve for : 
# a x+ b = c x + d --> (a-c) x= d- b 

a,b=list(p1) 
c,d=list(p2) 
x=(d-b)/(a-c) 
print 'solution x= ',x 

выход:

equations: 
-3.222 x + 7.323 
1.409 x + 1.686 
solution x= 1.21717324767 

Но потом сюжет 'линии':

import matplotlib.pyplot as p 
%matplotlib inline 
p.plot(x,y1,'.-') 
p.plot(x,y2,'.-') 

enter image description here

И ре alize вы не можете использовать линейное предположение, но для нескольких сегментов.

x,y1,y2=np.transpose(np.loadtxt(StringIO(txt))) 
x,y1,y2=x[8:13],y1[8:13],y2[8:13] 
p1 = np.poly1d(np.polyfit(x, y1, 1)) 
p2 = np.poly1d(np.polyfit(x, y2, 1)) 
print 'equations: ',p1,p2 
a,b=list(p1) 
c,d=list(p2) 
x0=(d-b)/(a-c) 
print 'solution x= ',x0 
p.plot(x,y1,'.-') 
p.plot(x,y2,'.-') 

Выход:

equations: 
-1.012 x + 2.968 
1.048 x + 0.956 
solution x= 0.976699029126 

enter image description here

Даже сейчас можно улучшить, оставив еще два указывает (выглядит очень линейный, но это может быть совпадением несколько точек).

x,y1,y2=np.transpose(np.loadtxt(StringIO(txt))) 
x1,x2=x[8:12],x[9:13] 
y1,y2=y1[8:12],y2[9:13] 
p1 = np.poly1d(np.polyfit(x1, y1, 1)) 
p2 = np.poly1d(np.polyfit(x2, y2, 1)) 
print 'equations: ',p1,p2 
a,b=list(p1) 
c,d=list(p2) 
x0=(d-b)/(a-c) 
print 'solution x= ',x0 

import matplotlib.pyplot as p 
%matplotlib inline 
p.plot(x1,y1,'.-') 
p.plot(x2,y2,'.-') 

Выход:

equations: 
-1.152 x + 3.073 
1.168 x + 0.806 
solution x= 0.977155172414 

enter image description here

Возможно, лучше было бы использовать больше очков и применить интерполяцию 2-го порядка np.poly1d(np.polyfit(x,y1,2)), а затем решить равенство двух многочленов 2-го порядка, который я оставил как упражнение (квадратичное уравнение) для читателя.