C#,码海拾贝(26)——求解“一般带状线性方程组”之C#源代码

news2024/10/5 18:34:20

 

在大型稀疏方程组中,最常见的是带状方程组,其系数矩阵是带状矩阵,非零元素仅集中在对角线附近的带状区域内。

特别的,当上下带宽相等时我们A称方程组为等带宽方程组。总带宽为3的等带宽方程组我们又叫三对角方程组。

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="nBandWidth">带宽</param>
        /// <param name="mtxResult">Matrix对象,返回方程组解矩阵</param>
        /// <return>bool 型,方程组求解是否成功</return>
        public static bool GetRootsetBand(Matrix mtxLECoef, Matrix mtxLEConst, int nBandWidth, Matrix mtxResult)
        {
            int r, k, i, j, nis = 0, u, v;
            double p, t;

            // 带宽必须为奇数
            if ((nBandWidth - 1) % 2 != 0)
            {
                return false;
            }

            // 将常数矩阵赋给解矩阵
            mtxResult.SetValue(mtxLEConst);
            double[] pDataConst = mtxResult.GetData();

            // 方程组属性
            int n = mtxLECoef.GetNumColumns();
            int m = mtxLEConst.GetNumColumns();
            if (mtxLECoef.GetNumRows() != n)
            {
                return false;
            }

            // 带宽数组:带型矩阵的有效数据
            double[] pBandData = new double[nBandWidth * n];

            // 半带宽
            r = (nBandWidth - 1) / 2;

            // 构造带宽数组
            for (i = 0; i < n; ++i)
            {
                j = 0;
                for (k = Math.Max(0, i - r); k < Math.Max(0, i - r) + nBandWidth; ++k)
                {
                    if (k < n)
                    {
                        pBandData[i * nBandWidth + j++] = mtxLECoef.GetElement(i, k);
                    }
                    else
                    {
                        pBandData[i * nBandWidth + j++] = 0;
                    }
                }
            }

            // 求解
            for (k = 0; k <= n - 2; k++)
            {
                p = 0.0;
                for (i = k; i <= r; i++)
                {
                    t = Math.Abs(pBandData[i * nBandWidth]);
                    if (t > p)
                    {
                        p = t;
                        nis = i;
                    }
                }

                if (Math.Abs(p) < float.Epsilon)//  p == 0.0)
                {
                    return false;
                }

                for (j = 0; j <= m - 1; j++)
                {
                    u = k * m + j;
                    v = nis * m + j;
                    t = pDataConst[u];
                    pDataConst[u] = pDataConst[v];
                    pDataConst[v] = t;
                }

                for (j = 0; j <= nBandWidth - 1; j++)
                {
                    u = k * nBandWidth + j;
                    v = nis * nBandWidth + j;
                    t = pBandData[u];
                    pBandData[u] = pBandData[v];
                    pBandData[v] = t;
                }

                for (j = 0; j <= m - 1; j++)
                {
                    u = k * m + j;
                    pDataConst[u] = pDataConst[u] / pBandData[k * nBandWidth];
                }

                for (j = 1; j <= nBandWidth - 1; j++)
                {
                    u = k * nBandWidth + j;
                    pBandData[u] = pBandData[u] / pBandData[k * nBandWidth];
                }

                for (i = k + 1; i <= r; i++)
                {
                    t = pBandData[i * nBandWidth];
                    for (j = 0; j <= m - 1; j++)
                    {
                        u = i * m + j;
                        v = k * m + j;
                        pDataConst[u] = pDataConst[u] - t * pDataConst[v];
                    }

                    for (j = 1; j <= nBandWidth - 1; j++)
                    {
                        u = i * nBandWidth + j;
                        v = k * nBandWidth + j;
                        pBandData[u - 1] = pBandData[u] - t * pBandData[v];
                    }

                    u = i * nBandWidth + nBandWidth - 1; pBandData[u] = 0.0;
                }

                if (r != (n - 1))
                {
                    r = r + 1;
                }
            }

            p = pBandData[(n - 1) * nBandWidth];
            if (Math.Abs(p) < float.Epsilon)//  p == 0.0)
            {
                return false;
            }

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

            r = 1;
            for (i = n - 2; i >= 0; i--)
            {
                for (k = 0; k <= m - 1; k++)
                {
                    u = i * m + k;
                    for (j = 1; j <= r; j++)
                    {
                        v = i * nBandWidth + j;
                        nis = (i + j) * m + k;
                        pDataConst[u] = pDataConst[u] - pBandData[v] * pDataConst[nis];
                    }
                }

                if (r != (nBandWidth - 1))
                {
                    r = r + 1;
                }
            }

            return true;
        }
 

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/618278.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在 Elasticsearch 论坛/社群上提出高质量的技术问题?

