代码在后面,因为 size_t 是无符号型的,所以在 for 循环中如果疏忽了它的这个符号问题,就会产生比较严重的后果。现在用了一个“临时解决方案”,但是感觉还是不稳妥,暂且记录、稍后再慢慢推敲。
void NetlistManagerClass::CalculateVoltage()
{
size_t maxRow = this->netlistNodes.size(); //Row 行
size_t maxColumn = this->netlistNodes.size(); //Column 列
std::vector<std::vector<double>> A(maxRow, std::vector<double>(maxColumn, 0.0));
std::vector<double> b(maxRow, 0.0);
// 遍历网络,完成矩阵和向量的填充
for(NetlistNodeClass* _netlistNode : this->netlistNodes)
{
_netlistNode->fillMatrixAndVector(&A, &b);
}
// 完成矩阵和向量的填充之后,开始进行LU求解
size_t n = this->netlistNodes.size();
std::vector<double> x = this->solveLinearSystem(A, b, n);
// 求解得到的就是每一个网络的电压
std::cout << "Solution: ";
this->printVector(x, "vector result");
}
// LU分解
void NetlistManagerClass::luDecomposition(const std::vector<std::vector<double>>& A, std::vector<std::vector<double>>& L, std::vector<std::vector<double>>& U, size_t n)
{
for (size_t i = 0; i < n; i++)
{
for (size_t j = i; j < n; j++)
{
for (size_t k = 0; k < i; k++)
{
}
}
for (size_t j = i + 1; j < n; j++)
{
for (size_t k = 0; k < i; k++)
{
}
}
}
}
// 前向替代法
std::vector<double> NetlistManagerClass::forwardSubstitution(const std::vector<std::vector<double>>& L, const std::vector<double>& b, size_t n)
{
std::vector<double> y(n);
for (size_t i = 0; i < n; i++)
{
y[i] = b[i];
for (size_t j = 0; j < i; j++)
{
y[i] -= L[i][j] * y[j];
}
}
return y;
}
// 后向替代法
std::vector<double> NetlistManagerClass::backwardSubstitution(const std::vector<std::vector<double>>& U, const std::vector<double>& y, size_t n)
{
//for(size_t i = n-1; i>=0; i--) // 存在bug
//for (int i = n - 1; i >= 0; i--) // 可以解决问题,但是变量类型不一致
for (size_t i = n - 1; i != size_t(-1); i--)
{
for (size_t j = i + 1; j < n; j++)
{
}
}
return x;
}
// 求解线性方程组
std::vector<double> NetlistManagerClass::solveLinearSystem(std::vector<std::vector<double>>& A, std::vector<double>& b, size_t n)
{
std::vector<std::vector<double>> L(n, std::vector<double>(n, 0));
std::vector<std::vector<double>> U(n, std::vector<double>(n, 0));
luDecomposition(A, L, U, n);
std::vector<double> y = forwardSubstitution(L, b, n);
return backwardSubstitution(U, y, n);
}