本程序打开后可以直接运行,可以实现间接平差的各个部分计算以及输出,如误差方程、参数平差值、残差向量V最小二乘残差、参数平差值的权逆阵Qx、单位权中误差等。能够实现全要素的以文件的形式进行输入和输出也可以根据根据需要直接在代码上进行输入等极为方便和快捷。本程序是参考武汉大学出版社出版的第二版的《误差理论与测量平差》进行编写的,程序中用到的例题是武汉大学出版社出版的《误差理论与测量平差基础》中的7-8例题。计算出的结果精度很高。
具体代码如下:
以下三个.csv文件用于数据的输入:
第一个.csv:n_t.csv
6,2
第二个.csv:权阵.csv
0.91,0.59,0.43,0.37,0.42,0.25
第三个.csv:系数参数矩阵
1,0,0
0,1,0
1,0,-4
0,1,-3
-1,1,-7
-1,0,-2
上面三个输入文件也可以在代码中直接输入数据进行计算
运行代码如下:
import numpy as np
from numpy import linalg
def Example(n, t, A, L, P):
N = np.dot(np.dot(A.T, P), A) # N 参数平差值的权逆阵Qx
U = np.dot(np.dot(A.T, P), L)
X = np.dot(linalg.inv(N), U) # X 参数平差值向量,数组长度为t,待计算
V = np.dot(A, X) - L # V 观测值残差向量数组长度为n,待计算
μ = np.sqrt(np.dot(np.dot(V.T, P), V) / (n - t)) # 函数返回值—若计算成功,返回单位权中误差μ
Qx = linalg.inv(N)
return (X, V, μ, Qx)
if __name__ == "__main__":
# 观测值总数和参数总数
# 文件导入n、t n 观测值个数;t 参数个数;
original_data1 = list(map(int, np.loadtxt(open('n_t.csv'), delimiter=",", skiprows=0)))
n, t = original_data1[0], original_data1[1]
# 误差方程
AL = np.array(np.loadtxt(open('系数参数矩阵.csv'), delimiter=",", skiprows=0), dtype=np.float64)
# 程序中使用的例题是武汉大学出版社出版的《误差理论与测量平差基础》中的7-8例题
A = AL[:, :-1] # A 误差方程系数矩阵数组长度为 n*t,已知
L = AL[:, -1] # L 观测值向量,数组长度为n,已知;
# 定权
P = np.diag(np.loadtxt(open('权阵.csv'), delimiter=",", skiprows=0)) # P 观测值权数组,只有权矩阵的对角线元素数组长度为n
X, V, μ, Qx = Example(n, t, A, L, P) # X 参数平差值向量,数组长度为t,待计算
with open('计算结果.csv', 'w', encoding="utf-8") as f:
f.writelines("误差方程:\n")
f.writelines(str(AL))
f.writelines("\n参数平差值X:\n")
f.writelines(str(X))
f.writelines("\n残差向量V最小二乘残差V:\n")
f.writelines(str(V))
f.writelines("\n参数平差值的权逆阵Qx\n")
f.writelines(str(Qx))
f.writelines("\n单位权中误差μ\n")
f.writelines(str(μ))
运行结果如下:
结果.csv:
误差方程:
[[ 1. 0. 0.]
[ 0. 1. 0.]
[ 1. 0. -4.]
[ 0. 1. -3.]
[-1. 1. -7.]
[-1. 0. -2.]]
参数平差值X:
[ 0.25895126 -2.85597136]
残差向量V最小二乘残差V:
[ 0.25895126 -2.85597136 4.25895126 0.14402864 3.88507739 1.74104874]
参数平差值的权逆阵Qx
[[0.53130053 0.16170016]
[0.16170016 0.77385077]]
单位权中误差μ
2.223618663514489