C#,码海拾贝(25) 您所在的位置:网站首页 用追赶法求解三对角线性方程组 C#,码海拾贝(25)

C#,码海拾贝(25)

2023-07-02 09:34| 来源: 网络整理| 查看: 265

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 实验室设备网 版权所有