水准网间接平差程序设计(C++)

合集下载

测绘程序设计—实验八-水准网平差程序设计报告

测绘程序设计—实验八-水准网平差程序设计报告

《测绘程序设计()》上机实验报告(Visual C++.Net)班级: 测绘0901班学号: **********姓名: 代娅琴4月29日实验八平差程序设计基础一、实验目旳•巩固过程旳定义与调用•巩固类旳创立与使用•巩固间接平差模型及平差计算•掌握平差程序设计旳基本技巧与环节二、实验内容水准网平差程序设计。

设计一种水准网平差旳程序, 规定数据从文献中读取, 计算部分与界面无关。

水准网间接平差模型:计算示例:近似高程计算:1.水准网平差计算一般环节(1)读取观测数据和已知数据;(2)计算未知点高程近似值;(3)列高差观测值误差方程;(4)根据水准路线长度计算高差观测值旳权;(5)构成法方程;(6)解法方程, 求得未知点高程改正数及平差后高程值;(7)求高差观测值残差及平差后高差观测值;(8)精度评估;(9)输出平差成果。

2.水准网高程近似值计算算法3.输入数据格式示例实验代码:#pragma onceclass LevelControlPoint{public:LevelControlPoint(void);~LevelControlPoint(void);public:CString strName;//点名CString strID;//点号float H;bool flag;//标记与否已经计算出近似高程值, 若计算出则为, 否则为};class CDhObs{public:CDhObs(void);~CDhObs(void);public:LevelControlPoint* cpBackObj;//后视点LevelControlPoint* cpFrontObj;//前视点double ObsValue;//高差值double Dist;//测站旳距离};#include"StdAfx.h"#include"LevelControlPoint.h"LevelControlPoint::LevelControlPoint(void){strName=_T("");strID=_T("");H=0;flag=0;}LevelControlPoint::~LevelControlPoint(void){}CDhObs::CDhObs(void){}CDhObs::~CDhObs(void){}#pragma once#include"LevelControlPoint.h"#include"Matrix.h"class AdjustLevel{public:AdjustLevel(void);~AdjustLevel(void);public:LevelControlPoint* m_pKnownPoint;//已知点数组int m_iKnownPointCount;//已知点个数LevelControlPoint* m_pUnknownPoint;//未知点数组int m_iUnknownPointCount;//未知点个数CDhObs* m_pDhObs;//高差观测值数组int m_iDhObsCount;//高差观测值个数public:void SetKnownPointSize(int size);//创立大小为size旳已知点数组void SetUnkonwnPointSize(int size);//创立大小为size旳未知点数组void SetDhObsSize(int size);//创立大小为size旳观测值数组bool LoadObsData(const CString& strFile);//读入观测文献CString* SplitString(CString str, char split, int& iSubStrs);void ApproHeignt(void);//计算近似值private:LevelControlPoint* SearchKnownPointUsingID(CString ID);LevelControlPoint* SearchUnknownPointUsingID(CString ID);LevelControlPoint* SearchPointUsingID(CString ID);CMatrix LevleWeight(void);//计算权矩阵public:void FormErrorEquation(CMatrix &B, CMatrix &L);//构成误差方程void EquationCompute(CMatrix &x);//计算法方程void Accuracy_Assessment(double &r0,CMatrix &Qxx);//精度评估void CompAdjust(double &r0,CMatrix Qx[]);};#include"StdAfx.h"#include"AdjustLevel.h"#include<locale.h>#include"LevelControlPoint.h"#include"math.h"AdjustLevel::AdjustLevel(void){m_pKnownPoint=NULL;//已知点数组m_iKnownPointCount=0;//已知点个数m_pUnknownPoint=NULL;//未知点数组m_iUnknownPointCount=0;//未知点个数m_pDhObs=NULL;//高差观测值数组m_iDhObsCount=0;//高差观测值个数}AdjustLevel::~AdjustLevel(void){if(m_pKnownPoint!=NULL){delete[] m_pKnownPoint;m_pKnownPoint=NULL;}if(m_pUnknownPoint!=NULL){delete[] m_pUnknownPoint;m_pUnknownPoint=NULL;}if(m_pDhObs!=NULL){delete[] m_pDhObs;m_pDhObs=NULL;}}void AdjustLevel::SetKnownPointSize(int size){m_pKnownPoint=new LevelControlPoint[size];//创立动态指针m_iKnownPointCount=size;}void AdjustLevel::SetUnkonwnPointSize(int size){m_pUnknownPoint=new LevelControlPoint[size];m_iUnknownPointCount=size;}void AdjustLevel::SetDhObsSize(int size){m_pDhObs=new CDhObs[size];m_iDhObsCount=size;//高差观测值个数}bool AdjustLevel::LoadObsData(const CString& strFile){CStdioFile sf;if(!sf.Open(strFile,CFile::modeRead)) return false;//创立并打开文献对象CString strLine;bool bEOF=sf.ReadString(strLine);//读取第一行, 即已知点旳数目SetKnownPointSize(_ttoi(strLine));//根据已知点旳数目, 创立已知点数组;int n=0;for(int i=0;i<m_iKnownPointCount;i++)//读取已知点旳点名和高程值{sf.ReadString(strLine);CString *pstrData=SplitString(strLine,',',n);m_pKnownPoint[i].strName=pstrData[0];m_pKnownPoint[i].strID=pstrData[0];m_pKnownPoint[i].H=_tstof(pstrData[1]);m_pKnownPoint[i].flag=1;//已知点不用平差, 故将其旳flag设立为delete[] pstrData;pstrData=NULL;}sf.ReadString(strLine);//读取未知点旳个数SetUnkonwnPointSize(_ttoi(strLine));//根据未知点旳个数创立未知点数组sf.ReadString(strLine);//读取未知点旳点名CString *pstrData=SplitString(strLine,',',n);for(int i=0;i<m_iUnknownPointCount;i++)//将未知点旳点名放入未知点数组{m_pUnknownPoint[i].strName=pstrData[i];m_pUnknownPoint[i].strID=pstrData[i];m_pUnknownPoint[i].H=0;//未知点旳高程值设立为m_pUnknownPoint[i].flag=0;//还没有求得近似高程, 故其flag设立为}if(pstrData!=NULL){delete[] pstrData;pstrData=NULL;}sf.ReadString(strLine);//读取观测值旳个数SetDhObsSize(_ttoi(strLine));//按照观测值旳大小, 创立观测值数组for(int i=0;i<m_iDhObsCount;i++)//分行读取观测值旳数据, 将其存入观测值数组{sf.ReadString(strLine);CString *pstrData=SplitString(strLine,',',n);m_pDhObs[i].cpBackObj=SearchPointUsingID(pstrData[0]);//后视点m_pDhObs[i].cpFrontObj=SearchPointUsingID(pstrData[1]);//前视点m_pDhObs[i].HObsValue=_tstof(pstrData[2]);//高差观测值m_pDhObs[i].Dist=_tstof(pstrData[3]);//距离观测值delete[] pstrData;pstrData=NULL;}sf.Close();return 1;}CString* AdjustLevel::SplitString(CString str, char split, int& iSubStrs) {int iPos = 0; //分割符位置int iNums = 0; //分割符旳总数CString strTemp = str;CString strRight;//先计算子字符串旳数量while (iPos != -1){iPos = strTemp.Find(split);if (iPos == -1){break;}strRight = strTemp.Mid(iPos + 1, str.GetLength());strTemp = strRight;iNums++;}if (iNums == 0) //没有找到分割符{//子字符串数就是字符串自身iSubStrs = 1;return NULL;}//子字符串数组iSubStrs = iNums + 1; //子串旳数量= 分割符数量+ 1CString* pStrSplit;pStrSplit = new CString[iSubStrs];strTemp = str;CString strLeft;for (int i = 0; i < iNums; i++){iPos = strTemp.Find(split);//左子串strLeft = strTemp.Left(iPos);//右子串strRight = strTemp.Mid(iPos + 1, strTemp.GetLength());strTemp = strRight;pStrSplit[i] = strLeft;}pStrSplit[iNums] = strTemp;return pStrSplit;}//LevelControlPoint* AdjustLevel::SearchKnownPointUsingID(CString ID) {for(int i=0;i<m_iKnownPointCount;i++){if(m_pKnownPoint[i].strID==ID){return &m_pKnownPoint[i];}}return NULL;}//LevelControlPoint* AdjustLevel::SearchUnknownPointUsingID(CString ID) {for(int i=0;i<m_iUnknownPointCount;i++){if(m_pUnknownPoint[i].strID==ID){return &m_pUnknownPoint[i];}}return NULL;}LevelControlPoint* AdjustLevel::SearchPointUsingID(CString ID){LevelControlPoint* cp;cp=SearchKnownPointUsingID(ID);if(cp==NULL)cp=SearchUnknownPointUsingID(ID);return cp;}void AdjustLevel::ApproHeignt(void)//用于计算高程近似值旳函数{for(int i=0;i<m_iUnknownPointCount;i++)//计算未知点高程值{if(m_pUnknownPoint[i].flag!=1){//先在未知点作为观测值旳前视点旳状况for(int j=0;j<m_iDhObsCount;j++)//从观测数组里找与未知点有关联旳点{//如果观测值旳前视点是未知点且其后视点已有高程值if((m_pDhObs[j].cpFrontObj->strID==m_pUnknownPoint[i].strID)&& m_pDhObs[j].cpBackObj->flag==1 ){ //前视点=后视点-高差/*m_pUnknownPoint[i].H=m_pDhObs[i].cpBackObj->H -m_pDhObs[i].ObsValue;*/m_pUnknownPoint[i].H=m_pDhObs[j].cpBackObj->H + m_pDhObs[j].HObsValue;m_pUnknownPoint[i].flag=1;break;}}if(m_pUnknownPoint[i].flag!=1)//如果通过上一环节未知点仍没有计算出近似值{for(int j=0;j<m_iDhObsCount;j++)//从观测数组里找与未知点有关联旳点 {//如果观测值旳后视点是未知点且其前视点已有高程值if((m_pDhObs[j].cpBackObj->strID==m_pUnknownPoint[i].strID)&& m_pDhObs[j].cpFrontObj->flag==1 ){ //后视点=前视点+高差m_pUnknownPoint[i].H=m_pDhObs[j].cpFrontObj->H-m_pDhObs[j].HObsValue;/*m_pUnknownPoint[i].H=m_pDhObs[i].cpFrontObj->H+m_pDhObs[i].ObsValue;*/m_pUnknownPoint[i].flag=1;break;}}}}if(i==m_iUnknownPointCount-1)//如果已经计算到最后一种未知点{for(int a=0;a<m_iUnknownPointCount;a++){if(m_pUnknownPoint[i].flag!=1)//只要有一种未知点旳近似高程直没有计算{ //则要重新进行上面旳环节直到所有旳未知点旳近似高程值都计算出i=-1;break;}}}}}CMatrix AdjustLevel::LevleWeight(void){CMatrix p(m_iDhObsCount,m_iDhObsCount);p.Unit();double value;for(int i=0;i<m_iDhObsCount;i++){value=(1.0/m_pDhObs[i].Dist);p(i,i)=value;}return p;}void AdjustLevel::FormErrorEquation(CMatrix &B, CMatrix &L){B.SetSize(m_iDhObsCount,m_iUnknownPointCount);L.SetSize(m_iDhObsCount,1);for(int i=0;i<m_iDhObsCount;i++)//建立B系数阵{LevelControlPoint *tmpBack=NULL,*tmpFront=NULL;tmpBack=SearchPointUsingID(m_pDhObs[i].cpBackObj->strID);tmpFront=SearchPointUsingID(m_pDhObs[i].cpFrontObj->strID);//找到与第i个观测值有关旳未知点tmpBack->strID;for(int j=0;j<m_iUnknownPointCount;j++){if(m_pUnknownPoint[j].strID==tmpBack->strID)//如果是后视点则前面旳系数为-1{ B(i,j)=-1;continue;}if(m_pUnknownPoint[j].strID==tmpFront->strID)//如果是前视点则前面旳系数为{B(i,j)=1;}}}//建立L矩阵CString tmp;for(int i=0;i<m_iDhObsCount;i++){//l=高差观测值-(后视近似值-前视近似值)/*L(i,0)=m_pDhObs[i].ObsValue-(m_pDhObs[i].cpBackObj->H-m_pDhObs[i].cpFrontObj->H);*/ L(i,0)=m_pDhObs[i].HObsValue-(m_pDhObs[i].cpFrontObj->H -m_pDhObs[i].cpBackObj->H);tmp.Format(_T("%.3f"),L(i,0));L(i,0)=_tstof(tmp);L(i,0)=L(i,0)*1000;//将单位化为mm}}void AdjustLevel::EquationCompute(CMatrix &x)//计算法方程{CMatrix P,B,l;P=LevleWeight(); //P为权矩阵FormErrorEquation(B,l);ApproHeignt();CMatrix BT(m_iUnknownPointCount,m_iDhObsCount);BT=~B; //B旳转置矩阵CMatrix NBB(m_iUnknownPointCount,m_iUnknownPointCount);NBB=BT*P*B;CMatrix NBBl=NBB.Inv();x=NBBl*BT*P*l;for(int i=0;i<m_iUnknownPointCount;i++){m_pUnknownPoint[i].H+=x(i,0);//未知点高程值=近似值+改正数}}void AdjustLevel::Accuracy_Assessment(double &r0,CMatrix &Qxx)//精度评估{CMatrix B,l,P,x;P=LevleWeight(); //P为权矩阵FormErrorEquation(B,l);EquationCompute(x);CMatrix v(m_iDhObsCount,1);v=B*x-l;CMatrix vT(1,m_iDhObsCount);vT=~v;CMatrix r/*(1,l)*/;r=vT*P*v;r0=sqrt(r(0,0)/(m_iDhObsCount-m_iUnknownPointCount));//单位权中误差Qxx.SetSize(m_iUnknownPointCount,m_iUnknownPointCount);CMatrix BT(m_iUnknownPointCount,m_iDhObsCount);BT=~B;CMatrix NBB(m_iUnknownPointCount,m_iUnknownPointCount);NBB=BT*P*B;Qxx=NBB.Inv();}void AdjustLevel::CompAdjust(double &r0,CMatrix Qx[]){ApproHeignt();//计算未知点旳近似高程值并且存入数组CMatrix P(m_iDhObsCount,m_iDhObsCount);P=LevleWeight();//p为权矩阵CMatrix B,L;CMatrix x,Qxx;FormErrorEquation(B,L);//构成误差方程, B为系数矩阵, l为常数项EquationCompute(x);//计算法方程Accuracy_Assessment(r0,Qxx);//精度评估for(int i=0;i<m_iUnknownPointCount;i++)//未知点高程中误差{Qx[i]=sqrt(Qxx(i,i))*r0;}}#include"Matrix.h"#include"locale.h"#include"LevelControlPoint.h"#include"AdjustLevel.h"AdjustLevel LevelComput;CString* SplitString(CString str, char split, int& iSubStrs){int iPos = 0; //分割符位置int iNums = 0; //分割符旳总数CString strTemp = str;CString strRight;//先计算子字符串旳数量while (iPos != -1){iPos = strTemp.Find(split);if (iPos == -1){break;}strRight = strTemp.Mid(iPos + 1, str.GetLength());strTemp = strRight;iNums++;}if (iNums == 0) //没有找到分割符{//子字符串数就是字符串自身iSubStrs = 1;return NULL;}//子字符串数组iSubStrs = iNums + 1; //子串旳数量= 分割符数量+ 1CString* pStrSplit;pStrSplit = new CString[iSubStrs];strTemp = str;CString strLeft;for (int i = 0; i < iNums; i++){iPos = strTemp.Find(split);//左子串strLeft = strTemp.Left(iPos);//右子串strRight = strTemp.Mid(iPos + 1, strTemp.GetLength());strTemp = strRight;pStrSplit[i] = strLeft;}pStrSplit[iNums] = strTemp;return pStrSplit;}void CIndircLelveDlg::OnBnClickedOpendatafile(){// TODO: 在此添加控件告知解决程序代码UpdateData(TRUE);CFileDialog dlgFile(TRUE,_T("txt"),NULL,OFN_ALLOWMULTISELECT|OFN_EXPLORER,_T("(文本文献)|*.txt"));//创立文献对话框if(dlgFile.DoModal()==IDCANCEL) return;//如果选择取消按钮则返回CString strFileName=dlgFile.GetPathName();//打开获取文献文献名setlocale(LC_ALL,""); //设立语言环境CStdioFile sf;if(!sf.Open(strFileName, CFile::modeRead)) return;InputContent.Empty();//清空字符串str_openContent中旳内容CString strLine;BOOL bEOF=sf.ReadString(strLine);//读取第一行数据while(bEOF)//开始读取顶点数据{bEOF=sf.ReadString(strLine);if(bEOF)InputContent+=strLine+_T("\r\n");}sf.Close();UpdateData(FALSE);}void CIndircLelveDlg::OnBnClickedSavedata(){// TODO: 在此添加控件告知解决程序代码U pdateData(TRUE);CFileDialog dlgFile(FALSE,_T("txt"),NULL,OFN_EXPLORER,_T("(Level格式)|*.txt"));if(dlgFile.DoModal()==IDCANCEL) return;CString strFileName=dlgFile.GetPathName();setlocale(LC_ALL,"");CStdioFile sf;if(!sf.Open(strFileName, CFile::modeCreate|CFile::modeWrite)) return;sf.WriteString(LevleContent);sf.Close();UpdateData(FALSE);}void CIndircLelveDlg::OnBnClickedComputelevel(){// TODO: 在此添加控件告知解决程序代码UpdateData(TRUE);setlocale(LC_ALL,"");double *Qx=new double[LevelComput.m_iUnknownPointCount];double r0;pAdjust(r0,Qx);LevleContent.Format(_T("平差后高程值:\r\n"));CString Temp;for(int i=0;i<LevelComput.m_iUnknownPointCount;i++){Temp.Empty();Temp.Format(_T("%s,%.4f\r\n"),LevelComput.m_pUnknownPoint[i].strID,LevelComput.m_pUnknownPoint[i].H);LevleContent+=Temp;}Temp.Format(_T("单位权中误差: %.1f mm\r\n"),r0*1000);LevleContent+=Temp;LevleContent+=_T("未知点高程中误差(mm):\r\n");for(int i=0;i< LevelComput.m_iUnknownPointCount;i++){Temp.Empty();Temp.Format(_T("%s,%.1f\r\n"),LevelComput.m_pUnknownPoint[i].strName,Qx[i]*1000);LevleContent+=Temp;}UpdateData(false);}void CIndircLelveDlg::OnBnClickedSavelevleresult(){// TODO: 在此添加控件告知解决程序代码UpdateData(TRUE);CFileDialog dlgFile(FALSE,_T("txt"),NULL,OFN_EXPLORER,_T("(Level格式)|*.txt"));if(dlgFile.DoModal()==IDCANCEL) return;CString strFileName=dlgFile.GetPathName();setlocale(LC_ALL,"");CStdioFile sf;if(!sf.Open(strFileName, CFile::modeCreate|CFile::modeWrite)) return;sf.WriteString(LevleContent);sf.Close();UpdateData(FALSE);}三、实验成果打开文献数据:平差成果:四、实验心得这从实验是我们测绘程序设计旳最后一次实验, 虽然这个学期我们做了好几次有关旳实验, 但是我却发现自己学旳东西也越来越模糊, 感觉诸多内容都不理解。

