C++矩阵相乘后结果特别离谱

书生落魄·勤能补拙 2020-07-26 02:26:41
所有代码:

#include <iostream>
#include <cmath>
using namespace std;
double B[7][3], b[3][7], P[7][7], l[7], S[7];
double NBB[3][3], w[3][7], W[7], Nbb[3][3], x[3], V[7];
class leveling_adjustment {
public:
/*-------------------计算高程-----------------------------------------*/

void calculate_elevation();

/*-------------------计算中误差------------------------------------------*/

void middle_error_different();
private:

double H1=5.016,H2=6.016,H3, H4, H5;
double L13 = 1.359, L14 = 2.009, L52 = -0.595;
};
/*-------------------计算高程-----------------------------------------*/
void leveling_adjustment::calculate_elevation() {
/*-------------------------------输入l矩阵*/
cout << "请输入l矩阵" << endl;
for (int i = 0; i < 7; i++)
cin >> l[i];
cout << "请输入s矩阵" << endl;
for (int i = 0; i < 7; i++)
cin >> S[i];
/*------------------------------------输入B矩阵*/
cout << "请输入B矩阵" << endl;
for (int i = 0; i < 7; i++)
for (int j = 0; j < 3; j++) {
cin >> B[i][j];
}
cout << "请输入b矩阵" << endl;
for (int i = 0; i < 3; i++)
for (int j = 0; j < 7; j++)
cin >> b[i][j];
cout << "输出B矩阵" << endl;
for (int i = 0; i < 7; i++) {
for (int j = 0; j < 3; j++)
cout << B[i][j] << ' ';
cout << endl;
}
cout << "取5公里的观测高差为单位权观测" << endl;
for (int i = 0; i < 7; i++)
P[i][i] = 5.0 / S[i];
for (int i = 0; i < 7; i++)
for (int j = 0; j < 7; j++)
if (i != j)
P[i][j] = 0;
for (int i = 0; i < 7; i++) {
for (int j = 0; j < 7; j++)
cout << P[i][j] << ' ';
cout << endl;
}

/*--------------------------计算NBB矩阵----------------------------*/
/*----------------------计算W矩阵-------------------------------*/
NBB[0][0] = 0;
for (int i = 0; i < 3; i++)
for (int j = 0; j < 7; j++)
for (int k = 0; k < 7; k++) {
NBB[i][j] += b[i][k] * P[k][j];
}
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
for (int k = 0; k < 7; k++) {
NBB[i][j] += NBB[j][k] * B[k][j];
}
cout << "输出NBB矩阵" << endl;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++)
cout << NBB[i][j] << ' ';
cout << endl;
}
w[0][0] = 0;
W[0] = 0;
for (int i = 0; i < 3; i++)
for (int j = 0; j < 7; j++)
for (int k = 0; k < 7; k++) {
w[i][j] += b[i][k] * P[k][j];
}
for (int i = 0; i < 3; i++)
for (int j = 0; j < 7; j++) {
W[j] += w[i][j] * l[j];
}
cout << "输出W矩阵" << endl;
for (int i = 0; i < 7; i++)
cout << W[i] << ' ' << endl;
/*---------------------------计算NBB矩阵的逆-----------------*/
/*---------------------------计算参数改正数------------------*/
/*---------------------------计算改正数----------------------*/
cout << "输入Nbb矩阵" << endl;
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
cin >> Nbb[i][j];
x[0] = 0;
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
x[i] += Nbb[i][j] * W[j];
V[0] = 0;
for (int i = 0; i < 7; i++)
for (int j = 0; j < 3; j++)
V[i] += B[i][j] * x[j];
H3 = H1 + L13 + V[0] / 1000;
H4 = H1 + L14 + V[1] / 1000;
H5 = H2 + L52 + V[7] / 1000;
cout << "第三点的高程:" << H3 << endl;
cout << "第四点的高程:" << H4 << endl;
cout << "第五点的高程:" << H5 << endl;
}




可能出问题的地方:

/*-------------------计算中误差------------------------------------------*/
void leveling_adjustment::middle_error_different(){
double a0=0,a[7],a3,a4,ah,Q[3],q=0,f[3];
a[0] = 0;
for (int i = 0; i < 7; i++)
for (int j = 0; j < 7; j++)
a[i] += V[j] * P[i][j];
for (int j = 0; j < 7; j++)
a0+= a[j] * V[j];
cout << a0 << endl;
/*------------------------------------单位权中误差----------------------------*/

a0 = sqrt(a0/4);
cout << "单位权中误差为:" << a0 << endl;


/*--------------------高程中误差----------------------------------------------*/
a3 = a0 * sqrt(Nbb[0][0]);
cout << "3号点的高程中误差为:" << a3 << endl;
a4 = a0 * sqrt(Nbb[1][1]);
cout << "4号点的高程中误差为:" << a4 << endl;

/*---------------------------高差中误差----------------------------------------*/
Q[0] = 0;
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
Q[i] += f[i] * Nbb[j][i];
for (int i = 0; i < 3; i++)
q += Q[i] * f[i];

ah = a0 * sqrt(q/4);
cout << "34号点间的高差中误差为:" << ah << endl;
}
/*------------------计算高程中误差-------------------------------------------*/
int main() {
leveling_adjustment c;
c.calculate_elevation();
c.middle_error_different();
return 0;

}




输入验证数据:
0 0 4 3 7 2 0

1.1 1.7 2.3 2.7 2.4 1.4 2.6

1 0 0
0 1 0
1 0 0
0 1 0
-1 1 0
-1 0 1
0 0 -1


1 0 1 0 -1 -1 0
0 1 0 1 1 0 0
0 0 0 0 0 1 -1

0.1063 0.0324 0.0696
0.0324 0.1548 0.0212
0.0696 0.0212 0.2274
...全文
90 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
源代码大师 2021-05-06
  • 打赏
  • 举报
回复
希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10768339.html

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