球面上的测地线
本文节选自geomstats官方教程https://geomstats.github.io/notebooks/04_practical_methods__from_vector_spaces_to_manifolds.html。
球面
最容易理解的流形就是二维球面,毕竟我们每天都要打交道的地球就是个二维球面,下面调用geomstats自带的数据,绘制地球上的若干城市
代码如下
importgeomstats.backendasgs gs.random.seed(2020)importgeomstats.datasets.utilsasdata_utils data,names=data_utils.load_cities()importmatplotlib.pyplotasplt plt.rcParams['font.sans-serif']='Times New Roman'ax=plt.subplot(projection="3d")importgeomstats.visualizationasvis vis.plot(data[15:20],ax=ax,space="S2",label=names[15:20],s=80,alpha=0.5)ax.set_title("Cities on the earth.")plt.show()球面上的向量
众所周知,向量可以理解为从一个点出发,指向另一个点的箭头。
a=gs.array([0,1])b=gs.array([1,2])v=b-a ax=plt.subplot()ax.scatter(a,b,label="Points")ax.arrow(gs.to_numpy(a[0]),gs.to_numpy(a[1]),dx=gs.to_numpy(v[0]),dy=gs.to_numpy(v[1]),width=0.008,length_includes_head=True,color="black")ax.legend()plt.show()geomstats提供了一种更加便捷的箭头绘制函数,可以在三维流形上绘制从某点出发的向量
paris=data[19]vector=gs.array([1,0,0.8])ax=plt.subplot(projection="3d")ax=vis.plot(paris,ax=ax,space="S2",s=200,alpha=0.8,label="Paris")arrow=vis.Arrow3D(paris,vector=vector)arrow.draw(ax,color="black")ax.legend()plt.show()测地线
当球面上向量,与其起始点处的球面相切的时候,那么对于这一点附近的人来说,这个向量几乎就在球面内部。比如从巴黎出发,画一个地球的切向量,那么对于巴黎的人来说,这只是一个平平无奇的路标而已。但是,如果他行动力超强,沿着这个路标走,那问题就大了,他会直接走出地球。而现实中,他必须紧贴着地球前进,而他的轨迹则是一条测地线,如下图所示。
绘图代码如下
fromgeomstats.geometry.hypersphereimportHypersphere sphere=Hypersphere(dim=2)paris=data[19]vector=gs.array([1,0,0.8])tv=sphere.to_tangent(vector,base_point=paris)# 切线result=sphere.metric.exp(tv,base_point=paris)geodesic=sphere.metric.geodesic(initial_point=paris,initial_tangent_vec=tv)trace=geodesic(gs.linspace(0.0,1.0,30))ax=plt.subplot(projection="3d")ax=vis.plot(paris,ax=ax,space="S2",s=100,alpha=0.8,label="Paris")ax=vis.plot(result,ax=ax,space="S2",s=100,alpha=0.8,label="End point")ax=vis.plot(trace,ax=ax,space="S2",color="black",label="Geodesic")arrow=vis.Arrow3D(paris,vector=tv)arrow.draw(ax,color="black")ax.legend()plt.show()【Hypersphere】是超球面类,维度为2时,就是三维空间中的二维球面。上述代码中调用了很多Hypersphere中的方法。
【metric.exp】为黎曼几何中的指数映射,其功能是将切空间(平坦的局部近似)中的向量,映射回流形(弯曲的全局空间)上的点。
【metric.geodesic】则是根据起始点和切向量,生成一条测地线函数,这个函数可以将实数映射为测地线上的点。