求解两个联立方程:一个包含 Python 函数
solve two simultaneous equations: one contains a Python function
在下面的地图上,我有两个已知点(A 和 B)及其坐标(经度,纬度)。我需要推导直线上的一个点C的坐标,距离A100公里。
首先我创建了一个函数来计算两点之间的距离(以公里为单位):
# pip install haversine
from haversine import haversine
def get_distance(lat_from,long_from,lat_to,long_to):
distance_in_km = haversine((lat_from,long_from),
(lat_to, long_to),
unit='km')
return distance_in_km
然后利用斜率和距离,点C的坐标应该是下面方程的解:
# line segment AB and AC share the same slope, so
# (15.6-27.3)/(41.6-34.7) = (y-27.3)/(x-34.7)
# the distance between A and C is 100 km, so
# get_distance(y,x,27.3,34.7) = 100
然后我尝试在Python中求解这两个方程:
from sympy import symbols, Eq, solve
slope = (15.6-27.3)/(41.6-34.7)
x, y = symbols('x y')
eq1 = Eq(y-slope*(x-34.7)-27.3)
eq2 = Eq(get_distance(y,x,34.7,27.3)-100)
solve((eq1,eq2), (x, y))
错误是TypeError: can't convert expression to float
。我可能理解这个错误,因为 get_distance
函数期望输入为浮点数,而 eq2
中的 x
和 y
是 sympy.core.symbol.Symbol
.
我尝试添加 np.float(x)
,但仍然存在相同的错误。
有没有办法解这样的方程?或者您有更好的方法来实现所需要的吗?
非常感谢!
# there is a simple example of solving equations:
from sympy import symbols, Eq, solve
x, y = symbols('x y')
eq1 = Eq(2*x-y)
eq2 = Eq(x+2-y)
solve((eq1,eq2), (x, y))
# output: {x: 2, y: 4}
你可以直接计算那个点。我们可以 implement a python version of the intermediate calculation for lat long.
请注意,此计算假设地球是一个球体,并考虑了曲线,即这不是欧几里得近似值,就像您原来的 post。
假设我们有两个(lat,long)点 A
和 B
;
import numpy as np
A = (52.234869, 4.961132)
B = (46.491267, 26.994655)
EARTH_RADIUS = 6371.009
我们可以通过取 100/distance-between-a-b-in-km
来计算中间点分数 f
from sklearn.neighbors import DistanceMetric
dist = DistanceMetric.get_metric('haversine')
point_1 = np.array([A])
point_2 = np.array([B])
delta = dist.pairwise(np.radians(point_1), np.radians(point_2) )[0][0]
f = 100 / (delta * EARTH_RADIUS)
phi_1, lambda_1 = np.radians(point_1)[0]
phi_2, lambda_2 = np.radians(point_2)[0]
a = np.sin((1-f) * delta) / np.sin(delta)
b = np.sin( f * delta) / np.sin(delta)
x = a * np.cos(phi_1) * np.cos(lambda_1) + b * np.cos(phi_2) * np.cos(lambda_2)
y = a * np.cos(phi_1) * np.sin(lambda_1) + b * np.cos(phi_2) * np.sin(lambda_2)
z = a * np.sin(phi_1) + b * np.sin(phi_2)
phi_n = np.arctan2(z, np.sqrt(x**2 + y**2) )
lambda_n = np.arctan2(y,x)
C点,从A点到B点,距离A点100公里,比
C = np.degrees( phi_n ), np.degrees(lambda_n)
在这种情况下
(52.02172458025681, 6.384361456573444)
在下面的地图上,我有两个已知点(A 和 B)及其坐标(经度,纬度)。我需要推导直线上的一个点C的坐标,距离A100公里。
首先我创建了一个函数来计算两点之间的距离(以公里为单位):
# pip install haversine
from haversine import haversine
def get_distance(lat_from,long_from,lat_to,long_to):
distance_in_km = haversine((lat_from,long_from),
(lat_to, long_to),
unit='km')
return distance_in_km
然后利用斜率和距离,点C的坐标应该是下面方程的解:
# line segment AB and AC share the same slope, so
# (15.6-27.3)/(41.6-34.7) = (y-27.3)/(x-34.7)
# the distance between A and C is 100 km, so
# get_distance(y,x,27.3,34.7) = 100
然后我尝试在Python中求解这两个方程:
from sympy import symbols, Eq, solve
slope = (15.6-27.3)/(41.6-34.7)
x, y = symbols('x y')
eq1 = Eq(y-slope*(x-34.7)-27.3)
eq2 = Eq(get_distance(y,x,34.7,27.3)-100)
solve((eq1,eq2), (x, y))
错误是TypeError: can't convert expression to float
。我可能理解这个错误,因为 get_distance
函数期望输入为浮点数,而 eq2
中的 x
和 y
是 sympy.core.symbol.Symbol
.
我尝试添加 np.float(x)
,但仍然存在相同的错误。
有没有办法解这样的方程?或者您有更好的方法来实现所需要的吗?
非常感谢!
# there is a simple example of solving equations:
from sympy import symbols, Eq, solve
x, y = symbols('x y')
eq1 = Eq(2*x-y)
eq2 = Eq(x+2-y)
solve((eq1,eq2), (x, y))
# output: {x: 2, y: 4}
你可以直接计算那个点。我们可以 implement a python version of the intermediate calculation for lat long.
请注意,此计算假设地球是一个球体,并考虑了曲线,即这不是欧几里得近似值,就像您原来的 post。
假设我们有两个(lat,long)点 A
和 B
;
import numpy as np
A = (52.234869, 4.961132)
B = (46.491267, 26.994655)
EARTH_RADIUS = 6371.009
我们可以通过取 100/distance-between-a-b-in-km
f
from sklearn.neighbors import DistanceMetric
dist = DistanceMetric.get_metric('haversine')
point_1 = np.array([A])
point_2 = np.array([B])
delta = dist.pairwise(np.radians(point_1), np.radians(point_2) )[0][0]
f = 100 / (delta * EARTH_RADIUS)
phi_1, lambda_1 = np.radians(point_1)[0]
phi_2, lambda_2 = np.radians(point_2)[0]
a = np.sin((1-f) * delta) / np.sin(delta)
b = np.sin( f * delta) / np.sin(delta)
x = a * np.cos(phi_1) * np.cos(lambda_1) + b * np.cos(phi_2) * np.cos(lambda_2)
y = a * np.cos(phi_1) * np.sin(lambda_1) + b * np.cos(phi_2) * np.sin(lambda_2)
z = a * np.sin(phi_1) + b * np.sin(phi_2)
phi_n = np.arctan2(z, np.sqrt(x**2 + y**2) )
lambda_n = np.arctan2(y,x)
C点,从A点到B点,距离A点100公里,比
C = np.degrees( phi_n ), np.degrees(lambda_n)
在这种情况下
(52.02172458025681, 6.384361456573444)