程序设计讲义第二篇(2) 联系客服

发布时间 : 星期四 文章程序设计讲义第二篇(2)更新完毕开始阅读2e21a7d726fff705cc170a0c

t1 = azimuth(x(m(1)), y(m(1)), x(m(2)), y(m(2))) '利用一对公共点求旋转角 t2 = azimuth(xo(1), yo(1), xo(2), yo(2)) dt = t2 - t1: x1 = x(m(1)): y1 = y(m(1)) For i = 1 To zds '将假设坐标转换到实际坐标 dx = x(i) - x1: dy = y(i) - y1

x(i) = xo(1) + dx * Cos(dt) - dy * Sin(dt) y(i) = yo(1) + dx * Sin(dt) + dy * Cos(dt) Next i

For i = 1 To yds '置入已知点坐标

x(m(i)) = xo(i): y(m(i)) = yo(i) Next i

c = Space(11) & \近 似 坐 标 值\

c = c & Space(3) & \点 名\坐标\坐标\ For i = 1 To zds '将近似坐标显示在文本框,供检查 d1 = dm(i)

d1 = Format(d1, \

x1 = x(i): x1 = Format(x1, \ y1 = y(i): y1 = Format(y1, \

c = c & Space(5) & d1 & Space(5) & x1 & Space(5) & y1 & Chr(13) & Chr(10) Next i

Text1.Text = c '将字符变量c显示在文本框text1中 Text1.Visible = True

――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――N?LV??jp?jp??jp? ?zj?L?V???zsin???jpcos?jp?jkjk??jk?L?j 令:ajp??S? bjp?? jpS?jpjh?Vjh???jh?zj ljp??z?????jjp?Ljp

误差方程:vjp???zj?ajpj?xj?bjp?yj?ajpj?xp?bjp?yp?ljp

9

定向角近似值必须用公式:zj???(?k?1nj?jk?Ljk),精度评定时,公式[pvv]=[pal]?x1nj?...?[ptl]?xt?[pll]才成立,因为?zj(j?1,2,..m)的系数[l]j

都为0。

――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― Case 2 '组法方程

Text1.Visible = False

Dim n1 As Integer, n2 As Integer, l1 As Double, pp As Double '定义过程级变量 q = 206265: ll = 0

n1 = 2 * (zds - yds) '未知数数目

n2 = n1 * (n1 + 1) / 2 '一维存储法方程系数数组上限 ReDim NX(n2), UX(n1) ' 重新定义法方程系数、常数数组 Call order(m(), yds) '对保存已知点序号的m()数组排序 For i = 1 To cds '按测站循环 z = 0 '将按测站累积的变量清零

'下面开始处理一个测站的方向观测值

k1 = nl(i - 1) + 1: k2 = nl(i) '一测站上最小和最大方向号 For j = k1 To k2 '在i测站上按方向循环,求定向角未知数 h = seqn(lb(j))

t = azimuth(x(i), y(i), x(h), y(h))

f = t - l(j): If f < 0 Then f = f + 2 * pi 'f是解算的零方角方位角 z = z + f Next j

zo = z / (k2 - k1 + 1) 'zo是定向角未知数(零方向的坐标方位角)

ReDim nc(n1): ln = 0 ' 重新定义和方程系数数组,并且每循环到一新测站前清零,ln是和方程常数项 For j = k1 To k2 '在i测站上按方向循环,求误差方程系数、常数

ReDim nb(n1) ' 重新定义误差方程系数数组,并且每循环到一新方向前清零 h = seqn(lb(j))

dx = x(h) - x(i): dy = y(h) - y(i) ss = Sqr(dx ^ 2 + dy ^ 2) '反算边长

t = azimuth(x(i), y(i), x(h), y(h)) '反算坐标方位角

A = q * Sin(t) * 10 ^ -2 / ss: B = -q * Cos(t) * 10 ^ -2 / ss '求方向误差方程系数

cha = charact(i, k) '自定义函数,查测站点i是否已知点,如不是,用k返回i前面有几个已知点 If cha = \序号为i的测站点不是已知点

10

d = 2 * (i - k - 1) + 1 '计算测站i点x坐标未知数在未知数点集中的序号 nb(d) = A: nb(d + 1) = B '对误差方程系数数组赋值

nc(d) = nc(d) + nb(d): nc(d + 1) = nc(d + 1) + nb(d + 1) '累积到和方程数组中去 End If

cha = charact(h, k) '查照准方向点h是否已知点,如不是,用k返回h前面有几个已知点 If cha = \照准方向点不是已知点

d = 2 * (h - k - 1) + 1 '计算照准方向点x坐标未知数在未知数点集中的序号 nb(d) = -A: nb(d + 1) = -B '对误差方程系数数组赋值

nc(d) = nc(d) + nb(d): nc(d + 1) = nc(d + 1) + nb(d + 1) '累积到和方程数组中去 End If

If t - zo < -0.01 Then t = t + 2 * pi '当t是零方向方位角时,可能比平均值zo略小,所以不用<0的比较方法 l1 = q * (t - zo - l(j)) '误差方程常数项,以秒为单位

ln = ln + l1: ll = ll + l1 ^ 2 '累积和方程常数项及求[pvv]的[Pll]值 pp = 1 '方向观测值的权为1

Call equation(nb(), pp, l1) '组法方程,参数分别是误差方程系数数组、权、误差方程常数项 Next j

pp = -1 / (k2 - k1 + 1): l1 = ln 'pp是和方程的权,公式中分母是测站方向数。

Call equation(nc(), pp, l1) '和方程组法方程,nc()是一测站方向误差方程和方程数组 '一个测站方向观测值误差方程处理完毕,下面开始处理该测站的边观测值 If ns(i) - ns(i - 1) - 1 >= 0 Then 'i测站有观测边

For j = ns(i - 1) + 1 To ns(i) '依次遍访i测站上各观测边

ReDim nb(n1) ' 重新定义误差方程系数数组,并且每循环到一新边长前清零 h = seqn(sb(j))

t = azimuth(x(i), y(i), x(h), y(h)) A = Cos(t): B = Sin(t)

cha = charact(i, k) '自定义函数,查测站点i是否已知点,如不是,用k返回i前面有几个已知点 If cha = \测站点i不是已知点

d = 2 * (i - k - 1) + 1 '计算测站i点x坐标未知数在未知数点集中的序号 nb(d) = -A: nb(d + 1) = -B End If

cha = charact(h, k)

If cha = \照准方向点h不是已知点

d = 2 * (h - k - 1) + 1 '计算照准方向h点x坐标未知数在未知数点集中的序号 nb(d) = A: nb(d + 1) = B End If

dx = x(h) - x(i): dy = y(h) - y(i)

11

ss = Sqr(dx ^ 2 + dy ^ 2) '反算边长,置于判断式外是因为两已知点之间不会测边 pp = (ma / (0.1 * ms + mk * ss * 10 ^ -4)) ^ 2 '边长观测值定权 l1 = (ss - s(j)) * 100 '求边误差方程常数(单位是厘米) Call equation(nb(), pp, l1)

ll = ll + pp * l1 ^ 2 '累积用于求[pvv]的[Pll]值 Next j End If

'一个测站的误差方程处理完毕,进入下一测站 Next i

Text1.Visible = False

MsgBox (\法方程组成完毕\

Case 3 '高斯约化法解法方程 n = 2 * (zds - yds)

ReDim nb(n), nc(n) '数组清零 For i = 1 To n

nb(i) = -UX(i) '将法方程常数项赋予一工作数组,保留原值用于求pvv Next i

For k = 1 To n - 1 '从法方程的第一行到倒数第二行, k实际上控制约化次数

m1 = k * (k + 1) / 2 'm1是k行的自乘元素在法方程系数阵中序号(一维按列上三角阵) For j = k + 1 To n '在j循环内完成k次约化

m2 = (j - 1) * j / 2 + k 'm2在j循环内依次是k行自乘系数右边各元素序号 For i = j To n 'i循环内完成法方程系数阵j行元素的k次约化 d = (i - 1) * i / 2

n1 = d + k '与约化元素同列的 k行元素 n2 = d + j '约化元素在法方程系数阵中编号 NX(n2) = NX(n2) - NX(n1) * NX(m2) / NX(m1) Next i Next j

For i = k + 1 To n '在i循环内完成法方程常数项的k次约化 nub = (i - 1) * i / 2 + k

nb(i) = nb(i) - nb(k) * NX(nub) / NX(m1) Next i

Next k '法方程约化完毕 pvv1 = ll 'll是[pll]

For k = 1 To n '在循环内按[pvv]=[pll]+(l)*(l)求[pvv]

12