C#,码海拾贝(25) | 您所在的位置:网站首页 › 用追赶法求解三对角线性方程组 › C#,码海拾贝(25) |
using System; namespace Zhou.CSharp.Algorithm { /// /// 求解线性方程组的类 LEquations /// 原作 周长发 /// 改编 深度混淆 /// public static partial class LEquations { /// /// 求解三对角线方程组的追赶法 /// /// 指定的系数矩阵 /// 指定的常数矩阵 /// Matrix对象,返回方程组解矩阵 /// bool 型,方程组求解是否成功 public static bool GetRootsetTriDiagonal(Matrix mtxLECoef, Matrix mtxLEConst, Matrix mtxResult) { int k, j; double s; // 将常数矩阵赋给解矩阵 mtxResult.SetValue(mtxLEConst); double[] pDataConst = mtxResult.GetData(); int n = mtxLECoef.GetNumColumns(); if (mtxLECoef.GetNumRows() != n) { return false; } // 为系数矩阵对角线数组分配内存 double[] pDiagData = new double[3 * n - 2]; // 构造系数矩阵对角线元素数组 k = j = 0; if (k == 0) { pDiagData[j++] = mtxLECoef.GetElement(k, k); pDiagData[j++] = mtxLECoef.GetElement(k, k + 1); } for (k = 1; k < n - 1; ++k) { pDiagData[j++] = mtxLECoef.GetElement(k, k - 1); pDiagData[j++] = mtxLECoef.GetElement(k, k); pDiagData[j++] = mtxLECoef.GetElement(k, k + 1); } if (k == n - 1) { pDiagData[j++] = mtxLECoef.GetElement(k, k - 1); pDiagData[j++] = mtxLECoef.GetElement(k, k); } // 求解 for (k = 0; k return false; } pDiagData[j + 1] = pDiagData[j + 1] / s; pDataConst[k] = pDataConst[k] / s; pDiagData[j + 3] = pDiagData[j + 3] - pDiagData[j + 2] * pDiagData[j + 1]; pDataConst[k + 1] = pDataConst[k + 1] - pDiagData[j + 2] * pDataConst[k]; } s = pDiagData[3 * n - 3]; if (Math.Abs(s) < float.Epsilon)// s == 0.0) { return false; } // 调整 pDataConst[n - 1] = pDataConst[n - 1] / s; for (k = n - 2; k >= 0; k--) { pDataConst[k] = pDataConst[k] - pDiagData[3 * k + 1] * pDataConst[k + 1]; } return true; } } } |
今日新闻 |
推荐新闻 |
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 |