C#,码海拾贝(26)——求解“一般带状线性方程组”之C#源代码,《C#数值计算算法编程》源代码升级改进版

news2024/11/23 8:06:59

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/579870.html

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

相关文章

Reorder buffer and Reservation station

Reoder buffer(ROB) 为了解决异常问题 instruction 的decode阶段被写入缓冲区的条目&#xff0c;指令完成的话&#xff0c;向缓冲区写入结果&#xff0c;最早decode的指令&#xff08;程序顺序&#xff09;如果没有被标记异常的话&#xff0c;写入reg file register rename …

基于STM32的IIC驱动协议实现

目录 1.简介 2.特点 3.协议细节 1.简介 IIC(Inter&#xff0d;Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式串行线&#xff0c;用于连接微控制器及其外围设备。它是由数据线 SDA 和时钟 SCL 构成的串行总线&#xff0c;可发送和接收数据。在 CPU 与被控 IC 之…

第一部分-基础篇-第一章:PSTN与VOIP(下篇)

文章目录 序言上一篇文章&#xff1a;1.6 电路交换与分组交换1.6.1 电路交换1.6.2 分组交换 1.7 VoIP1.8 IMS1.8.1 什么是IMS1.8.2 IMS的特点1.8.3 IMS核心网元&#xff08;1 &#xff09; CSCF&#xff08;2 &#xff09; MGCF&#xff08;3 &#xff09; IM-MGW&#xff08;5…

【数据结构】--单链表力扣面试题⑤链表分割

目录 一、有相对顺序的链表分割 二、无相对顺序的链表分割 一、有相对顺序的链表分割 题述&#xff1a;现有一链表的头指针ListNode* phead,给一定值x,编写一段代码将所有<x的结点排在其余结点之前&#xff0c;且不能改变原来的数据顺序&#xff0c;返回重新排序后的链表的…

Three.js加载FBX模型并解析骨骼动画

通过Threejs先加载一个.FBX格式的三维模型文件&#xff0c;然后解析该文件中的骨骼动画信息。 FBX 加载器FBXLoader.js <!-- 引入fbx模型加载库FBXLoader --> <script src"http://www.yanhuangxueyuan.com/versions/threejsR92/examples/js/loaders/FBXLoader.…

Linux源码包的安装与升级

文章目录 Linux源码包的安装与升级什么是源代码、编译器与可执行文件什么是函数库什么是make与configure什么是Tarball的软件如何安装与升级软件 Linux源码包的安装与升级 如果你想在自己的Linux服务器上运行网站&#xff0c;就需要安装一个Web服务器软件&#xff0c;否则无法…

测试工程师 | 测试基础知识点速查

文章目录 1. 测试介绍2. 测试的分类2.1 按照测试阶段划分&#xff08;4种&#xff09;2.2 按照代码可见度划分&#xff08;3种&#xff09;2.3 是否运行代码&#xff08;2种&#xff09;2.4 是否按照自动化&#xff08;2种&#xff09;2.5 其它测试&#xff08;4种&#xff09;…

深入篇【C++】CC++内存管理:new/delete底层原理剖析+思维导图总结

深入篇【C】C&C内存管理&#xff1a;new/delete底层原理剖析思维导图总结 Ⅰ.C/C内存分布Ⅱ.C的内存管理Ⅲ.C的内存管理①.new/delete操作内置类型总结&#xff1a; ②.new/delete操作自定义类型总结: ③.operator new与operator delete总结&#xff1a; ④.new/delete底层…

【C++String类使用】万字详解保姆级教学,手把手教你使用string类。

string类的使用 什么是string类&#xff1f;string构造string();string (const char* s);string (const string& str);string (const string& str, size_t pos, size_t len npos);string (const char* s, size_t n);string (size_t n, char c);template < class In…

《The Element of Style》阅读笔记 —— 章节 III A Few Matters of Form

前言&#xff1a;本篇为书籍《The Element of Style》第三章的阅读笔记。 本书电子版链接&#xff1a;http://www.jlakes.org/ch/web/The-elements-of-style.pdf 章节 I Elementary Rules of Usage 阅读笔记&#xff1a;链接章节 II Elementary Principles of Composition 阅读…

JavaScript进阶之路(一)初学者的开始

一&#xff1a;写在前面的问题和话 一个javascript初学者的进阶之路&#xff01; 背景&#xff1a;3年后端&#xff08;ASP.NET&#xff09;工作经验&#xff0c;javascript水平一般般&#xff0c;前端水平一般般。学习资料&#xff1a;犀牛书。 如有误导&#xff0c;或者错…

Git日常使用技巧 - 笔记

Git日常使用技巧 - 笔记 Git是目前世界上最先进的分布式版本控制系统 学习资料 廖雪峰 学习视频 https://www.bilibili.com/video/BV1pX4y1S7Dq/?spm_id_from333.337.search-card.all.click&vd_source2ac127043ccd79c92d5b966fd4a54cd7 Git 命令在线练习工具 https://l…

多线程 -- Thread类的基本用法

本篇重点 什么是变量捕获?? 有关线程的操作 线程创建线程中断线程等待线程休眠获取线程实例目录 1. 线程创建2. 线程中断变量捕获 线程的六种状态NEW 状态TERMNATED 状态RUNNABLE 就绪状态TIMED_WAITING 状态 1. 线程创建 关于线程的创建看上篇博客, 里面为线程的创建提供…

数据库事务到底是什么?

目录 场景&#xff08;两个用户之间进行转账操作&#xff09;&#xff1a; 需要的操作步骤&#xff1a; 事务 事务的四大特性&#xff1a; 一、原子性 &#xff08;1&#xff09;什么是回滚操作 &#xff08;2&#xff09;数据库恢复操作&#xff0c;如何知道数据恢复如初…

C++ Stack&queue&deque

C Stack&#xff06;queue&#xff06;deque &#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;C &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容主要讲解了栈和…

如何在华为OD机试中获得满分?Java实现【字符串通配符】一文详解!

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Java华为OD机试真题&#xff08;2022&2023) 文章目录 1、题目描述2、输入描述3、输出描述…

Rust 笔记:Rust 语言中应用正则表达式

Rust 笔记 Rust 语言中应用正则表达式 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/…

【Linux】线程详解之线程互斥与同步

文章目录 Linux线程互斥一、进程线程间的互斥相关概念1.临界资源和临界区2.互斥和原子性 二、互斥量mutex1.抢票程序是否引入互斥量现象观察2.抢票程序原理分析3.互斥量的接口4. 加锁后的程序5.互斥量原理探究 可重入VS线程安全一、概念1.线程安全2.重入 二、常见的线程不安全的…

【P37】JMeter 仅一次控制器(Once Only Controller)

文章目录 一、仅一次控制器&#xff08;Once Only Controller&#xff09;参数说明二、测试计划设计2.1、测试计划一2.1、测试计划二 一、仅一次控制器&#xff08;Once Only Controller&#xff09;参数说明 可以让控制器内部的逻辑只执行一次&#xff1b;单次的范围是针对某…

Spring Authorization Server 系列(一)环境搭建

Spring Authorization Server 中的scope参数解析 前提依赖版本问题确定Spring Boot 版本确定 Spring Authorization Server 版本最终的依赖 第一个 Spring Authorization Server Demo 前提 由于 Spring 最新的 OAuth2 解决方案 已经由 Spring Security 下的 OAuth2 模块独立出…