水准网平差c++代码

水准网平差c++代码

水准网平差结果#include<iostream>#include<stdlib.h>#include<iomanip>#include<math.h>#define max 50Using namespace std;Class CMatrix{public:CMatrix(){row=0; column=0;}; // 默认构造函数CMatrix(int i, int j){row=i;column=j;} // 构造函数一CMatrix(constCMatrix& m); // 复制构造函数~CMatrix(void){/*cout<<"谢谢使用,矩阵所占空间以释放!"<<endl;*/} // 默认析构函数CMatrix& operator=(constCMatrix& m); // 赋值运算符bool operator==(constCMatrix& m); // 比括较运算符bool operator!=(constCMatrix& m); // 比括较运算符CMatrix operator+(constCMatrix& m); // 加运算符CMatrix operator-(constCMatrix& m); // 减运算符CMatrix& operator+=(constCMatrix& m); // 自加运算符CMatrix& operator-=(constCMatrix& m); // 自减运算符CMatrix operator-();// 取负数CMatrix& operator*(constCMatrix& m); // 乘法运算符void input(); //输入矩阵void outputMatrix(); // 输出该矩阵void setValue(int row, int column, double value) { A[row-1][column-1] = value; }// 设置(i,j)的值double getValue(int row, intcolumn)const { return A[row-1][column-1]; }// 设置行、列的值voidsetRow(constint i) { row = i; }intgetRow() const { return row; }voidsetColunm(constint i) { column = i; }intgetColumn() const { return column; }CMatrix& change(int i, int j);//交换矩阵的行CMatrix& transpose(); // 矩阵转置CMatrix& inverse(); // 矩阵求逆void find(int& f)const;// 判断该矩阵是否可用于迭代求解friend void jocabi(constCMatrix& a) ; //迭代求解void lzys(); //列主元素法求解void solve(); //可逆线性矩阵求解void qxnh(); //曲线拟合private:// 成员变量double A[max][max];int row;// 行int column;// 列};void CMatrix::input() //输入{ cout<<"开始输入矩阵值:"<<endl;int i, j;double z;for(i=0;i<row;i++){ cout<<"请输入第"<<i+1<<"行的值:"<<endl;for(j=0;j<column;j++){ cin>>z;A[i][j]=z;}}cout<<endl;};CMatrix::CMatrix(constCMatrix& m) // 复制构造函数{ int i, j;for(i=0;i<m.row;i++)for(j=0;j<m.column;j++)this->A[i][j]=m.A[i][j];};CMatrix&CMatrix::operator=(constCMatrix& m) // 赋值运算符{inti,j;for(i=0;i<row;i++){for(j=0;j<column;j++)A[i][j]=m.A[i][j];}return *this;};boolCMatrix::operator ==(constCMatrix& m) // 比括较运算符{ inti,j,k;for(i=0;i<m.row;i++){ for(j=0;j<m.column;j++)if(this->A[i][j]=m.A[i][j]) k=1;else k=0;}if(k=1) return true;else return false;};boolCMatrix::operator !=(constCMatrix& m) // 比括较运算符{ inti,j,k;for(i=0;i<m.row;i++){ for(j=0;j<m.column;j++)if(this->A[i][j]=m.A[i][j]) k=1;else k=0;}if(k=0) return true;else return false;};CMatrixCMatrix::operator+(constCMatrix& m)// 加运算符{ inti,j;if((this->row==m.row)&&(this->column==m.column)){ for(i=0;i<m.row;i++)for(j=0;j<m.column;j++)this->A[i][j]+=m.A[i][j];}else { cout<<"此两矩阵不能相加,请检查!"<<endl; }return *this;};CMatrixCMatrix::operator-(constCMatrix& m)// 减运算符{ inti,j;if((this->row==m.row)&&(this->column==m.column)){ for(i=0;i<m.row;i++)for(j=0;j<m.column;j++)this->A[i][j]-=m.A[i][j];}else { cout<<"此两矩阵不能相加,请检查!"<<endl; }return *this;};CMatrix&CMatrix::operator+=(constCMatrix& m) //自加运算符{ inti,j;for(i=0;i<m.row;i++)for(j=0;j<m.column;j++) this->A[i][j]=2*m.A[i][j];return *this;};CMatrix&CMatrix::operator-=(constCMatrix& m) //自减运算符{ inti,j;for(i=0;i<m.row;i++)for(j=0;j<m.column;j++)this->A[i][j]=m.A[i][j]-m.A[i][j];return *this;};voidCMatrix::find(int& f)const{ int i;for(i=0;i<this->row;i++)if(this->A[i][i]!=0) f=1;else f=0;};CMatrixCMatrix::operator-() // 取负数{ inti,j;for(i=0;i<this->row;i++)for(j=0;j<this->column;j++)this->A[i][j]=-this->A[i][j];return *this;};CMatrix&CMatrix::operator*(constCMatrix& m) // 乘法运算符{ inti,j,t;CMatrix n;if(this->column==m.row){for(i=0;i<this->row;i++)for(j=0;j<m.column;j++){ double sum=0.0;for(t=0;t<m.row;t++)sum+=this->A[i][t]*m.A[t][j];n.A[i][j]=sum;}}else {cerr<<"此两矩阵不能相乘,请检查!"<<endl; exit(1);}return n;};void CMatrix::outputMatrix()// 输出该矩阵{ inti,j;for(i=1;i<=row;i++){ for(j=1;j<=column;j++)cout<<A[i-1][j-1]<<" ";cout<<endl;}};CMatrix&CMatrix::transpose()// 矩阵转置{ inti,j;CMatrix m(this->column,this->row);for(i=0;i<this->row;i++)for(j=0;j<this->column;j++){ m.A[j][i]=this->A[i][j];} return m;};void jocabi(constCMatrix& a) //高斯迭代求解{ int f=1;a.find(f);if(f==0) {cerr<<"该矩阵不满足迭代求解条件!"<<endl; exit(1); }else{CMatrixx,w;x.setColunm(1);x.setRow(a.getColumn());w.setColunm(1);w.setRow(a.getColumn());int i;double z;for(i=1;i<=x.row;i++){ cout<<"请输入等式右侧的第"<<i<<"个值:";cin>>z;w.A[i-1][0]=z;}for(i=1;i<=x.row;i++){ cout<<"请输入X"<<i<<"的近似值:";cin>>z;x.setValue(i, 1, z);} i=1;while(i<=20){ int j, k;for(j=1;j<=x.row;j++){ double sum=0.0;for(k=1;k<j;k++){sum=sum-(a.A[j-1][k-1])*(x.A[k-1][0]); }for(k=j+1;k<=x.row;k++){sum=sum-(a.A[j-1][k-1])*(x.A[k-1][0]); }sum+=w.A[j-1][0];x.A[j-1][0]=sum/a.A[j-1][j-1];}i++;}for(i=1;i<=x.row;i++)cout<<"X"<<i<<" = "<<x.A[i-1][0]<<endl;}};double jdz(double a) //绝对值{ if(a>0.0) return a;else return -a;};CMatrix&CMatrix::change(int i, int j)//交换矩阵的行{ int k;double z;for(k=1;k<=this->column;k++){ z=A[i-1][k-1];A[i-1][k-1]=A[j-1][k-1];A[j-1][k-1]=z;}return *this;};void CMatrix::lzys() //列主元素法求解{ CMatrixx,w;x.setColunm(1);x.setRow(getColumn());w.setColunm(1);w.setRow(getColumn());int i;double z;for(i=0;i<row;i++){for(int j=0;j<row; j++)w.A[i][j]=0.0;}for(i=1;i<=x.row;i++)x.setValue(i, 1, 0.0);for(i=1;i<=x.row;i++){ cout<<"请输入等式右侧的第"<<i<<"个值:";cin>>z;w.A[i-1][0]=z;}i=0;while(i<x.row-1){ intj,t,h=i;for(j=i;j<x.row-1;j++){ if(jdz(A[j][i])<jdz(A[j+1][i]))h=j+1; }this->change(i+1,h+1);w.change(i+1,1);for(j=i+1;j<row;j++){ double k;k=A[j][i]/A[i][i];for(t=i;t<column;t++){A[j][t]=A[j][t]-k*A[i][t];}w.A[j][0]=w.A[j][0]-k*w.A[i][0];}i++;}if(this->A[row-1][column-1]==0){cerr<<"此矩阵对应的方程组有无穷解!"<<endl; exit(1);}i=column-1;while(i>0){ int j, t;for(j=i-1;j>=0;j--){ double k;k=A[j][i]/A[i][i];for(t=i;t>j;t--){ A[j][t]=A[j][t]-k*A[i][t]; }w.A[j][0]=w.A[j][0]-k*w.A[i][0];}i--;}int j;for(j=0;j<x.row;j++){x.A[j][0]=w.A[j][0]/this->A[j][j];}for(i=1;i<=x.row;i++)cout<<"X"<<i<<" = "<<x.A[i-1][0]<<endl; };CMatrix&CMatrix::inverse() //矩阵求逆{ if(this->row!=this->column) {cerr<<"该矩阵不符合求逆条件!"<<endl; exit(1);} else{CMatrix w;w.setColunm(this->getRow());w.setRow(getColumn());int i;for(i=0;i<row;i++){for(int j=0;j<row; j++){w.A[i][j]=0.0;}w.A[i][i]=1;}i=0;while(i<column-1){ intj,t,h=i;for(j=i;j<row-1;j++){if(jdz(A[j][i])<jdz(A[j+1][i]))h=j+1;}this->change(i+1,h+1);w.change(i+1,h+1);for(j=i+1;j<row;j++){ double k;k=A[j][i]/A[i][i];for(t=i;t<column;t++){A[j][t]=A[j][t]-k*A[i][t];w.A[j][t]=w.A[j][t]-k*w.A[i][t];}}i++;}if(this->A[row-1][column-1]==0){cerr<<"此矩阵求逆不成功,其所对应的方程组有无穷解!"<<endl; exit(1);} i=column-1;while(i>0){ int j, t;for(j=i-1;j>=0;j--){ double k;k=A[j][i]/A[i][i];for(t=i;t>j;t--){ A[j][t]=A[j][t]-k*A[i][t]; }for(t=column-1;t>=0;t--){w.A[j][t]=w.A[j][t]-k*w.A[i][t];}}i--;}intj,k;for(j=0;j<row;j++){ for(k=0;k<w.column;k++){w.A[j][k]=w.A[j][k]/this->A[j][j];} this->A[j][j]=this->A[j][j]/this->A[j][j];}return w;}}; void CMatrix::solve() //可逆线性矩阵求解{CMatrixx,w,c;x.setColunm(1);x.setRow(getColumn());w.setColunm(1);w.setRow(getColumn());c.setColunm(getColumn());c.setRow(getRow());int i;double z;for(i=1;i<=x.row;i++){ cout<<"请输入等式右侧的第"<<i<<"个值:";cin>>z;w.A[i-1][0]=z;}c.operator=(this->inverse());x.operator=(c.operator *(w));cout<<"求解结果:"<<endl;for(i=1;i<=x.row;i++)cout<<"X"<<i<<" = "<<x.A[i-1][0]<<endl;};void CMatrix::qxnh() //曲线拟合{cout<<"用矩阵曲线拟合:"<<endl;int i, j,k,t;double x, y;cout<<"请输入已知坐标点的个数:";cin>>i;CMatrix a(i,1), g(i,i) , w(i,1),c(i,i),q(i,i),p(i,i);for(j=1;j<=i;j++){ cout<<"请输入第"<<j<<"个已知点坐标(先横坐标后纵坐标):";cin>>x>>y;w.A[j-1][0]=y;g.A[j-1][0]=1.0;for(k=1;k<i;k++){ g.setValue(j,k+1,1.0);for(t=1;t<=k;t++)g.A[j-1][k]*=x;}}c=g.transpose();q=c*g;p=q.inverse();w=c*w;a=p*w;cout<<"Y="<<a.A[0][0];for(j=1;j<i;j++){ cout<<'+'<<'('<<a.A[j][0]<<')';for(k=0;k<j;k++)cout<<"*x";}cout<<endl;cout<<" 1 .求取其它点坐标 0. 退出 "<<endl; while(1){ cout<<"请选择:";cin>>k;switch(k){ case 1:{ double x, y,sum;cout<<"请输入待求点的横坐标(x):";cin>>x;y=a.A[0][0];for(j=1;j<i;j++){ sum=a.A[j][0];for(k=0;k<j;k++){sum*=x;}y+=sum;}cout<<"纵坐标:y="<<y<<endl; break;}case 0:{cerr<<"谢谢使用!"<<endl; exit(1);break;}default: cout<<"选择有误,请检查!"<<endl; break;} }};structCElvDif{double value; // 观测值double weight; // 权重long startPoint; // 起始点编号long endPoint; // 终点编号};//水准点类的设计structCLevelPoint{ // 高程平差值=高程值+高程值改正数long index; // 水准点编号double eleValue; // 高程值double dv; // 高程值改正数(初始化为0)bool isKnown; // 是否为已知点};classCElevationNet{public: // 成员函数CElevationNet(){numElvDif=0;numPoints=0;numKnPoint=0;}; // 构造函数~CElevationNet(){}; // 析构函数void input();void output();voidjsgc();intgetgz(){return numElvDif;} //返回观测值数目intgetzs(){return numPoints;} //返回总点数intgetys(){return numKnPoint;} //返回已知点数intgetws(){return numPoints-numKnPoint;} //返回未知点数double geteleValue(int i){return this->lpVec[i-1].eleValue;} //获得高程值 long getindex(int i){return lpVec[i-1].index;} //返回高程点编号void seteleValue(int i, double value){lpVec[i-1].eleValue+=value;} //修改高程值void setdv(inti,double value){this->lpVec[i-1].dv=value;} //修改改正数double getdv(int i){return lpVec[i-1].dv;} //返回改正数friend void xishu(CMatrix& B, CMatrix&X,CElevationNet A); //求取系数矩阵和未知点高程矩阵friend void quanzhen(CMatrix& Q, CElevationNet A); //求取权阵friend void l_zhen( CMatrix& l ,CMatrix& L, CElevationNet A); //求取观测值L矩阵和l阵private: // 成员变量intnumElvDif; // 高差总数intnumPoints; // 控制网中点的总数目intnumKnPoint; //控制网中已知点的数目CElvDifedVec[max]; // 观测值数组CLevelPointlpVec[max]; // 高程值数组};voidCElevationNet::input(){ inta,b,c,i;doublez,l,g;cout<<"请对已知点和未知点进行编号,注意已知点的编号应小于未知点的编号!"<<endl<<endl; cout<<"请输入控制网中水准点总数和已知点数:";cin>>a>>b;numPoints=a;numKnPoint=b;for(i=0;i<numPoints;i++){ lpVec[i].index=i+1;lpVec[i].eleValue=0.0;lpVec[i].dv=0.0;lpVec[i].isKnown=0;}for(i=0;i<numKnPoint;i++){ cout<<"请输入第"<<i+1<<"个已知点高程值:";cin>>z;lpVec[i].eleValue=z;lpVec[i].isKnown=1;}cout<<"请输入观测值个数:";cin>>c;numElvDif=c;for(i=0;i<numElvDif;i++){ cout<<"请输入第"<<i+1<<"段观测段的高差值(单位米)、长度(单位千米)、起始点编号和终点编号:"<<endl;cin>>g>>l>>a>>b;edVec[i].value=g;edVec[i].weight=l;edVec[i].startPoint=a;edVec[i].endPoint=b;}};voidCElevationNet::output(){int i;for(i=0;i<this->numPoints;i++)cout<<"编号为"<<this->lpVec[i].index<<"的点的高程值为:"<<this->lpVec[i].eleValue<<endl;for(i=0;i<this->numElvDif;i++)cout<<"观测段"<<i+1<<"的平差后的值为:"<<this->edVec[i].value<<endl;};void CElevationNet::jsgc(){ inti,j;for(i=0;i<this->numElvDif;i++){ if((lpVec[edVec[i].startPoint-1].eleValu e!=0.0)&&(lpVec[edVec[i].endPoint-1].eleVal ue==0.0)){lpVec[edVec[i].endPoint-1].eleValue=(l pVec[edVec[i].startPoint-1].eleValue)+(edVec[i].value);}elseif(lpVec[edVec[i].startPoint-1].eleValue==0 .0&&lpVec[edVec[i].endPoint-1].eleValue!=0.0){lpVec[edVec[i].startPoint-1].eleValue= (lpVec[edVec[i].endPoint-1].eleValue)-(edVe c[i].value);}}for(j=numKnPoint;j<this->numPoints;j++){if(this->lpVec[j].eleValue==0.0){for(i=0;i<this->numElvDif;i++){ if(this->edVec[i].startPoint==lpVec[ j].index&&this->lpVec[this->edVec[i].endPoi nt-1].eleValue!=0.0)this->lpVec[j].eleValue=this->lpVec[thi s->edVec[i].endPoint-1].eleValue-this->edVe c[i].value;elseif(this->edVec[i].endPoint==lpVec[j].index& &this->lpVec[this->edVec[i].startPoint-1].e leValue!=0.0){this->lpVec[j].eleValue=this->lpVec[this-> edVec[i].startPoint-1].eleValue+this->edVec [i].value;}}}//cout<<"第"<<this->lpVec[j].index<<"个点的高程近似值:"<<this->lpVec[j].eleValue<<endl;}};voidxishu(CMatrix& B, CMatrix&X,CElevationNet A){ inti,j;for(i=1;i<=B.getRow();i++)for(j=1;j<=B.getColumn();j++){ B.setValue(i,j,0);}for(i=0;i<A.numElvDif;i++){ if(A.lpVec[A.edVec[i].startPoint-1].isKn own==1&&A.lpVec[A.edVec[i].endPoint-1].isKn own==0){B.setValue(i+1,A.edVec[i].endPoint-A.numKn Point,1);}elseif(A.lpVec[A.edVec[i].startPoint-1].isKnown ==0&&A.lpVec[A.edVec[i].endPoint-1].isKnown ==1){ B.setValue(i+1,A.edVec[i].startPoint -A.numKnPoint,-1);}elseif(A.lpVec[A.edVec[i].startPoint-1].isKnown ==0&&A.lpVec[A.edVec[i].endPoint-1].isKnown ==0){ B.setValue(i+1,A.edVec[i].endPoint-A. numKnPoint,1);B.setValue(i+1,A.edVec[i].startPoint-A. numKnPoint,-1);}}for(i=0;i<X.getRow();i++)X.setValue(i+1,1,A.lpVec[A.numKnPoint+i ].eleValue);};void quanzhen(CMatrix& Q, CElevationNet A) {inti,j;double sum=0.0;for(i=0;i<A.numElvDif;i++)sum+=A.edVec[i].weight;sum=sum/A.numElvDif;for(i=1;i<=Q.getRow();i++)for(j=1;j<=Q.getColumn();j++){ Q.setValue(i,j,0);}for(i=1;i<=Q.getRow();i++)Q.setValue(i,i,sum/A.edVec[i-1].weight) ;};void l_zhen( CMatrix& l ,CMatrix& L, CElevationNet A){int i;double m;for(i=0;i<A.numElvDif;i++)L.setValue(i+1,1,A.edVec[i].value);for(i=0;i<l.getRow();i++){m=(A.lpVec[A.edVec[i].startPoint-1].ele Value+A.edVec[i].value-A.lpVec[A.edVec[i].e ndPoint-1].eleValue)*1000;l.setValue(i+1,1,m);}};void main(){CElevationNet A;A.input();A.jsgc();CMatrixB(A.getgz(),A.getws()),Q(A.getgz(),A.getgz( )),X(A.getws(),1),l(A.getgz(),1),b(A.getws( ),A.getgz()),V(A.getgz(),1);CMatrixNBB(A.getws(),A.getws()),x(A.getws(),1) ,N(A.getws(),A.getws()),L(A.getgz(),1),M(A. getws(),A.getgz()),R(A.getws(),A.getgz()),W (A.getws(),A.getgz());CMatrixvz(1,A.getgz()),vp(1,A.getgz()), p(1,1);xishu(B,X,A);quanzhen(Q,A);l_zhen(l,L,A);b.operator=(B.transpose());M.operator=(b.operator *(Q));NBB.operator=(M.operator *(B));N.operator=(NBB.inverse());R.operator=(N.operator *(b));W.operator=(R.operator *(Q));x.operator=(W.operator *(l));inti,j;for(i=A.getys()+1;i<=A.getzs();i++){A.setdv(i,(x.getValue(i-A.getys(),1)/1000));A.seteleValue(i,A.getdv(i));cout<<"平差后编号为"<<A.getindex(i)<<"的点高程值:"<<A.geteleValue(i)<<"米"<<endl;}V.operator=(B.operator *(x));V.operator-(l);for(j=0;j<V.getRow();j++)cout<<"第"<<j+1<<"段观测高差平差值为:"<<(L.getValue(j+1,1)+V.getValue(j+1,1)/100 0)<<"米"<<endl;vz.operator=(V.transpose());vp=(vz.operator *(Q));p=(vp.operator *(V));cout<<"平差后单位权中误差为:"<<"+_"<<sqrt(p.getValue(1,1)/A.getws())<<"毫米"<<endl;}。

