项目背景
从连通性的角度为一个管道网络建立数学模型其实很简单:
把 A 称为该管网的连通矩阵。从定义中可以看出管网在这里被视为单向图。
根据节点质量守恒定律,在供水管网的每一个节点,流入该节点的质量应等于流出该节点的质量,从而可以建立整个管网的节点流量平衡方程组:
这个方程组就是供水管网水力分析的基础。
这是水力分析程序的整体架构:
在计算过程中用到大量矩阵的加法、减法、乘法、转置等运算。Nacho就是为了满足这些计算需求而被设计的。
设计思想
采用面向对象的设计模式,将矩阵封装成一个CMatrix类,矩阵的转置、求范数、置零等操作由CMatrix的成员方法提供,然后通过定义“+”,“-”,“*”,“/”,“^”等操作符来完成矩阵的加、减、乘、除以及元素求幂等运算,最后单独定义了CMatrix的控制台输出操作符,可以方便的把矩阵打印出来。
下面给出CMatrix的定义:
// CMatrix.h
#ifndef CMATRIX_H
#define CMATRIX_H
#include <iostream>
using namespace std;
class CMatrix {
public:
CMatrix(int m, int n); //构建一个m*n的全零矩阵
CMatrix(int n); //构建一个n*n的全零矩阵
CMatrix(const CMatrix &); //拷贝构造函数,深拷贝
~CMatrix();
static bool printWhenCreateAndDelete; //控制是否打印构造与析构
int getRowNum() const; //返回矩阵的行数
int getColNum() const; //返回矩阵的列数
bool getTransState() const; //返回矩阵的转置状态
CMatrix trans() const; //将矩阵转置
double norm() const; //求解矩阵F范数
double get(int i, int j) const; //返回矩阵第i行j列元素
void set(int i, int j, double val); //设置矩阵第i行j列元素为val
void diagUnitize(); //将方阵对角线元素全部设置为1
void clear(); //将矩阵所有元素设置为零
CMatrix operator +(const CMatrix &mat); //两个矩阵相加
CMatrix operator -(const CMatrix &mat); //两个矩阵相减
CMatrix operator *(const CMatrix &mat); //两个矩阵相乘
CMatrix operator *(const double f); //矩阵乘以常数
CMatrix operator /(const double f); //矩阵除以常数
CMatrix operator ^(const double f); //矩阵元素分别求幂
void operator =(const CMatrix &mat); //将一个矩阵赋给另一个
private:
double *start; //指向矩阵首元素的指针
int rowNum; //矩阵行数
int colNum; //矩阵列数
bool isTransposed; //记录矩阵是否转置
void rowColSwap(); //转置时用于交换row_num与col_num的值
};
//在控制台以规范的格式打印矩阵
ostream & operator <<(ostream &, const CMatrix &);
#endif
开源项目
项目地址:https://github.com/lbbc1117/Nacho
项目中包含了简单的API文档。
我还另外定义了一个CTest类,里面包含了不同的方法,对CMatrix各种运算进行测试,并将测试结果输出到控制台。
CTest也包括在开源项目中。