在网络的海洋中寻求帮助&#xff0c;有时可能会让你感到茫然。你可能已经准备好详细描述你的问题&#xff0c;但如果你不知道如何有效地提问&#xff0c;你可能会发现自己在等待回答时感到挫败。 这篇文章的目标是为你提供一些提示&#xff0c;让你更快地获取你在论坛上的技术问…

数据库管理-第八十二期 EMCC升级教程(20230606)

数据库管理 2023-06-06 第八十二期 EMCC升级教程1 升级EMCC1.1 升级概览1.2 拷贝相关文件1.3 升级OPatch1.4 升级OMSPatcher1.5 升级WLS1.6 升级OMS 2 升级Agent2.1 升级概览2.2 拷贝相关文件2.3 安装或升级AgentPatcher2.4 升级agent 3 升级Oracle数据库ASH包总结 第八十二期 …

2. 分布式文件系统 HDFS

2. 分布式文件系统 HDFS 1. 引入HDFS【面试点】 问题一&#xff1a;如果一个文件中有 10 个数值&#xff0c;一行一个&#xff0c;并且都可以用 int 来度量。现在求 10 个数值的和 思路&#xff1a; 逐行读取文件的内容把读取到的内容转换成 int 类型把转换后的数据进行相加…

一文打通基于注解管理Bean

目录 开启组件扫描 情况一&#xff1a;最基本的扫描方式 情况二&#xff1a;指定要排除的组件 情况三&#xff1a;仅扫描指定组件 使用注解定义 Bean Autowired注入 ①场景一&#xff1a;属性注入 ②场景二&#xff1a;set注入 ③场景三&#xff1a;构造方法注入 ④…

Hbase安装指南

Hbase简介 HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统&#xff0c;利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。 HBase是Google Bigtable的开源实现&#xff0c;类似Google Bigtable利用GFS作为其文件存储系统&#xff0c;HBase利用Had…

Java基础学习+面向对象(一)

一&#xff0c;基础概念介绍 1.1Java跨平台原理&#xff08;一次编译&#xff0c;处处运行&#xff09; Java 源代码经过编译&#xff0c;生成字节码文件&#xff0c;交由 Java 虚拟机来执行&#xff0c;不同得系统有不同得JVM,借助JVM 实现跨平台。就比如说我们在 Windows 下…

基于Java+uniapp微信小程序的购物商城系统设计与实现

博主介绍&#xff1a;擅长Java、微信小程序、Python、Android等&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案例…

linux和windows爬虫有什么区别

Linux和Windows作为操作系统对于爬虫的差异不是特别大&#xff0c;因为两个操作系统同时都可以用于编写运行爬虫的程序。 主要的差异可能源于开发工具和环境的差异。Linux上通常使用命令行工具来编写和运行爬虫程序&#xff0c;而Windows则更加倾向于使用图形化界面的编程软件…

chatgpt赋能python:Python定义父类的意义及用法

Python定义父类的意义及用法 Python是一种高级编程语言&#xff0c;具有强大的面向对象编程&#xff08;OOP&#xff09;能力。在OOP的设计中&#xff0c;定义一个父类可以让多个子类继承其属性和方法&#xff0c;从而提高代码重用率并简化程序的开发。 如何定义Python中的父…

一起看 I/O | 借助 Google Play 管理中心价格实验,优化定价策略

作者 / Google Play 产品经理 Phalene Gowling 今年 Google I/O 大会上的 "通过 Google Play Commerce 提升收益" 演讲重点为您介绍了深度集成至 Google Play 的最新创收工具。此工具专注于帮您优化定价策略。为您的产品或内容确定合适的价格是实现更出色的用户生命周…

