当前位置: 首页 > news >正文

C#,码海拾贝(28)——求解“对称正定方程组”的“平方根法”之C#源代码

using System;

namespace Zhou.CSharp.Algorithm
{
    /// <summary>
    /// 求解线性方程组的类 LEquations
    /// 原作 周长发
    /// 改编 深度混淆
    /// </summary>
    public static partial class LEquations
    {

        /// <summary>
        /// 求解对称正定方程组的平方根法
        /// </summary>
        /// <param name="mtxLECoef">指定的系数矩阵</param>
        /// <param name="mtxLEConst">指定的常数矩阵</param>
        /// <param name="mtxResult">Matrix引用对象,返回方程组解矩阵</param>
        /// <return>bool 型,方程组求解是否成功</return>
        public static bool GetRootsetCholesky(Matrix mtxLECoef, Matrix mtxLEConst, Matrix mtxResult)
        {
            int i, j, k, u, v;

            // 方程组属性,将常数矩阵赋给解矩阵
            Matrix mtxCoef = new Matrix(mtxLECoef);
            mtxResult.SetValue(mtxLEConst);
            int n = mtxCoef.GetNumColumns();
            int m = mtxResult.GetNumColumns();
            double[] pDataCoef = mtxCoef.GetData();
            double[] pDataConst = mtxResult.GetData();

            // 非对称正定系数矩阵,不能用本方法求解
            if (pDataCoef[0] <= 0.0)
            {
                return false;
            }

            pDataCoef[0] = Math.Sqrt(pDataCoef[0]);
            for (j = 1; j <= n - 1; j++)
            {
                pDataCoef[j] = pDataCoef[j] / pDataCoef[0];
            }
            for (i = 1; i <= n - 1; i++)
            {
                u = i * n + i;
                for (j = 1; j <= i; j++)
                {
                    v = (j - 1) * n + i;
                    pDataCoef[u] = pDataCoef[u] - pDataCoef[v] * pDataCoef[v];
                }

                if (pDataCoef[u] <= 0.0)
                {
                    return false;
                }
                pDataCoef[u] = Math.Sqrt(pDataCoef[u]);
                if (i != (n - 1))
                {
                    for (j = i + 1; j <= n - 1; j++)
                    {
                        v = i * n + j;
                        for (k = 1; k <= i; k++)
                        {
                            pDataCoef[v] = pDataCoef[v] - pDataCoef[(k - 1) * n + i] * pDataCoef[(k - 1) * n + j];
                        }
                        pDataCoef[v] = pDataCoef[v] / pDataCoef[u];
                    }
                }
            }

            for (j = 0; j <= m - 1; j++)
            {
                pDataConst[j] = pDataConst[j] / pDataCoef[0];
                for (i = 1; i <= n - 1; i++)
                {
                    u = i * n + i;
                    v = i * m + j;
                    for (k = 1; k <= i; k++)
                    {
                        pDataConst[v] = pDataConst[v] - pDataCoef[(k - 1) * n + i] * pDataConst[(k - 1) * m + j];
                    }
                    pDataConst[v] = pDataConst[v] / pDataCoef[u];
                }
            }

            for (j = 0; j <= m - 1; j++)
            {
                u = (n - 1) * m + j;
                pDataConst[u] = pDataConst[u] / pDataCoef[n * n - 1];
                for (k = n - 1; k >= 1; k--)
                {
                    u = (k - 1) * m + j;
                    for (i = k; i <= n - 1; i++)
                    {
                        v = (k - 1) * n + i;
                        pDataConst[u] = pDataConst[u] - pDataCoef[v] * pDataConst[i * m + j];
                    }

                    v = (k - 1) * n + k - 1;
                    pDataConst[u] = pDataConst[u] / pDataCoef[v];
                }
            }

            return true;
        }
 

    }
}
 

http://www.lryc.cn/news/91176.html

相关文章:

  • 碳纤维单丝外径测试中的纳米分辨率激光衍射法解决方案
  • 服务(第三十二篇)nginx做缓存服务器
  • Java 集合、数组、字符串的相互转换(关于list.toArray(new String[0])的源码分析)
  • Redis的全局命令及相关误区
  • C++核心编程—类和对象,类的三大特性——封装、继承、多态
  • keep-alive 是 Vue 内置的一个组件,被用来缓存组件实例。
  • (八)Spring之IOC控制反转、DI依赖注入介绍和使用(详解)
  • 凸缺陷 convexityDefects
  • c语言编程练习题:7-43 Shuffling Machine
  • ffmpeg enum AVChannel枚举解析
  • invest模型教程
  • LinuxShell编程
  • stm32学习笔记-11 SPI通信
  • “微商城”项目(3页面布局)
  • Java 八股文 - MySQL
  • 周赛347(模拟、思维题、动态规划+优化)
  • String AOP的使用
  • 华为芯片基地旁,龙华科技小镇大水坑片区城市更新单元旧改项目
  • 论文阅读 | 频谱监测、认知电子战、网电攻击
  • MySQL server安装记录
  • 平衡树原理讲解
  • SpringMVC框架面试专题(初级-中级)-第七节
  • 爬虫实战案例
  • ConcurrentLinkedQueue非阻塞无界链表队列
  • 排序算法稳定性
  • 统计学期末复习整理
  • Sketch在线版免费使用,Windows也能用的Sketch!
  • 详解uni-app项目运行在安卓真机调试
  • 体积小、无广告、超实用的5款小工具
  • OZON好出单吗?新手如何做?注意事项是什么?