水准网间接平差及可视化程序设计

水准网间接平差及可视化程序设计

水准网间接平差及可视化程序设计
段艳慧;葛于祥;张晓莹;郭伟
【期刊名称】《北京测绘》
【年(卷),期】2022(36)4
【摘要】针对测量平差烦琐的矩阵运算问题,本文利用矩阵实验室(matrix laboratory,MATLAB)平台进行水准网平差、精度评价与可视化展示。

由于间接平差误差方程式建立的规律性很强,而条件平差的条件方程式的规律不够明显,本文根据间接平差的原理进行程序设计并进行实例验证,实现了水准网间接平差的程序化及可视化表达,该程序的设计与可视化界面的设计降低了误差出现的概率,极大提高了水准网平差及精度评价的速度和精度,可应用于水准网间接平差的计算中。

【总页数】5页(P488-492)
【作者】段艳慧;葛于祥;张晓莹;郭伟
【作者单位】中国矿业大学(北京)地球科学与测绘工程学院;中国矿业大学环境与测绘学院
【正文语种】中文
【中图分类】P207
【相关文献】
1.粗差探测在水准网平差程序设计中的实现
2.基于Matlab的水准网间接平差程序设计
3.浅议同一水准网条件平差与间接平差处理之异同
4.水准网条件平差粗差检测程序设计方法
5.水准网条件平差粗差检测程序设计方法
因版权原因,仅展示原文概要,查看原文内容请购买。

水准网平差程序设计

水准网平差程序设计

程序设计中的关键问题
数据处理
如何高效地读取和处理大规模数据, 避免内存占用过多或计算效率低下。
算法优化
如何优化算法以提高程序的运行效率, 减少计算时间和资源消耗。
可扩展性
如何设计程序结构,使其具有良好的 可扩展性,便于未来功能扩展和维护。
健壮性
如何提高程序的健壮性,使其能够处 理异常情况,避免因数据错误或异常 输入导致程序崩溃。
05
程序测试与验证
测试环境与测试数据
测试环境
选择合适的硬件和软件环境,确保测试结果的准确性和可靠性。
测试数据
准备充足的水准网平差数据,包括已知的控制点数据和待处理的观测数据,以覆盖各种实际情况。
测试结果分析
精度分析
01
对测试结果进行精度分析,包括闭合差、中误差等指标,评估
程序的精度水平。
效率分析
06
总结与展望
工作总结
完成了水准网平差程序设 计的需求调研和分析,明 确了程序设计的目的和功 能要求。
实现了水准网平差程序的 基本功能,包括数据导入、 平差计算、结果输出等。
ABCD
完成了程序设计方案的制 定,包括算法选择、数据 结构设计和界面设计等。
对程序进行了全面的测试 和调试,确保程序的稳定 性和正确性。
水准网平差程序设计
• 引言 • 水准网平差基础 • 水准网平差程序设计 • 水准网平差程序实现 • 程序测试与验证 • 总结与展望
目录
01
引言
目的和背景
目的
水准网平差程序设计的主要目的是对水准网进行精度分析和优化,以提高测量 数据的准确性和可靠性。
背景
随着测量技术的发展,水准网在各种工程领域中得到了广泛应用,如建筑、水 利和交通等。然而,由于测量过程中存在误差,需要对水准网进行平差处理, 以消除或减小误差的影响。

水准网平差程序

