使用Matlab计算大地测量学中的子午线弧长

一、由点的大地坐标B计算由赤道算起的子午线弧长X

在进行椭球面上的一些测量计算时,如高斯投影计算,要用到子午线弧长等公式,现有如下推导:
如图所示,设子午圈上两点P1、P2,相应纬度位B1、B2,求P1、P2之间的子午线弧长X。
在这里插入图片描述

此时可用微积分的思想,因为子午线并不是圆弧。取一段微小弧段即弧素dX,对应纬差为dB。设点P的子午圈曲率半径为M,则弧素dX就可以看成以M为半径的圆弧,于是有dX=MdB。
要求P1、P2两点间弧长X,就是求dX由B1到B2的积分,即
在这里插入图片描述
顾及M= a(1 - e2) / W3 = c / V3
可化为:
在这里插入图片描述
该式是一种椭圆积分,不能直接积分,需要按二项式定理将其展开成级数:
在这里插入图片描述

二项式定理 百度百科

于是有:
在这里插入图片描述
为了方便计算,将正弦的幂函数化为余弦的倍角函数,
即:sin2 = 1/2 -1/2*cos2B

三角函数公式 降幂公式 百度百科

化简完毕后得:这就是子午线弧长的一般公式
在这里插入图片描述
如果是从赤道算起得子午线,则弧长公式变为:
在这里插入图片描述
式中ρ是弧度和角度的转化常数,ρ″=206264.80624710″,ρ°=57.29577951308°

matlab源程序

首先定义角度转弧度函数

function rad=d2r(deg,min,sec)
    %    角度转弧度
    rad=(deg+min/60+sec/3600)*pi/180;

还有一个产生系数函数

function [A,B,C,D,E,F]=coe(e2)
    %   产生运算系数
    A=1+3/4*e2+45/64*e2^2+175/256*e2^3+11025/16384*e2^4+43659/65536*e2^5;
    B=3/4*e2+15/16*e2^2+525/512*e2^3+2205/2048*e2^4+72765/65536*e2^5;
    C=15/64*e2^2+105/256*e2^3+2205/4096*e2^4+10395/16384*e2^5;
    D=35/512*e2^3+105/2048*e2^4+31185/131072*e2^5;
    E=315/16384*e2^4+3465/65536*e2^5;
    F=693/131072*e2^5;

B求X主程序

clear
clc
deg=input('请输入纬度:\n度:');
min=input('分:');
sec=input('秒:');
b=d2r(deg,min,sec);
a=input('请输入椭球参数:\n长半轴半径a:');
f=input('请输入扁率f:');
e2=2*f-f*f;
[A,B,C,D,E,F]=coe(e2);   %调用coe函数产生运算系数
X=a*(1-e2)*(A*b-B/2*sin(2*b)+C/4*sin(4*b)-D/6*sin(6*b)+E/8*sin(8*b)-F/10*sin(10*b));
fprintf('\n由赤道起算的子午线弧长X=%.6fm\n\n',X);

二、由赤道算起的子午线弧长X反解大地纬度B

反解需要用到迭代计算
初始值:
B = X / ( a(1 - e2)A’ )
迭代公式:
Bi = 1 / A’ *[ X / a(1 - e2) + B’sin2Bi-1 - C’sin4Bi-1 + D’sin6Bi-1 - E’sin8Bi-1 + F’sin10Bi-1 +… ]
迭代收敛条件可以是两次计算的B绝对值之差小于10-20

matlab源程序
首先定义弧度转角度函数

function deg=r2d(rad)
    %   弧度转角度
    rad1=rad*180/pi;
    deg1=fix(rad1);
    min=fix((rad1-deg1)*60);
    sec=((rad1-deg1)*60-min)*60;
    deg=deg1+min/100+sec/10000;

X求B主程序

clear
clc
X=input('请输入由赤道起算的子午线弧长X:');
a=input('请输入椭球参数:\n长半轴半径a:');
f=input('请输入扁率f:');
e2=2*f-f*f;
[A,B,C,D,E,F]=coe(e2);     %调用coe函数产生运算系数
b0=X/(a*(1-e2)*A);
b1=1/A*(X/(a*(1-e2))+B/2*sin(2*b0)-C/4*sin(4*b0)+D/6*sin(6*b0)-E/8*sin(8*b0)+F/10*sin(10*b0));
while abs(b1-b0)>=1e-20    %迭代运算
    b0=b1;
    b1=1/A*(X/(a*(1-e2))+B/2*sin(2*b0)-C/4*sin(4*b0)+D/6*sin(6*b0)-E/8*sin(8*b0)+F/10*sin(10*b0));
end
B1=r2d(b1);
fprintf('\n所求大地纬度B=%.9f\n\n',B1);

如有错漏之处敬请指正

发布了13 篇原创文章 · 获赞 32 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43637490/article/details/89404196