大会议题重磅出炉,豪华阵容等你面基!RustChinaConf 2023!【附第一天议程】

本次大会议题品质一流&#xff0c;嘉宾多来自行业一线&#xff0c;干货多多&#xff0c;且在各领域遍地开花&#xff0c;可看出Rust星星之火在中国已成燎原之势&#xff01; 大会时间地址 6.17 - 6.18 浦东新区张杨路777号 上海锦江汤臣洲际酒店 官网地址 https://rustcc.cn/20…

华为云发布面向消费终端的企业云原生白皮书,开辟移动时代的云原生路径

2013年&#xff0c;程序员Matt Stine提出“CloudNative”概念&#xff0c;后来他又将这项技术的特点归纳为模块化、可观察、可部署、可测试、可替换、可处理6项&#xff0c;这就是大名鼎鼎的云原生。 十年过去&#xff0c;云原生的价值在科技界可谓无人不知&#xff0c;谁都能说…

合宙-Air724模块的程序下载和二次开发下载方法

一、资料准备 参考&#xff1a;Luat社区 (openluat.com) 合宙官方&#xff1a; 银尔达官方提供如下&#xff1a; 下载相应的资料即可&#xff0c;资料链接如下&#xff1a; https://doc.openluat.com/wiki/27?wiki_page_id3038 http://wiki.yinerda.com/index.php/Core-Air724…

2023智源大会议程公开丨基础模型前沿技术论坛

6月9日&#xff0c;2023北京智源大会&#xff0c;将邀请这一领域的探索者、实践者、以及关心智能科学的每个人&#xff0c;共同拉开未来舞台的帷幕&#xff0c;你准备好了吗&#xff1f;与会知名嘉宾包括&#xff0c;图灵奖得主Yann LeCun、图灵奖得主Geoffrey Hinton、OpenAI创…

职业选择的两种路径:向外求 vs 向内求

和很多职场人士、创业者交流过事业的方向选择&#xff0c;抛开具体的决策方法&#xff0c;我感受到背后有两种价值观。 简单说&#xff0c;向外求 vs 向内求。 现如今&#xff0c;如果你人到中年面临“毕业”&#xff0c;又一次需要做职业选择&#xff0c;也可以参考。 前者的选…

【JavaSE】Java(五十六):核心要点总结

文章目录 1. byte 类型 127 1等于多少2. java容器有哪些3. Collection 和Collections 有什么区别4. list 和 set 的区别5. HashMap 和 Hashtable 有什么区别 1. byte 类型 127 1等于多少 当byte类型的值超出它的范围时&#xff0c;它会发生溢出并且变为负数。在Java中&#x…

【Python】Python系列教程-- Python3 输入和输出(二十四)

文章目录 前言输出格式美化旧式字符串格式化读取键盘输入读和写文件文件对象的方法f.read()f.readline()f.readlines() 打开一个文件f.write()f.tell()f.seek()f.close()pickle 模块 前言 往期回顾&#xff1a; Python系列教程–Python3介绍&#xff08;一&#xff09;Python…

《Opencv3编程入门》学习笔记—第五章

《Opencv3编程入门》学习笔记 记录一下在学习《Opencv3编程入门》这本书时遇到的问题或重要的知识点。 第五章 core组件进阶 一、访问图像中的像素 &#xff08;一&#xff09;图像在内存之中的存储方式 图像矩阵的大小取决于所用的颜色模型&#xff0c;确切地说&#xff…

基于FPGA的超声波测距

文章目录 一、HC-SR04超声波测距模块说明1、产品特点2、电气参数3、HC-SR04超声波测距模块4、超声波时序图 二、程序设计 一、HC-SR04超声波测距模块说明 1、产品特点 HC-SR04 超声波测距模块可提供 2cm-400cm 的非接触式距离感测功能&#xff0c;测距精度可达高到 3mm&#…

驱动开发--字符设备驱动

目录 1.驱动模块 hello.c Makefile 2.内核中的打印函数&#xff08;编写第一个驱动程序&#xff09; Source Insight 使用&#xff1a; 3.打印函数编写 分析 4、驱动的多文件编译 5、模块传递参数 6、安装好驱动之后如何传参&#xff1f; 7、字符设备驱动 8、字符设…