水准网平差程序
int i; int MAXLINE =512; char buff[513],ch1[15]; CStdioFile fp; if( !fp.Open(filename,CFile::modeRead|CFile::typeText,NULL)) {
AfxGetApp()->m_pMainWnd->MessageBox( "数据文件不存在或数据文件错!", "进程. . . . . .!!!",MB_OK|MB_ICONSTOP);
//重要说明:原始数据文件中,未知点的高程可以随意输入,也可以不输入空缺, 程序自动把待定点高程赋值为 0
} for(i=ne;i<nz;i++) {
fp.ReadString(buff,MAXLINE); sscanf(buff,"%d%s%lf",&dh,ch1,&gc); dm[i]=ch1;H[i]=0; } for(i=0;i<nn;i++) { fp.ReadString(buff,MAXLINE); sscanf(buff,"%d%d%lf%lf",
教师 评语
// Gckzwpc.cpp: implementation of the CGckzwpc class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "Survey.h" #include "Gckzwpc.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CGckzwpc::CGckzwpc() { } CGckzwpc::~CGckzwpc() { } bool CGckzwpc::ReadData(CString filename) {

水准网间接平差程序设计

水准网间接平差程序设计

水准网间接平差程序设计水准网间接平差是测量水准网中各测站的高程值,通过观测值的处理,进行计算来消除观测误差,得到准确的高程数据。

在进行水准网间接平差程序设计时,需要考虑观测值的处理方法、具体的计算步骤、误差的传递和消除等因素。

下面将详细介绍水准网间接平差程序设计的内容。

首先,在水准网间接平差的程序设计中,需要对观测值进行处理。

观测值的处理包括检查观测数据的精度、合理性及完整性,并进行数据的筛选和滤波处理。

在这一步骤中,需要使用适当的统计方法对观测数据进行筛选,剔除异常值和明显错误的数据,保留符合要求的观测值。

接下来,在进行水准网间接平差计算之前,需要对网络进行拟合,拟合过程即将观测值与已知高程值进行比较,并进行拟合计算得到误差。

网络拟合可以使用最小二乘法进行计算,即通过最小化观测值与已知高程值的差的平方和,来求得最优拟合结果。

然后,进行水准网的平差计算。

平差计算是根据测站之间的观测关系,通过一系列的计算公式,将所有观测值联立起来,并通过方程组进行求解,得到最终的平差结果。

在这个过程中,需要进行传递误差的计算,即通过误差传递公式计算各点高程值的精度,以评估平差结果的可靠性。

最后,在完成水准网间接平差计算之后,需要对平差结果进行检查和评估。

检查结果是否符合工程要求和精度要求,评估平差的可靠性。

如果结果不符合要求,需要重新进行观测值的处理和计算。

在进行水准网间接平差程序设计时,还需要注意以下几点:1.数据的输入与输出:程序需要提供方便的数据输入和输出方式,以便用户输入观测数据,并输出平差结果。

同时,需要考虑数据的存储和传输方式,确保数据的安全和完整性。

2.程序的可扩展性:设计程序时应考虑未来可能的数据规模扩大和功能的增加。

通过模块化设计和灵活的架构,使程序能够方便地扩展和添加新的功能。

3.用户友好性:程序应提供简单易用的操作界面,提供友好的用户交互方式。

用户应能够方便地输入观测数据和设置计算参数,并能够直观地查看和分析计算结果。

水准间接平差程序设计说明书

水准间接平差程序设计说明书

地球科学与环境工程学院水准间接平差实验报告书课程名:《误差理论与测量平差基础》学号:姓名:黄黎东指导老师:日期: 2015年12月7日一、任务概述利用MATLAB或者C++编程间接平差程序,通过该程序读取观测数据文件,并计算出平差结果。

二、计算结果截图:图一图二图三图四三、水准网图四、输入的数据格式数据格式为TXT文件,如图所示:TXT文件格式说明:(1)第一行格式第一行分别表示观测个数5个,水准点数4个,未知点3个,已知点1个,所有数据用英文逗号隔开(2)已知点数据格式第二行开始是已知点点号和高程,一行列一个已知点点号和高程,由于该水准网只有一个已知点,所有只能列出一行。

图中表示已知点点号为1,高程为237.483m(3)测站起始点号格式(4)测站终点点号格式(5)高差格式(6)距离格式该部分表示测站的起始点点号该部分表示测站的终点点号该部分表示各测站的高差该部分表示各测站的距离S 五、流程图六、附件代码function SDJianJiePingCha()[FileName,PathName] = uigetfile('*.txt','打开水准观测数据');%打开文件f=csvread( strcat(PathName,FileName));%打开文件并存在矩阵f中point=f(1,2);%获取所有水准点个数n=f(1,1);%获得观测个数nt=f(1,3);%获得必要观测个数ty=f(1,4);%获得已知点个数yXX=zeros(point,1);%初始化XX阵等于0,方便下面把已知点高程和未知点参数估值放到XX阵B=zeros(n,t);%初始化B阵,方便下面求V=Bx-l中的系数阵B;for j=1:yXX(j,1)=f(j+1,2);%把已知点高程放到XX阵中enddata=f((2+y):end,:);%从文件中获取观测数据,并放到data阵中h=data(:,3);%从data中获取观测高差,并放到h阵中P=zeros(n);%初始化权阵Pfor j=1:nP(j,j)=10/data(j,4);%以10km观测值为单位权误差计算权阵Pendfor i=1:n%通过循环求B阵point1=data(i,1);%获取某个测站的起始点号point2=data(i,2);%获取某个测站的终点点号if point1>y&&point2>y%当某测站起始点和终点高程都未知时,求B阵第i行B(i,point1-y)=-1;B(i,point2-y)=1;elseif point1<=y&&point2>y%当起始点高程已知和终点高程未知时,求B阵第i 行B(i,point2-y)=1;XX(point2,1)=XX(point1,1)+h(i,1);%求第i个参数估值elseif point1>y&&point2<=y%当起始点高程未知和终点高程已知时,求B阵第i 行B(i,point1-y)=-1;XX(point1,1)=XX(point2,1)-h(i,1);%求第i个参数估值endendl=zeros(n,1);%初始化小l阵,方便下面求V=Bx-l中的系数阵l;for i=1:n%通过循环求小lpoint1=data(i,1);point2=data(i,2);l(i,1)=-(XX(point2,1)-XX(point1,1)-h(i,1));end%带入间接平差数学模型公式进行计算:r=n-t;%求多余观测数N=B'*P*B;W=B'*P*l;x=N\W;X=XX((y+1):end,1)+x; V=B*x-l;L=h+V;a0=sqrt(V'*P*V/r); Qxx=inv(N);Dxx=a0*a0*inv(N);%输出计算结果:disp('参数改正数:') x=x'disp('参数平差值:') X=X'disp('观测值改正数:') V=V'disp('观测值平差值:') L=L'disp('协方差阵:') Dxxdisp('单位权方差:') a0disp('协因数阵:') QxxBlPNWend。

水准网平差程序的设计与实现课程设计书

水准网平差程序的设计与实现课程设计书
void setRow(const int i) { row = i; }
int getRow() const { return row; }
void setColunm(const int i) { column = i; }
int getColumn() const { return column; }
六、附录(完整代码)
(要求:按照代码所属文件不同分别附上,且代码须有完整注释。)
#include<iostream.h>
#include<stdlib.h>
#include<iomanip.h>
#include<math.h>
#define max 50
class CMatrix
{
public:
CMatrix(){row=0; column=0;}; // 默认构造函数
二、设计内容
如图所示水准网, 和 是已知高程的水准点,并设这些点的已知高程无误差。图中P1和P2点是待定点。 和 点高程、观测高差和相应的水准路线长度见表4-3。试按间接平差法求各个待定点的平差高程。
表1 观测值与起始数据
线路号
观测高差(m)
水准路线长度(km)
已知高程(m)
1
+1.359
1
HA=35.000
V7=x2-x3-(h7-X2+X3)=x2-x3-1;
注意:(x和X的区别)
3.3 法方程构建与解算
由上式可得:
B=[1,0 , 0] L=[ 0 ] P=[ 2 ]
0,1,0 0 2
-1,0, 0 4 1
0, 0, 1 0 1
-1, 1, 0 7 2

测绘程序设计—实验八 水准网平差程序设计报告

测绘程序设计—实验八 水准网平差程序设计报告

《测绘程序设计》上机实验报告(Visual C++.Net)班级:测绘0901班学号: 04姓名:代娅琴2012年4月29日实验八平差程序设计基础一、实验目的巩固过程的定义与调用巩固类的创建与使用巩固间接平差模型及平差计算掌握平差程序设计的基本技巧与步骤二、实验内容水准网平差程序设计。

设计一个水准网平差的程序,要求数据从文件中读取,计算部分与界面无关。

1.水准网间接平差模型:2.计算示例:近似高程计算:3.水准网平差计算一般步骤(1)读取观测数据和已知数据;(2)计算未知点高程近似值;(3)列高差观测值误差方程;(4)根据水准路线长度计算高差观测值的权;(5)组成法方程;(6)解法方程,求得未知点高程改正数及平差后高程值;(7)求高差观测值残差及平差后高差观测值;(8)精度评定;(9)输出平差结果。

4.水准网高程近似值计算算法5.输入数据格式示例实验代码:#pragma onceclass LevelControlPoint{public:LevelControlPoint(void);~LevelControlPoint(void);public:CString strName;trName=pstrData[0];m_pKnownPoint[i].strID=pstrData[0];m_pKnownPoint[i].H=_tstof(pstrData[1]);m_pKnownPoint[i].flag=1;trName=pstrData[i];m_pUnknownPoint[i].strID=pstrData[i];m_pUnknownPoint[i].H=0;lag=0;pBackObj=SearchPointUsingID(pstrData[0]);pFrontObj=SearchPointUsingI D(pstrData[1]);ObsValue=_tstof(pstrData[2]);ist=_tstof(pstrData[3]);trID==ID){return &m_pKnownPoint[i];}}return NULL;}trID==ID){return &m_pUnknownPoint[i];}}return NULL;}LevelControlPoint* AdjustLevel::SearchPointUsingID(CString ID){LevelControlPoint* cp;cp=SearchKnownPointUsingID(ID);if(cp==NULL)cp=SearchUnknownPointUsingID(ID);return cp;}void AdjustLevel::ApproHeignt(void)lag!=1){pFrontObj->strID==m_pUnknownPoint[i].strID)&& m_pDhObs[j].cpBackObj->flag==1 ){ =m_pDhObs[i].cpBackObj->H - m_pDhObs[i].ObsValue;*/m_pUnknownPoint[i].H=m_pDhObs[j].cpBackObj->H + m_pDhObs[j].HObsValue;m_pUnknownPoint[i].flag=1;break;}}if(m_pUnknownPoint[i].flag!=1)pBackObj->strID==m_pUnknownPoint[i].strID)&& m_pDhObs[j].cpFrontObj->flag==1 ){ =m_pDhObs[j].cpFrontObj->H-m_pDhObs[j].HObsValue;/* m_pUnknownPoint[i].H=m_pDhObs[i].cpFrontObj->H+m_pDhObs[i].ObsValue;*/ m_pUnknownPoint[i].flag=1;break;}}}}if(i==m_iUnknownPointCount-1)lag!=1)ist);p(i,i)=value;}return p;}void AdjustLevel::FormErrorEquation(CMatrix &B, CMatrix &L){(m_iDhObsCount,m_iUnknownPointCount);(m_iDhObsCount,1);for(int i=0;i<m_iDhObsCount;i++)pBackObj->strID);tmpFront=SearchPointUsingID(m_pDhObs[i].cpFrontObj->strID);trID==tmpBack->strID)trID==tmpFront->strID)bsValue-(m_pDhObs[i].cpBackObj->H-m_pDhObs[i].cpFrontO bj->H);*/L(i,0)=m_pDhObs[i].HObsValue-(m_pDhObs[i].cpFrontObj->H - m_pDhObs[i].cpBackObj->H);(_T("%.3f"),L(i,0));L(i,0)=_tstof(tmp);L(i,0)=L(i,0)*1000;+=x(i,0);xt"));xt"));if()==IDCANCEL) return;CString strFileName=();setlocale(LC_ALL,"");CStdioFile sf;if(!(strFileName, CFile::modeCreate|CFile::modeWrite)) return;(LevleContent);();UpdateData(FALSE);}void CIndircLelveDlg::OnBnClickedComputelevel(){f\r\n"), [i].strID,[i].H);LevleContent+=Temp;}(_T("单位权中误差:%.1f mm\r\n"),r0*1000);LevleContent+=Temp;LevleContent+=_T("未知点高程中误差(mm):\r\n");for(int i=0;i< ;i++){();(_T("%s,%.1f\r\n"),[i].strName,Qx[i]*1000);LevleContent+=Temp;}UpdateData(false);}void CIndircLelveDlg::OnBnClickedSavelevleresult(){xt"));if()==IDCANCEL) return;CString strFileName=();setlocale(LC_ALL,"");CStdioFile sf;if(!(strFileName, CFile::modeCreate|CFile::modeWrite)) return;(LevleContent);();UpdateData(FALSE);}三、实验结果打开文件数据:平差结果:四、实验心得这从实验是我们测绘程序设计的最后一次实验,虽然这个学期我们做了好几次相关的实验,但是我却发现自己学的东西也越来越模糊,感觉很多内容都不理解。

第三章--水准网平差程序设计课件

第三章--水准网平差程序设计课件
待定点高程计算是为了得到未知点的高程近 似值,在求取未知点近似高程的时候,要注意测 段的方向及相关正负号。既可以进行人工计算后 输入到程序中,也可以直接将原始数据直接读入 到程序中,根据相关算法让程序自动计算。计算 原理如下式:
26
水网观测数据(测段)的组织:
测段号 起点 终点
第三章 水准网平差程序设计
本章难点:
1、近似高程计算 2、最短路线的计算 3、误差方程及法方程的构建 4、直接计算出法方程的系数矩阵BTPB和常 数矩阵BTPL
1
一、水准网间接平差算法概述
该课程中所采用的平差模型为间接平差,即所
选的独立参数的个数等于必要观测数,这样可以 将每个观测值表示成这t个参数的函数,组成观测
20
最短路线搜索函数 FindShortPath (p as integer, exclude as integer, int neighbor()as integer,diff() as double, S() as double) b)路线闭合差计算算法
从一个已知点出发用观测高差依次推算其它
各点的高程,最后闭合到另外一个已知点上,闭
1
AB
2
EC
3
DC
4
BC
5
AD
6
AC
7
AF
测段高差(m)
5.835 1.006 7.384 3.782 2.270 9.64 0.003
测段长(km) 测站数
1.5 0.8 2.1 3.2 1.7 1.3
4.1
27
水准网近似高程计算算法
1、定义一数组a(),将已知点(原有高程 和计算出的近似高程都可视为已知点) 存 到a()数组中; 2、遍历所有测段(从第一个测段到最后 一个测段);

水准网平差程序设计

水准网平差程序设计

水准网平差程序设计水准测量是现今城市测量工作中测定高程和对建筑物进行变形观测常用的测量方法。

水准网平差的目的在于依据最小二乘原理,消除观测之间的矛盾和不符值,进而求出点的最后高程及评定精度,编制相应的计算程序,实现水准网的自动平差,才能提高计算效率,然而近似高程的自动推算、闭合差的计算、以及误差方程、法方程的列立解算是程序设计的重点和难点。

标签:水准网平差;高程;程序设计1 数据库的建立1.1 建立建网信息表格建网信息表用于保存建网信息。

1.2 建立观测高差录入表格记录高差和高差起点终点点号和两点之间的距离。

1.3建立已知高程录入表格记录高程用于以后计算。

1.4建立平差成果表用于记录和输出结果。

2 应用软件用户界面的设计本程序共设计了五个窗体,分别为主窗体,建网信息输入窗体,测量高差输入窗体,已知高程输入窗体,平差计算结果显示窗体。

其中主窗体是程序的启动窗体,所有窗体都从主窗体界面弹出。

建网信息输入窗体用于输入项目名称,测量单位,负责人,测量范围,备注信息,并于数据库连接。

测量高差输入窗体用于输入高差观测值和路线长度,并和数据库连接。

已知高程输入窗体用于输入已知高程,并连接数据库。

平差计算结果显示窗体聚集了大部分的算法,包括待定点高程计算,误差方程和法方程的列立,法方程的运算等等,并通过DataGrid控件输出。

3 程序算法的基本思想及部分代码3.1 高程控制网间接平差的步骤(1)计算待定点的近似高程X=(x1,x2 …)T;(2)列出误差方程;(3)组成法方程;(4)解算法方程,求得dX=(dx1,dx2 …)T;(5)求得平差后的高程X=X+dX;(6)精度评定。

3.2 网形的编号及部分变量的定义3.2.1 网形编号为了使编程更加方便,首先约定各高程点编号由小到大按自然数的顺序编码,不可重复也不可缺少。

已知点优先于待定点,靠近已知点的待定点编号要尽量小。

3.2.2 部分变量定义Option Base 1Public IKP As Integer’已知点点个数;Public IUP As Integer’未知点点个数;Public IQ As Integer’总点个数;Public IOH As Integer’高差观测数;Public IZ As Integer’必要观测数。

水准网平差程序设计

水准网平差程序设计

水准网平差程序设计水准网平差是测绘工程中的一项重要工作,它涉及到对水准测量数据进行处理,以达到测量精度的要求。

水准网平差程序设计通常需要考虑以下几个方面:1. 程序设计的目的和意义水准网平差程序设计的主要目的是通过计算机软件对水准测量数据进行自动化处理,提高数据处理的效率和准确性。

这对于大型工程测量、城市基础设施建设、土地管理等领域具有重要意义。

2. 程序设计的基本要求- 准确性:程序需要能够准确地处理水准测量数据,减少人为误差。

- 稳定性:程序在运行过程中应具有较高的稳定性,避免因系统崩溃等原因导致数据丢失。

- 用户友好性:程序应具备良好的用户界面,使得非专业用户也能方便地使用。

- 扩展性:程序设计应考虑未来可能的功能扩展,以适应不断变化的测量需求。

3. 程序设计的理论基础水准网平差程序设计的理论基础主要包括:- 水准测量原理:了解水准测量的基本原理,包括视线高、转点高、已知点高程等概念。

- 误差理论:掌握测量误差的来源、分类及其对测量结果的影响。

- 最小二乘法:水准网平差通常采用最小二乘法进行数据处理,需要理解其数学原理和应用方法。

4. 程序设计的关键技术- 数据输入:设计高效的数据输入界面,支持多种数据格式的导入。

- 数据处理:实现数据的自动校验、筛选和处理功能。

- 平差计算:编写平差计算算法,包括闭合差计算、误差分配等。

- 结果输出:设计结果输出模块,支持多种输出格式,如文本、图表等。

5. 程序设计的实现步骤1. 需求分析:明确程序设计的目标和用户需求。

2. 系统设计:设计程序的整体架构,包括模块划分、数据流等。

3. 编码实现:根据设计文档进行编码,实现各个功能模块。

4. 测试验证:对程序进行测试,确保其准确性和稳定性。

5. 用户手册编写:编写用户手册,指导用户如何使用程序。

6. 程序设计的注意事项- 数据安全:确保程序在处理数据时的安全性,防止数据泄露。

- 异常处理:程序应能妥善处理各种异常情况,如数据格式错误、计算溢出等。

(完整)C语言间接平差程序

(完整)C语言间接平差程序

教材《误差理论与测量平差基础》第二版武汉大学出版社P108页的例7—1的运行结果:源程序:#define N 5 /*N是观测值个数*/#define T 3 /*T是必要观测数*/#include<stdio.h>#include<math。

h>float Nbb[T][T],Nb[T][T],W[T][1],x[T][1];main(){float D(float a[T][N],float b[N][N],float c[N][T]);float K(float a[T][N],float b[N][N],float c[N][1]);float G(float a[T][T]);float F(float ca[T-1][T—1]);float DM(float a[1][N],float b[N][N] ,float c[N][1]);int i,j,m,n;float B[N][T],BT[T][N],V[N][1],VT[1][N],P[N][N],C[N][1],Bx[N][1],f,g,h,x1; printf("请输入V的系数B[N][T]:\n”);for(i=0;i<N;i++)for(j=0;j〈T;j++)scanf(”%8f”,&B[i][j]);printf("请输入观测值的权阵P[N][N]:\n");for(i=0;i<N;i++)for(j=0;j<N;j++)scanf("%8f”,&P[i][j]);printf("请输入常数C[N][1]:\n”);for(i=0;i〈N;i++)for(j=0;j<1;j++)scanf(”%8f”,&C[i][j]);for(i=0;i〈N;i++)for(j=0;j<T;j++)BT[j][i]=B[i][j];g=D(BT, P, B);h=K(BT, P, C);f=G(Nbb);for(i=0;i〈T;i++)for(j=0;j〈1;j++){x[i][j]=Nb[i][0]*W[0][j];for(m=1;m〈T;m++)x[i][j]+=(Nb[i][m]*W[m][j]);}for(i=0;i〈T;i++)x[i][0]=x[i][0]/f;for(i=0;i〈N;i++)for(j=0;j〈1;j++){Bx[i][j]=B[i][0]*x[0][j];for(m=1;m〈T;m++)Bx[i][j]+=(B[i][m]*x[m][j]);}for(i=0;i〈N;i++)V[i][0]=(Bx[i][0]-C[i][0]);for(i=0;i<N;i++)for(j=0;j〈1;j++)VT[j][i]=V[i][j];x1=DM(VT,P,V);x1=x1/(N-T);printf("参数x[T][1]=\n");for(i=0;i〈T;i++)printf("%15f",x[i][0]);printf("\n");printf("改正数V[N][1]=\n”);for(i=0;i<N;i++)printf("%15f”,V[i][0]);printf("\n单位权中误差x1=%15f”,sqrt(x1)); printf("\n协因数阵Qxx[T][T]:\n");for(i=0;i<T;i++){for(j=0;j〈T;j++)printf(”%15f”,Nb[i][j]/f);printf(”\n");}}float G(float a[T][T]){int i,j,m,n;float c[T—1][T—1],y=0;for(i=0;i<T;i++)for(j=0;j<T;j++){for(m=0;m<T;m++)for(n=0;n〈T;n++){if(m〈i&&n<j)c[m][n]=a[m][n];if(m>i&&n〈j)c[m-1][n]=a[m][n];if(m<i&&n>j)c[m][n—1]=a[m][n];if(m>i&&n>j)c[m-1][n-1]=a[m][n];}if((i+j)%2==0)Nb[j][i]=F(c);elseNb[j][i]=(-1)*F(c);}for(m=0;m<T;m++)y+=(a[0][m]*Nb[m][0]);return (y);}float F(float ca[T—1][T—1]){int i,j,m,n,s,t,k=1;float f=1,c,x,sn;for (i=0,j=0;i<T—1&&j〈T—1;i++,j++){if (ca[i][j]==0){for (m=i;ca[m][j]==0;m++);if (m==T—1){sn=0;return (sn);}elsefor (n=j;n<T—1;n++){c=ca[i][n];ca[i][n]=ca[m][n];ca[m][n]=c;}k*=(-1);}for (s=T—2;s>i;s--){x=ca[s][j];for (t=j;t〈T-1;t++)ca[s][t]—=ca[i][t]*(x/ca[i][j]);}}for (i=0;i<T-1;i++)f*=ca[i][i];sn=k*f;return (sn);}float D(float a[T][N],float b[N][N] ,float c[N][T]){int i,j,m;float d[T][N];for(i=0;i<T;i++)for(j=0;j〈N;j++){d[i][j]=a[i][0]*b[0][j];for(m=1;m〈N;m++)d[i][j]+=(a[i][m]*b[m][j]);}for(i=0;i〈T;i++)for(j=0;j〈T;j++){Nbb[i][j]=d[i][0]*c[0][j];for(m=1;m〈N;m++)Nbb[i][j]+=(d[i][m]*c[m][j]);}return (Nbb[0][0]);}float K(float a[T][N],float b[N][N],float c[N][1]){int i,j,m;float d[T][N];for(i=0;i<T;i++)for(j=0;j<N;j++){d[i][j]=a[i][0]*b[0][j];for(m=1;m<N;m++)d[i][j]+=(a[i][m]*b[m][j]);}for(i=0;i<T;i++)for(j=0;j〈1;j++){W[i][j]=d[i][0]*c[0][j];for(m=1;m〈N;m++)W[i][j]+=(d[i][m]*c[m][j]);}return (W[0][0]);}float DM(float a[1][N],float b[N][N] ,float c[N][1]){int i,j,m;float d[1][N],x;for(i=0;i〈1;i++)for(j=0;j<N;j++){d[i][j]=a[i][0]*b[0][j];for(m=1;m<N;m++)d[i][j]+=(a[i][m]*b[m][j]);}for(i=0;i<1;i++)for(j=0;j<1;j++){x=d[i][0]*c[0][j];for(m=1;m<N;m++)x+=(d[i][m]*c[m][j]);}return (x);}程序说明:1) 用该程序前,根据具体情况输入N和T;2)该程序中的(N-T)自由度(即多余观测数)必须大于等于2,不然程序运行时会出错,原因在于求行列式的逆时,有语句for (s=R-2;s>i;s—-),R=1时s=-1。

基于Matlab的水准网间接平差程序设计

基于Matlab的水准网间接平差程序设计

基于Matlab的水准网间接平差程序设计赵亚红;周文国【摘要】设计水准网数据结构,存储在文本中,按照水准网的起点、终点、观测数据相对应关系建立矩阵,利用Matlab强大的矩阵运算功能,通过间接平差方法,按照最小二乘原理,求得任意水准网的未知点的最或然高程值,对平差结果输出存储,程序直观、简便。

并用实例验证了其正确性及通用性。

%On the basis of data structure designed, the relation of point s and lines of level net, the surveying data and the known data are st ored in the text, the matrixs were set up through the relation of the jupping -off points, end -points and the surveying data. And a program is designed in MATLAB to get the value of most probable by its strong abilty of calculating matrix, the result was output and stored. At last,the example proved the programme was right.【期刊名称】《华北科技学院学报》【年(卷),期】2011(008)003【总页数】3页(P58-60)【关键词】水准网;间接平差;Matlab【作者】赵亚红;周文国【作者单位】华北科技学院土木工程系,北京东燕郊101601;华北科技学院土木工程系,北京东燕郊101601【正文语种】中文【中图分类】P207.2水准网间接平差的的具体过程是:(1)根据水准网形进行分析,列误差方程;(2)根据误差方程系数列法方程;(3)解算法方程,求参数X及V;(4)求最或然值、精度评定。

毕业设计--水准网条件平差程序设计[管理资料]

毕业设计--水准网条件平差程序设计[管理资料]

本科生毕业设计说明书(毕业论文)题目:水准网条件平差程序设计水准网条件平差程序设计摘要近年来,随着我国经济的快速发展,国家大力于投资各种铁路建设和公路建设,测绘工程的运用也越来越突出。

以水准网布设的高程控制网在各类工程中随处可见。

但观测到的数据存在着各种各样的误差,这就需要我们通过简易平差或严密平差来对数据进行处理,从而使数据能够达到工程的预期精度。

本文主要研究如何解决绘图软件行业标准的网络数据处理问题。

从水准网的结构,平差基本原理、调整模型,基本方程及其解,并对法方程组成,求解,平差值的计算及其精度评定作了介绍。

和Visual ,利用C语言是程序设计的相干事情。

在今后的测量工作中,可结合实际平差方案进行平差计算。

关键词:平差模型;精度评定;程序设计Leveling Network Adjustment Program DesignAbstractIn recent years, with China's rapid economic development, the state vigorously investment in all kinds of railway construction and road construction, the use of mapping project is also more and more prominent. In order to control the network level network in various engineering in everywhere. But the observed data exist various error, this needs us through simple adjustment or rigorous adjustment for data processing, so that data to achieve the desired precision engineering.This paper mainly studies how to solve the problem of mapping software industry standard network data processing. From the structure adjustment of leveling network, the basic principle, adjustment model, basic equation and its solution, and the composition of the solution of equations, adjustment calculation and precision evaluation, gross error elimination are introduced as well. And the use of Visual programming software, using C programming language is related to program design. The measurement work in the future, can be combined with the actual adjustment adjustment calculation.Key words: adjustment model;the accuracy assessment;program design目录摘要 (I)Abstract .......................................................................................................................... I I 第一章绪论 (1) (1) (2) (2)第二章条件平差数学模型 (3)条件平差模型 (3) (6) (8) (11) (13) (17)第三章水准网的设计 (18) (18) (18) (19) (19) (20)第四章C语言介绍 (21) (21) (22) (22)第五章程序设计 (24)水准网条件平差和测角网条件平差实例 (24) (24) (27) (32)参考文献 (57)附录A:外文文献 (57)附录B:中文译文 (69)致谢 (74)第一章绪论施工测量工作是非常基本的,重要环节。

水准网平差程序设计

水准网平差程序设计
4)点名信息:该部分占N(N=N1+N2)行,每行 格式为
水准点编号,该点名称
其中点名长度不超过8个字符,即4个汉字。但最好 用字符串命名。
以下为一具有两个已知点、三个待定点和七个测段的
水准网的示例数据,打开TXT文件文件后,内容如下。
2,3,7 4 , 5.016 5 , 6.016 1 , 4 , 1 , 1.359 , 1.1 2 , 4 , 2 , 2.009 , 1.7 3 , 5 , 1 , 0.363 , 2.3 4 , 5 , 2 , 1.012 , 2.7 5 , 1 , 2 , 0.657 , 2.4 6 , 1 , 3 , 0.238 , 1.4 7 , 3 , 5 ,-0.595 , 2.6 1 ,P1 2 ,P2 3 ,P3 4 ,A 5 ,B
组建误差方程,即 B、l的生成
代入相应的公式 进行计算 x 、v
计算待求量 的平差植
精度评定 成果输出
2.1 水准网平差中数据的组织(数据文 件格式的设计)
水准网平差程序设计中数据的组织是一个关键 问题。文件格式的设计就是规定数据文件中包含 的内容、各类数据的先后顺序以及各种数据的书 写格式。从程序设计者的角度来说,数据文件格 式设计相当于告诉用户应当怎样准备数据文件, 当然,程序中也必须按照约定的格式从文件中读 取数据。数据文件由四个部分组成,其格式如下。 1)基本信息部分:该部分仅占一行,其内容为 已知点数N1,未知点数N2,高差观测值个数NS。
设p1选择p2作为邻接点,P2到目标点的路线长
度为S2, p1到p2的路线长度为S12,则p1到目标点 的路线长度S1为
S1=S2+S12 若还有一点P3也是P1的邻接点,则经由P3到 目标点的路线长度为

windows绘图和水准网平差c++代码

windows绘图和水准网平差c++代码

Windows绘图#include "stdafx.h"#include "cbs.h"#include "cbsDoc.h"#include "cbsView.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////// //////////////////////////////////// CCbsViewIMPLEMENT_DYNCREATE(CCbsView, CView)BEGIN_MESSAGE_MAP(CCbsView, CView)//{{AFX_MSG_MAP(CCbsView)ON_WM_MOUSEMOVE()ON_WM_LBUTTONDOWN()ON_WM_LBUTTONUP()//}}AFX_MSG_MAP// Standard printing commandsON_COMMAND(ID_FILE_PRINT,CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)END_MESSAGE_MAP()/////////////////////////////////////////// //////////////////////////////////// CCbsView construction/destruction CCbsView::CCbsView(){// TODO: add construction code herethis->m_bDragging=false;}CCbsView::~CCbsView(){}BOOL CCbsView::PreCreateWindow(CREATESTRUCT& cs){// TODO: Modify the Window class or styles here by modifying// the CREATESTRUCT csreturn CView::PreCreateWindow(cs);}/////////////////////////////////////////// //////////////////////////////////// CCbsView drawingvoid CCbsView::OnDraw(CDC* pDC){CCbsDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data here /* pDC->SetMapMode(MM_TEXT);pDC->Rectangle(CRect(50, 50, 100, 100));// 直接基于屏幕绘制pDC->SetMapMode(MM_TEXT);//pDC->SetWindowOrg(50, 50); //屏幕左上角的坐标设置为(50, 50)pDC->Rectangle(CRect(50, 50, 100, 100));pDC->SetMapMode(MM_TEXT);pDC->SetViewportOrg(50,50);//当前原点位置移动到(50, 50)的位置pDC->Rectangle(CRect(50, 50, 100, 100));pDC->SetMapMode(MM_TEXT);pDC->SetViewportOrg(100,100); // 当前原点位置移动到(50, 50)的位置pDC->SetWindowOrg(50, 50); // 当前的原点坐标设置为(50, 50)pDC->Rectangle(CRect(100, 100, 100, 100));pDC->SetWindowOrg(100,100);*/pDC->SetViewportOrg(150,150); // 当前原点位置移动到(50, 50)的位置COLORREF rgbBkClr = RGB(192,192,192);// 定义灰色pDC->SetBkColor(rgbBkClr);// 背景色为灰色pDC->SetTextColor(RGB(0,0,128));// 文本颜色为兰色pDC->TextOut(250,10,"我*****的*****绘*****图*****板!");CPen *pPenOld, PenNew;int nPenStyle[]= { PS_SOLID, // 实线PS_DOT,// 点线PS_DASH,// 虚线PS_DASHDOT,// 点划线PS_DASHDOTDOT, // 双点划线PS_NULL,// 空的边框PS_INSIDEFRAME,// 边框实线};char *strStyle[]={"Solid", "Dot", "Dash", "DashDot","DashDotDot", "Null", "InsideFrame"};pDC->TextOut(50, 65, "用不同样式的画笔绘图"); pDC->TextOut(400, 40, "***制作者***陈斌生***");for(int i=0; i<7; i++){ // 用不同样式的画笔绘图if(PenNew.CreatePen(nPenStyle[i],1,RGB(0,0, 0))){ //创建画笔pPenOld=pDC->SelectObject(&PenNew);// 选择画笔pDC->TextOut(45,90+20*i,strStyle[i]);pDC->MoveTo(150,100+20*i);pDC->LineTo(200,100+20*i);pDC->SelectObject(pPenOld);// 恢复原来的画笔PenNew.DeleteObject();// 删除底层的GDI对象}else {MessageBox("不能创建画笔!"); } }char *strWidth[]={"1", "2", "3", "4", "5", "6", "7"};pDC->TextOut(260, 65, "用不同宽度的画笔绘图");for(i=0; i<7; i++){ // 用不同宽度的画笔绘图if(PenNew.CreatePen(PS_SOLID,i+1,RGB(0, 0,0))){ // 创建画笔pPenOld=pDC->SelectObject(&PenNew); // 选择画笔pDC->TextOut(260,90+20*i,strWidth[i]);pDC->MoveTo(300, 100+20*i);pDC->LineTo(400, 100+20*i);pDC->SelectObject(pPenOld);// 恢复原来的画笔PenNew.DeleteObject();// 删除底层的GDI对象}else { MessageBox("不能创建画笔!"); }}char *strColor[]={"红","绿","蓝","黄","紫","青","灰"};COLORREF rgbPenClr[]={RGB(255,0,0), RGB(0,255,0),RGB(0,0,255), RGB(255,255,0), RGB(255,0,255),RGB(0,255,255),RGB(192,192,192)};pDC->TextOut(460,65,"用不同颜色的画笔绘图");for(i=0; i<7; i++){ // 用不同颜色的画笔绘图CPen *pPenNew=new CPen(PS_INSIDEFRAME,10,rgbPenClr[i]);// 创建画笔的另一种方法pPenOld=pDC->SelectObject(pPenNew);// 选择创建的画笔pDC->TextOut(460,90+20*i, strColor[i]);pDC->MoveTo(500,100+20*i);pDC->LineTo(600,100+20*i);pDC->SelectObject(pPenOld); // 恢复原来的画笔delete pPenNew; // 自动删除底层的GDI对象}}/////////////////////////////////////////// //////////////////////////////////// CCbsView printingBOOL CCbsView::OnPreparePrinting(CPrintInfo* pInfo){// default preparationreturn DoPreparePrinting(pInfo);} void CCbsView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add extra initialization before printing}void CCbsView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add cleanup after printing}/////////////////////////////////////////// //////////////////////////////////// CCbsView diagnostics#ifdef _DEBUGvoid CCbsView::AssertValid() const{CView::AssertValid();}void CCbsView::Dump(CDumpContext& dc) const {CView::Dump(dc);}CCbsDoc* CCbsView::GetDocument() // non-debug version is inline{ASSERT(m_pDocument->IsKindOf(RUNTIME_CL ASS(CCbsDoc)));return (CCbsDoc*)m_pDocument;}#endif //_DEBUG/////////////////////////////////////////// //////////////////////////////////// CCbsView message handlersvoid CCbsView::OnMouseMove(UINT nFlags, CPoint point)// TODO: Add your message handler code here and/or call defaultif(m_bDragging){CClientDC dc(this);OnPrepareDC(&dc);dc.DPtoLP(&point);dc.MoveTo(this->m_ptOrigin);dc.LineTo(point);m_ptOrigin = point;}CView::OnMouseMove(nFlags, point);}void CCbsView::OnLButtonDown(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultCClientDC dc(this);OnPrepareDC(&dc); // 调整设备环境的属性dc.DPtoLP(&point); // 将设备坐标转换为逻辑坐标SetCapture(); // 捕捉鼠标//::SetCursor(m_hCross); // 设置十字光标m_ptOrigin=point;m_bDragging=TRUE; // 设置拖拽标记CView::OnLButtonDown(nFlags, point);}void CCbsView::OnLButtonUp(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultm_bDragging = false;ReleaseCapture();CView::OnLButtonUp(nFlags, point);}结果水准网平差结果#include<iostream.h>#include<stdlib.h>#include<iomanip.h>#include<math.h>#define max 50class CMatrix{public:CMatrix(){row=0; column=0;}; // 默认构造函数CMatrix(int i, int j){row=i;column=j;} // 构造函数一CMatrix(const CMatrix& m); // 复制构造函数~CMatrix(void){/*cout<<"谢谢使用,矩阵所占空间以释放!"<<endl;*/} // 默认析构函数CMatrix& operator=(const CMatrix& m); // 赋值运算符bool operator==(const CMatrix& m); // 比括较运算符bool operator!=(const CMatrix& m); // 比括较运算符CMatrix operator+(const CMatrix& m); // 加运算符CMatrix operator-(const CMatrix& m); // 减运算符CMatrix& operator+=(const CMatrix& m); // 自加运算符CMatrix& operator-=(const CMatrix& m); // 自减运算符CMatrix operator-();// 取负数CMatrix& operator*(const CMatrix& m); // 乘法运算符void input(); //输入矩阵void outputMatrix(); // 输出该矩阵void setValue(int row, int column, double value) { A[row-1][column-1] = value; }// 设置(i,j)的值double getValue(int row, int column) const { return A[row-1][column-1]; }// 设置行、列的值void setRow(const int i) { row = i; }int getRow() const { return row; }void setColunm(const int i) { column = i; }int getColumn() const { return column; }CMatrix& change(int i, int j);//交换矩阵的行CMatrix& transpose(); // 矩阵转置CMatrix& inverse(); // 矩阵求逆void find(int& f)const;// 判断该矩阵是否可用于迭代求解friend void jocabi(const CMatrix& a) ; //迭代求解void lzys(); //列主元素法求解void solve(); //可逆线性矩阵求解void qxnh(); //曲线拟合private:// 成员变量double A[max][max];int row;// 行int column;// 列};void CMatrix::input() //输入{ cout<<"开始输入矩阵值:"<<endl;int i, j;double z;for(i=0;i<row;i++){ cout<<"请输入第"<<i+1<<"行的值:"<<endl;for(j=0;j<column;j++){ cin>>z;A[i][j]=z;}}cout<<endl;};CMatrix::CMatrix(const CMatrix& m) // 复制构造函数{ int i, j;for(i=0;i<m.row;i++)for(j=0;j<m.column;j++)this->A[i][j]=m.A[i][j];};CMatrix& CMatrix::operator=(const CMatrix& m) // 赋值运算符{int i,j;for(i=0;i<row;i++){for(j=0;j<column;j++)A[i][j]=m.A[i][j];}return *this;};bool CMatrix::operator ==(const CMatrix& m) // 比括较运算符{ int i,j,k;for(i=0;i<m.row;i++){ for(j=0;j<m.column;j++)if(this->A[i][j]=m.A[i][j])k=1;else k=0;}if(k=1) return true;else return false;};bool CMatrix::operator !=(const CMatrix& m) // 比括较运算符{ int i,j,k;for(i=0;i<m.row;i++){ for(j=0;j<m.column;j++)if(this->A[i][j]=m.A[i][j])k=1;else k=0;}if(k=0) return true;else return false;};CMatrix CMatrix::operator+(const CMatrix& m)// 加运算符{ int i,j;if((this->row==m.row)&&(this->column==m .column)){ for(i=0;i<m.row;i++)for(j=0;j<m.column;j++)this->A[i][j]+=m.A[i][j];}else { cout<<"此两矩阵不能相加,请检查!"<<endl; }return *this;};CMatrix CMatrix::operator-(const CMatrix& m)// 减运算符{ int i,j;if((this->row==m.row)&&(this->column==m.column)){ for(i=0;i<m.row;i++)for(j=0;j<m.column;j++)this->A[i][j]-=m.A[i][j];}else { cout<<"此两矩阵不能相加,请检查!"<<endl; }return *this;};CMatrix& CMatrix::operator+=(const CMatrix& m) //自加运算符{ int i,j;for(i=0;i<m.row;i++)for(j=0;j<m.column;j++)this->A[i][j]=2*m.A[i][j];return *this;};CMatrix& CMatrix::operator-=(const CMatrix& m) //自减运算符{ int i,j;for(i=0;i<m.row;i++)for(j=0;j<m.column;j++)this->A[i][j]=m.A[i][j]-m.A[i][j];return *this;};void CMatrix::find(int& f)const{ int i;for(i=0;i<this->row;i++) if(this->A[i][i]!=0) f=1;else f=0;};CMatrix CMatrix::operator-() // 取负数{ int i,j;for(i=0;i<this->row;i++)for(j=0;j<this->column;j++)this->A[i][j]=-this->A[i][j];return *this;};CMatrix& CMatrix::operator*(const CMatrix& m) // 乘法运算符{ int i,j,t;CMatrix n;if(this->column==m.row){for(i=0;i<this->row;i++)for(j=0;j<m.column;j++){ double sum=0.0;for(t=0;t<m.row;t++)sum+=this->A[i][t]*m.A[t][j];n.A[i][j]=sum;}}else {cerr<<"此两矩阵不能相乘,请检查!"<<endl; exit(1);}return n;};void CMatrix::outputMatrix()// 输出该矩阵{ int i,j;for(i=1;i<=row;i++){ for(j=1;j<=column;j++)cout<<A[i-1][j-1]<<" ";cout<<endl;}};CMatrix& CMatrix::transpose()// 矩阵转置{ int i,j;CMatrix m(this->column,this->row);for(i=0;i<this->row;i++)for(j=0;j<this->column;j++){ m.A[j][i]=this->A[i][j];}return m;};void jocabi(const CMatrix& a) //高斯迭代求解{ int f=1;a.find(f);if(f==0) {cerr<<"该矩阵不满足迭代求解条件!"<<endl; exit(1); }else{CMatrix x,w;x.setColunm(1);x.setRow(a.getColumn());w.setColunm(1);w.setRow(a.getColumn());int i;double z;for(i=1;i<=x.row;i++){ cout<<"请输入等式右侧的第"<<i<<"个值:";cin>>z;w.A[i-1][0]=z;}for(i=1;i<=x.row;i++){ cout<<"请输入X"<<i<<"的近似值:";cin>>z;x.setValue(i, 1, z);}i=1;while(i<=20){ int j, k;for(j=1;j<=x.row;j++){ double sum=0.0;for(k=1;k<j;k++){sum=sum-(a.A[j-1][k-1])*(x.A[k-1][0]);}for(k=j+1;k<=x.row;k++){sum=sum-(a.A[j-1][k-1])*(x.A[k-1][0]); }sum+=w.A[j-1][0];x.A[j-1][0]=sum/a.A[j-1][j-1];}i++;}for(i=1;i<=x.row;i++)cout<<"X"<<i<<" = "<<x.A[i-1][0]<<endl; }};double jdz(double a) //绝对值{ if(a>0.0) return a;else return -a;};CMatrix& CMatrix::change(int i, int j)//交换矩阵的行{ int k;double z;for(k=1;k<=this->column;k++){ z=A[i-1][k-1];A[i-1][k-1]=A[j-1][k-1];A[j-1][k-1]=z;}return *this;};void CMatrix::lzys() //列主元素法求解{ CMatrix x,w;x.setColunm(1);x.setRow(getColumn());w.setColunm(1);w.setRow(getColumn());int i;double z;for(i=0;i<row;i++){for(int j=0;j<row; j++)w.A[i][j]=0.0;}for(i=1;i<=x.row;i++)x.setValue(i, 1, 0.0);for(i=1;i<=x.row;i++){ cout<<"请输入等式右侧的第"<<i<<"个值:";cin>>z;w.A[i-1][0]=z;}i=0;while(i<x.row-1){ int j,t,h=i;for(j=i;j<x.row-1;j++){ if(jdz(A[j][i])<jdz(A[j+1][i]))h=j+1; }this->change(i+1,h+1);w.change(i+1,1);for(j=i+1;j<row;j++){ double k;k=A[j][i]/A[i][i];for(t=i;t<column;t++){A[j][t]=A[j][t]-k*A[i][t];}w.A[j][0]=w.A[j][0]-k*w.A[i][0];}i++;}if(this->A[row-1][column-1]==0){cerr<<"此矩阵对应的方程组有无穷解!"<<endl; exit(1);}i=column-1;while(i>0){ int j, t;for(j=i-1;j>=0;j--){ double k;k=A[j][i]/A[i][i];for(t=i;t>j;t--){ A[j][t]=A[j][t]-k*A[i][t]; }w.A[j][0]=w.A[j][0]-k*w.A[i][0];}i--;}int j;for(j=0;j<x.row;j++){x.A[j][0]=w.A[j][0]/this->A[j][j];}for(i=1;i<=x.row;i++)cout<<"X"<<i<<" = "<<x.A[i-1][0]<<endl; };CMatrix& CMatrix::inverse() //矩阵求逆{ if(this->row!=this->column) {cerr<<"该矩阵不符合求逆条件!"<<endl; exit(1);}else{CMatrix w;w.setColunm(this->getRow());w.setRow(getColumn());int i;for(i=0;i<row;i++){for(int j=0;j<row; j++){w.A[i][j]=0.0;}w.A[i][i]=1;}i=0;while(i<column-1){ int j,t,h=i;for(j=i;j<row-1;j++){if(jdz(A[j][i])<jdz(A[j+1][i]))h=j+1;}this->change(i+1,h+1);w.change(i+1,h+1);for(j=i+1;j<row;j++){ double k;k=A[j][i]/A[i][i];for(t=i;t<column;t++){A[j][t]=A[j][t]-k*A[i][t];w.A[j][t]=w.A[j][t]-k*w.A[i][t];}}i++;}if(this->A[row-1][column-1]==0){cerr<<"此矩阵求逆不成功,其所对应的方程组有无穷解!"<<endl; exit(1);} i=column-1;while(i>0){ int j, t;for(j=i-1;j>=0;j--){ double k;k=A[j][i]/A[i][i];for(t=i;t>j;t--){ A[j][t]=A[j][t]-k*A[i][t]; }for(t=column-1;t>=0;t--){w.A[j][t]=w.A[j][t]-k*w.A[i][t];}}i--;}int j,k;for(j=0;j<row;j++){ for(k=0;k<w.column;k++) {w.A[j][k]=w.A[j][k]/this->A[j][j];}this->A[j][j]=this->A[j][j]/this->A[j][j];}return w;}};void CMatrix::solve() //可逆线性矩阵求解{CMatrix x,w,c;x.setColunm(1);x.setRow(getColumn());w.setColunm(1);w.setRow(getColumn());c.setColunm(getColumn());c.setRow(getRow());int i;double z;for(i=1;i<=x.row;i++){ cout<<"请输入等式右侧的第"<<i<<"个值:";cin>>z;w.A[i-1][0]=z;}c.operator =(this->inverse());x.operator =(c.operator *(w));cout<<"求解结果:"<<endl;for(i=1;i<=x.row;i++)cout<<"X"<<i<<" = "<<x.A[i-1][0]<<endl; };void CMatrix::qxnh() //曲线拟合{cout<<"用矩阵曲线拟合:"<<endl;int i, j,k,t;double x, y;cout<<"请输入已知坐标点的个数:";cin>>i;CMatrix a(i,1), g(i,i) , w(i,1),c(i,i),q(i,i),p(i,i);for(j=1;j<=i;j++){ cout<<"请输入第"<<j<<"个已知点坐标(先横坐标后纵坐标):";cin>>x>>y;w.A[j-1][0]=y;g.A[j-1][0]=1.0;for(k=1;k<i;k++){ g.setValue(j,k+1,1.0);for(t=1;t<=k;t++)g.A[j-1][k]*=x;}}c=g.transpose();q=c*g;p=q.inverse();w=c*w;a=p*w;cout<<"Y="<<a.A[0][0];for(j=1;j<i;j++){ cout<<'+'<<'('<<a.A[j][0]<<')';for(k=0;k<j;k++)cout<<"*x";}cout<<endl;cout<<" 1 .求取其它点坐标 0. 退出 "<<endl; while(1){ cout<<"请选择:";cin>>k;switch(k){ case 1:{ double x, y,sum;cout<<"请输入待求点的横坐标(x):";cin>>x;y=a.A[0][0];for(j=1;j<i;j++){ sum=a.A[j][0];for(k=0;k<j;k++){sum*=x;}y+=sum;}cout<<"纵坐标:y="<<y<<endl; break;}case 0:{cerr<<"谢谢使用!"<<endl; exit(1);break;}default: cout<<"选择有误,请检查!"<<endl; break;}}};struct CElvDif{double value; // 观测值double weight; // 权重long startPoint; // 起始点编号long endPoint; // 终点编号};//水准点类的设计struct CLevelPoint{ // 高程平差值=高程值+高程值改正数long index; // 水准点编号double eleValue; // 高程值double dv; // 高程值改正数(初始化为0)bool isKnown; // 是否为已知点};class CElevationNet{public: // 成员函数CElevationNet(){numElvDif=0;numPoints=0 ;numKnPoint=0;}; // 构造函数~CElevationNet(){}; // 析构函数 void input();void output();void jsgc();int getgz(){return numElvDif;} //返回观测值数目int getzs(){return numPoints;} //返回总点数int getys(){return numKnPoint;} //返回已知点数int getws(){return numPoints-numKnPoint;} //返回未知点数 double geteleValue(int i){return this->lpVec[i-1].eleValue;} //获得高程值 long getindex(int i){return lpVec[i-1].index;} //返回高程点编号void seteleValue(int i, double value){lpVec[i-1].eleValue+=value;} //修改高程值void setdv(int i,double value){this->lpVec[i-1].dv=value;} //修改改正数double getdv(int i){return lpVec[i-1].dv;} //返回改正数friend void xishu(CMatrix& B, CMatrix& X,CElevationNet A); //求取系数矩阵和未知点高程矩阵friend void quanzhen(CMatrix& Q, CElevationNet A); //求取权阵friend void l_zhen( CMatrix& l ,CMatrix& L, CElevationNet A); //求取观测值L矩阵和l阵private: // 成员变量int numElvDif; // 高差总数int numPoints; // 控制网中点的总数目int numKnPoint; //控制网中已知点的数目CElvDif edVec[max]; // 观测值数组CLevelPoint lpVec[max]; // 高程值数组};void CElevationNet::input(){ int a,b,c,i;double z,l,g;cout<<"请对已知点和未知点进行编号,注意已知点的编号应小于未知点的编号!"<<endl<<endl; cout<<"请输入控制网中水准点总数和已知点数:";cin>>a>>b;numPoints=a;numKnPoint=b;for(i=0;i<numPoints;i++){ lpVec[i].index=i+1;lpVec[i].eleValue=0.0;lpVec[i].dv=0.0;lpVec[i].isKnown=0;}for(i=0;i<numKnPoint;i++){ cout<<"请输入第"<<i+1<<"个已知点高程值:";cin>>z;lpVec[i].eleValue=z;lpVec[i].isKnown=1;}cout<<"请输入观测值个数:";cin>>c;numElvDif=c;for(i=0;i<numElvDif;i++){ cout<<"请输入第"<<i+1<<"段观测段的高差值(单位米)、长度(单位千米)、起始点编号和终点编号:"<<endl;cin>>g>>l>>a>>b;edVec[i].value=g;edVec[i].weight=l;edVec[i].startPoint=a;edVec[i].endPoint=b;}};void CElevationNet::output(){int i;for(i=0;i<this->numPoints;i++)cout<<"编号为"<<this->lpVec[i].index<<"的点的高程值为:"<<this->lpVec[i].eleValue<<endl;for(i=0;i<this->numElvDif;i++)cout<<"观测段"<<i+1<<"的平差后的值为:"<<this->edVec[i].value<<endl;};void CElevationNet::jsgc(){ int i,j;for(i=0;i<this->numElvDif;i++){ if((lpVec[edVec[i].startPoint-1].eleValu e!=0.0)&&(lpVec[edVec[i].endPoint-1].eleVal ue==0.0)){lpVec[edVec[i].endPoint-1].eleValue=(l pVec[edVec[i].startPoint-1].eleValue)+(edVe c[i].value);}elseif(lpVec[edVec[i].startPoint-1].eleValue==0 .0&&lpVec[edVec[i].endPoint-1].eleValue!=0.0){lpVec[edVec[i].startPoint-1].eleValue= (lpVec[edVec[i].endPoint-1].eleValue)-(edVe c[i].value);}}for(j=numKnPoint;j<this->numPoints;j++) {if(this->lpVec[j].eleValue==0.0){for(i=0;i<this->numElvDif;i++){ if(this->edVec[i].startPoint==lpVec[ j].index&&this->lpVec[this->edVec[i].endPoi nt-1].eleValue!=0.0)this->lpVec[j].eleValue=this->lpVec[thi s->edVec[i].endPoint-1].eleValue-this->edVe c[i].value;elseif(this->edVec[i].endPoint==lpVec[j].index& &this->lpVec[this->edVec[i].startPoint-1].e leValue!=0.0){this->lpVec[j].eleValue=this->lpVec[this-> edVec[i].startPoint-1].eleValue+this->edVec [i].value;}}}//cout<<"第"<<this->lpVec[j].index<<"个点的高程近似值:"<<this->lpVec[j].eleValue<<endl;}};void xishu(CMatrix& B, CMatrix& X,CElevationNet A){int i,j;for(i=1;i<=B.getRow();i++)for(j=1;j<=B.getColumn();j++){ B.setValue(i,j,0);}for(i=0;i<A.numElvDif;i++) { if(A.lpVec[A.edVec[i].startPoint-1].isKn own==1&&A.lpVec[A.edVec[i].endPoint-1].isKn own==0){B.setValue(i+1,A.edVec[i].endPoint-A.numKn Point,1);}elseif(A.lpVec[A.edVec[i].startPoint-1].isKnown ==0&&A.lpVec[A.edVec[i].endPoint-1].isKnown ==1){ B.setValue(i+1,A.edVec[i].startPoint -A.numKnPoint,-1);}elseif(A.lpVec[A.edVec[i].startPoint-1].isKnown ==0&&A.lpVec[A.edVec[i].endPoint-1].isKnown ==0){ B.setValue(i+1,A.edVec[i].endPoint-A. numKnPoint,1);B.setValue(i+1,A.edVec[i].startPoint-A. numKnPoint,-1);}}for(i=0;i<X.getRow();i++)X.setValue(i+1,1,A.lpVec[A.numKnPoint+i ].eleValue);};void quanzhen(CMatrix& Q, CElevationNet A) {int i,j;double sum=0.0;for(i=0;i<A.numElvDif;i++)sum+=A.edVec[i].weight;sum=sum/A.numElvDif;for(i=1;i<=Q.getRow();i++)for(j=1;j<=Q.getColumn();j++){ Q.setValue(i,j,0);}for(i=1;i<=Q.getRow();i++)Q.setValue(i,i,sum/A.edVec[i-1].weight) ;};void l_zhen( CMatrix& l ,CMatrix& L, CElevationNet A){int i;double m;for(i=0;i<A.numElvDif;i++)L.setValue(i+1,1,A.edVec[i].value);for(i=0;i<l.getRow();i++){m=(A.lpVec[A.edVec[i].startPoint-1].ele Value+A.edVec[i].value-A.lpVec[A.edVec[i].e ndPoint-1].eleValue)*1000;l.setValue(i+1,1,m);}};void main(){CElevationNet A;A.input();A.jsgc();CMatrixB(A.getgz(),A.getws()),Q(A.getgz(),A.getgz( )),X(A.getws(),1),l(A.getgz(),1),b(A.getws( ),A.getgz()),V(A.getgz(),1);CMatrixNBB(A.getws(),A.getws()),x(A.getws(),1) ,N(A.getws(),A.getws()),L(A.getgz(),1),M(A. getws(),A.getgz()),R(A.getws(),A.getgz()),W (A.getws(),A.getgz());CMatrixvz(1,A.getgz()),vp(1,A.getgz()),p(1,1);xishu(B,X,A);quanzhen(Q,A);l_zhen(l,L,A);b.operator =(B.transpose());M.operator =(b.operator *(Q));NBB.operator =(M.operator *(B));N.operator =(NBB.inverse());R.operator =(N.operator *(b));W.operator =(R.operator *(Q));x.operator =(W.operator *(l));int i,j;for(i=A.getys()+1;i<=A.getzs();i++){A.setdv(i,(x.getValue(i-A.getys(),1)/1000));A.seteleValue(i,A.getdv(i));cout<<"平差后编号为"<<A.getindex(i)<<"的点高程值:"<<A.geteleValue(i)<<"米"<<endl;}V.operator =(B.operator *(x));V.operator -(l);for(j=0;j<V.getRow();j++)cout<<"第"<<j+1<<"段观测高差平差值为:"<<(L.getValue(j+1,1)+V.getValue(j+1,1)/100 0)<<"米"<<endl;vz.operator =(V.transpose());vp=(vz.operator *(Q));p=(vp.operator *(V));cout<<"平差后单位权中误差为:"<<"+_"<<sqrt(p.getValue(1,1)/A.getws())<<"毫米"<<endl;}。

间接平差程序设计

间接平差程序设计

间接平差程序设计间接平差程序设计是现代测量技术中的重要一环,它通过计算和优化一系列观测数据,求解未知量的准确值。

在实际测量工程中,程序设计的好坏直接影响测量结果的精确性和可靠性。

本文将以生动、全面且有指导意义的方式介绍间接平差程序的设计要点。

首先,间接平差程序设计要考虑数据的质量控制。

测量数据的精确度和准确度是程序设计的基础,因此必须引入合理的数据处理和质量控制方法。

在测量前,需进行数据预处理,包括数据检查、去除异常值、数据修正等。

同时,为了保证计算结果的可靠性,还需统计数据的精确度和准确度指标,如偏差、方差等。

这些统计指标为后续的程序设计提供了基础数据。

其次,间接平差程序设计要注重数学模型的选择与建立。

根据测量任务的不同,需要选择适当的数学模型,建立测量任务与未知量之间的关系。

常用的数学模型有多项式模型、线性模型、非线性模型等。

在选择数学模型前应充分了解测量任务的特点,避免过于复杂或过于简化的模型。

模型的准确度直接影响最终计算结果的精度,因此,合理选择和建立数学模型是程序设计的核心环节。

然后,间接平差程序设计要注重计算方法的优化。

测量数据量庞大,且存在不同类型的误差,对于计算效率和稳定性要求高。

设计程序时,可采用最小二乘法、最大似然估计法等优化方法,以实现精度和效率的平衡。

同时,针对不同任务,还需克服计算矩阵的秩亏、条件数过大等问题,设计相应的算法和模型。

通过优化计算方法,可以提高程序的运行速度和结果的准确度。

最后,间接平差程序设计要充分考虑软件工程的要求。

测量任务是一个复杂的过程,需要进行大量的数据处理、计算和结果分析。

因此,程序应具备良好的可读性、可维护性和可扩展性。

良好的代码结构、注释和文档,能够保证程序的易读性和易理解性,并便于后续开发和维护工作。

此外,程序还应具备友好的用户界面,便于用户输入数据、查看结果,并提供适当的错误处理机制。

综上所述,间接平差程序设计是现代测量技术不可或缺的一部分。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

水准网间接平差程序设计(C++)-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN////////////////////////////////////////////////////// visual C++ 编译通过 /////////////////////////////////////////////////////////////////////////////////////////////////////////// 参考资料 //// 部分网络资料 //// 宋力杰《测量平差程序设计》 ////姚连壁《基于matlab的控制网平差程序设计》 /////////////////////////////////////////////////////#include<iostream>#include<fstream>#include <>#include<>#include <iomanip>using namespace std;//////////////////////////////////////////////////////////////////////////class class SZWPC{private:int gcz_zs; //高差总数int szd_zs; //总点数int yz_szd_zs; //已知点数double m_pvv; //[pvv]int *qsd_dh; //高差起点号int *zd_dh; //高差终点号char **dm; //点名地址数组double *gcz; //观测值数组double *szd_gc; //高程值数组double *P; //观测值的权double *ATPA,*ATPL; //法方程系数矩阵与自由项double *dX; //高程改正数、平差值double *V; //残差double m_mu; //单位权中误差public:SZWPC();~SZWPC();int ij(int i,int j);//对称矩阵下标计算函数bool inverse(double a[],int n);//对称正定矩阵求逆(仅存下三角元素)(参考他人)void inputdata(char *datafile);//输入原始数据函数int dm_dh(char *name); //点名转点号void ca_H0(); //近似高程计算函数void ca_ATPA(); //法方程组成函数void ca_dX(); //高程平差值计算函数void printresult(char *resultfile); //精度估计与平差值输出函数double ca_V(); //残差计算函数void zxecpc(char *resultfile);//最小二乘平差函数};//////////////////////////////////////////////////////////////////////// 构造函数SZWPC::SZWPC(){gcz_zs=0;szd_zs=0;yz_szd_zs=0;}//////////////////////////////////////////////////////////////////////// 析构函数SZWPC::~SZWPC(){if(gcz_zs>0){delete []qsd_dh;delete []zd_dh;delete []gcz;delete []P;delete []V;}if(szd_zs>0){delete []szd_gc;delete []ATPA;delete []ATPL;delete []dX;for(int i=0; i<szd_zs;i++)if(dm[i]!=NULL)delete[](dm[i]);delete []dm;}}////////////////////////////////////////////////////////////////////////// // 对称矩阵下标计算函数int SZWPC::ij(int i,int j){return (i>=j) i*(i+1)/2+j :j*(j+1)/2+i;}////////////////////////////////////////////////////////////////////////// // 对称正定矩阵求逆(仅存下三角元素)(参考他人)bool SZWPC::inverse(double a[],int n){double *a0=new double[n];for(int k=0;k<n;k++){double a00=a[0];if(a00+=={delete []a0;return false;}for(int i=1;i<n;i++){double ai0 = a[i*(i+1)/2];if(i<=n-k-1)a0[i]= -ai0/a00;else a0[i]= ai0/a00;for(int j=1;j<=i;j++){a[(i-1)*i/2+j-1]=a[i*(i+1)/2+j]+ai0*a0[j];}}for(i=1;i<n;i++){a[(n-1)*n/2+i-1]=a0[i];}a[n*(n+1)/2-1]=a00;}delete []a0;return true;}/////////////////////////////////////////////////////////////////////// 原始数据输入函数void SZWPC::inputdata(char *datafile){ifstream infile(datafile,ios::in);if(! infile){cerr<<" Open error!"<<endl;}infile>>gcz_zs>>szd_zs>>yz_szd_zs;int unPnumber=szd_zs-yz_szd_zs;szd_gc=new double [szd_zs];dX=new double [szd_zs];ATPA=new double [szd_zs*(szd_zs+1)/2];ATPL=new double [szd_zs];qsd_dh=new int [gcz_zs];zd_dh=new int [gcz_zs];gcz=new double [gcz_zs];V=new double [gcz_zs];P=new double [gcz_zs];dm=new char* [szd_zs];for(int i=0;i<szd_zs;i++){dm[i] = NULL;// dm_dh函数根据dm[i]是否为NULL确定dm[i]是否为点名地址}char buffer[128]; //临时数组,保存从文件中读到的点名for( i=0;i<=yz_szd_zs-1;i++)// 读取已知高程数据{infile>>buffer;int c=dm_dh(buffer);infile>>szd_gc[i];}for(i=0;i<gcz_zs;i++)// 读取观测数据{infile>>buffer; //读取高程起点名qsd_dh[i]=dm_dh(buffer);infile>>buffer;//读取高程终点zd_dh[i]=dm_dh(buffer);infile>>gcz[i]>>P[i]; //读取高差值与路线长度P[i]=P[i];//线路长转化为观测值的权}();}//////////////////////////////////////////////////////////////////// 点名转点号,返回点名对应的点号int SZWPC::dm_dh(char *name){for(int i=0; i<szd_zs; i++){if(dm[i]!=NULL){if(strcmp(name,dm[i])==0)return i;//将待查点名与已经存入点名数组的点名比较,若存在返回点号}else{int len = strlen(name);//判断点名长度dm[i] = new char[len+1];//为点名申请存储空间strcpy(dm[i], name);//待查点名是一个新的点名,将新点名的地址放到dm数组中return i;//返回点号}}return -1; //dm数组已经存满,且没有待查点名}////////////////////////////////////////////////////////////////////////////高程近似值计算void SZWPC::ca_H0(){for(int i=yz_szd_zs;i<szd_zs;i++)szd_gc[i]=;//为计算机设置辨别未知高程点的标志for(int j=1;;j++){int k=0; //计算出近似高程的点数for(i=0;i<gcz_zs;i++){int k1=qsd_dh[i]; //高差起点号int k2=zd_dh[i]; //高差终点号if(szd_gc[k1]> && szd_gc[k2]<//k1点高程或高程近似值已知,k2点高程或高程近似值未知{szd_gc[k2]=szd_gc[k1]+gcz[i];//计算近似高程k++;}elseif(szd_gc[k1]< && szd_gc[k2]>//k2点高程或高程近似值已知,k1点高程或高程近似值未知{szd_gc[k1]=szd_gc[k2]-gcz[i];//计算近似高程k++;}}if(k==(szd_zs-yz_szd_zs))break;//所有的近似高程计算完成,退出}}//////////////////////////////////////////////////////////////////////////// 组成法方程void SZWPC::ca_ATPA(){//int t=szd_zs;for(int i=0; i<szd_zs*(szd_zs+1)/2; i++) ATPA[i]=;//赋初值for(i=0; i<szd_zs; i++) ATPL[i]=;//赋初值for(int k=0; k<gcz_zs; k++){int i=qsd_dh[k];//获取点号int j=zd_dh[k];//获取点号double Pk=P[k];//获取权值double lk=gcz[k]-(szd_gc[j]-szd_gc[i]);//获得第k个自由项ATPL[i]-=Pk*lk;//获得法方程自由项ATPL[j]+=Pk*lk;ATPA[ij(i,i)]+=Pk;//获得法方程系数矩阵ATPA[ij(j,j)]+=Pk;ATPA[ij(i,j)]-=Pk;}}//////////////////////////////////////////////////////////////////////////// 高程平差值计算void SZWPC::ca_dX(){for(int i=0;i<yz_szd_zs;i++) ATPA[ij(i,i)]=;//处理已知点if(!inverse(ATPA,szd_zs))//矩阵求逆{cerr<<"法方程系数矩阵降秩!"<<endl;//矩阵为奇异矩阵,无法求逆exit(0);//退出程序}for(i=0; i<szd_zs; i++)//计算高程改正数{double xi=;for(int j=0; j<szd_zs; j++){xi+=ATPA[ij(i,j)]*ATPL[j];}dX[i]=xi;szd_gc[i]+=xi;//计算高程平差值}}//////////////////////////////////////////////////////////////////////////// 残差计算double SZWPC::ca_V(){double pvv=;for(int i=0;i<=gcz_zs-1;i++){int k1=qsd_dh[i];int k2=zd_dh[i];V[i]=szd_gc[k2]-szd_gc[k1]-gcz[i];pvv+=V[i]*V[i]*P[i];}return(pvv);}//////////////////////////////////////////////////////////////////////////// 原始数据和平差值输出void SZWPC::printresult(char *resultfile){double pvv=ca_V(); // 残差计算ofstream outfile(resultfile,ios::out);//以输出方式打开文件,若文件不存在,创建文件//输出原始观测数据outfile<<endl<<"观测总数:"<<gcz_zs<<" "<<"总点数:"<<szd_zs;outfile<<" "<<"已知点数:"<<yz_szd_zs<<endl;outfile<<endl<<"===================== 已知高程====================="<<endl;//输出原始观测数据已知点点号、高程for(int i=0;i<=yz_szd_zs-1;i++){outfile<<" "<<dm[i];outfile<<setiosflags(ios::fixed);outfile<<setw(10)<<setprecision(4)<<szd_gc[i]<<endl;}outfile<<endl<<endl<<"===================== 高差观测值====================="<<endl<<endl;//输出原始观测数据高程观测值与路线长outfile<<"起始点名"<<" "<<"终点点名"<<" "<<"高差观测值(m)"<<" "<<"两点间距离(km)"<<endl;for(i=0;i<=gcz_zs-1;i++){outfile<<" "<<dm[qsd_dh[i]]<<setw(9)<<dm[zd_dh[i]];outfile<<setiosflags(ios::fixed);outfile<<setw(16)<<setprecision(4)<<gcz[i];outfile<<setiosflags(ios::fixed);outfile<<setw(16)<<setprecision(4)<<P[i]<<endl;}m_mu=sqrt(pvv/(gcz_zs-(szd_zs-yz_szd_zs)));//计算单位权中误差outfile<<endl<<"===================== 单位权中误差====================="<<endl;//输出单位权中误差outfile<<endl<<"σ0="<<m_mu<<endl;outfile<<endl<<"===================== 高程平差值及其精度====================="<<endl<<endl;//输出高程平差值及其精度outfile<<"点名近似高程改正数高程平差值中误差"<<endl;for( i=0; i<szd_zs; i++){outfile<<setw(2)<<dm[i];double dx=dX[i];double qii=ATPA[ij(i,i)];outfile<<setiosflags(ios::fixed);outfile<<setw(12)<<setprecision(4)<<szd_gc[i]-dx;outfile<<setiosflags(ios::fixed);outfile<<setw(10)<<setprecision(4)<<dx;outfile<<setiosflags(ios::fixed);outfile<<setw(11)<<setprecision(4)<<szd_gc[i];outfile<<setiosflags(ios::fixed);outfile<<setw(10)<<setprecision(4)<<sqrt(qii)*m_mu<<endl;}//输出观测值平差值及其精度outfile<<endl<<endl<<"===================== 观测值平差值及其精度====================="<<endl<<endl;outfile<<"起点终点观测高差v"<<" 高差平差值观测权中误差"<<endl;for(i=0;i<=gcz_zs-1;i++){int k1=qsd_dh[i];int k2=zd_dh[i];double qii=ATPA[ij(k1,k1)];double qjj= ATPA[ij(k2,k2)] ;double qij=ATPA[ij(k1,k2)];double ml=sqrt(qii+*qij)*m_mu;(2);outfile<<dm[k1];(7);outfile<<dm[k2];outfile<<setiosflags(ios::fixed);outfile<<setw(12)<<setprecision(4)<<gcz[i];outfile<<setiosflags(ios::fixed);outfile<<setw(10)<<setprecision(4)<<V[i];outfile<<setiosflags(ios::fixed);outfile<<setw(10)<<setprecision(4)<<gcz[i]+V[i];outfile<<setiosflags(ios::fixed);outfile<<setw(10)<<setprecision(4)<<P[i];outfile<<setiosflags(ios::fixed);outfile<<setw(10)<<setprecision(4)<<ml<<endl;}();}////////////////////////////////////////////////////////////////////////// // 水准网最小二乘平差void SZWPC::zxecpc(char *resultfile){ca_H0(); //近似高程计算ca_ATPA(); // 组成法方程ca_dX(); // 高程平差值计算}/////////////////////////////////////////////////////////////////////// int main(){char *datafile ="算例\\";//原始数据文件存储地址指针char *resultfile ="算例\\";//平差结果输出地址指针cout<<endl<<endl<<"水准网经典间接平差"<<endl<<endl;cout<<"原数据文件位置:"<<datafile<<endl;cout<<"平差结果文件位置:"<<resultfile<<endl<<endl;SZWPC new_net;//定义新的对象(datafile);//输入原始数据(resultfile);//最小二乘平差计算(resultfile);//输出平差结果return 0;}11。

相关文档
最新文档