C#,码海拾贝(24)——线性方程组求解的复系数方程组的全选主元高斯-约当消去法之C#源代码,《C#数值计算算法编程》源代码升级改进版

news2024/12/24 8:59:16

 

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="mtxCoefImag">系数矩阵的虚部矩阵</param>
        /// <param name="mtxConstImag">常数矩阵的虚部矩阵</param>
        /// <param name="mtxResult">Matrix对象,返回方程组解矩阵的实部矩阵</param>
        /// <param name="mtxResultImag">Matrix对象,返回方程组解矩阵的虚部矩阵</param>
        /// <return>bool 型,方程组求解是否成功</return>
        public static bool GetRootsetGaussJordan(Matrix mtxLECoef, Matrix mtxLEConst, Matrix mtxCoefImag, Matrix mtxConstImag, Matrix mtxResult, Matrix mtxResultImag)
        {
            int r, k, i, j, nIs = 0, u, v;
            double p, q, s, d;

            // 方程组的属性,将常数矩阵赋给解矩阵
            mtxResult.SetValue(mtxLEConst);
            mtxResultImag.SetValue(mtxConstImag);
            double[] pDataCoef = mtxLECoef.GetData();
            double[] pDataConst = mtxResult.GetData();
            double[] pDataCoefImag = mtxCoefImag.GetData();
            double[] pDataConstImag = mtxResultImag.GetData();
            int n = mtxLECoef.GetNumColumns();
            int m = mtxLEConst.GetNumColumns();

            // 临时缓冲区,存放变换的列数
            int[] pnJs = new int[n];

            // 消元
            for (k = 0; k <= n - 1; k++)
            {
                d = 0.0;
                for (i = k; i <= n - 1; i++)
                {
                    for (j = k; j <= n - 1; j++)
                    {
                        u = i * n + j;
                        p = pDataCoef[u] * pDataCoef[u] + pDataCoefImag[u] * pDataCoefImag[u];
                        if (p > d)
                        {
                            d = p;
                            pnJs[k] = j;
                            nIs = i;
                        }
                    }
                }

                // 求解失败
                if (Math.Abs(d) < float.Epsilon)//  d == 0.0)
                {
                    return false;
                }

                if (nIs != k)
                {
                    for (j = k; j <= n - 1; j++)
                    {
                        u = k * n + j;
                        v = nIs * n + j;
                        p = pDataCoef[u];
                        pDataCoef[u] = pDataCoef[v];
                        pDataCoef[v] = p;
                        p = pDataCoefImag[u];
                        pDataCoefImag[u] = pDataCoefImag[v];
                        pDataCoefImag[v] = p;
                    }

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

                if (pnJs[k] != k)
                {
                    for (i = 0; i <= n - 1; i++)
                    {
                        u = i * n + k;
                        v = i * n + pnJs[k];
                        p = pDataCoef[u];
                        pDataCoef[u] = pDataCoef[v];
                        pDataCoef[v] = p;
                        p = pDataCoefImag[u];
                        pDataCoefImag[u] = pDataCoefImag[v];
                        pDataCoefImag[v] = p;
                    }
                }

                v = k * n + k;
                for (j = k + 1; j <= n - 1; j++)
                {
                    u = k * n + j;
                    p = pDataCoef[u] * pDataCoef[v];
                    q = -pDataCoefImag[u] * pDataCoefImag[v];
                    s = (pDataCoef[v] - pDataCoefImag[v]) * (pDataCoef[u] + pDataCoefImag[u]);
                    pDataCoef[u] = (p - q) / d;
                    pDataCoefImag[u] = (s - p - q) / d;
                }

                for (j = 0; j <= m - 1; j++)
                {
                    u = k * m + j;
                    p = pDataConst[u] * pDataCoef[v];
                    q = -pDataConstImag[u] * pDataCoefImag[v];
                    s = (pDataCoef[v] - pDataCoefImag[v]) * (pDataConst[u] + pDataConstImag[u]);
                    pDataConst[u] = (p - q) / d;
                    pDataConstImag[u] = (s - p - q) / d;
                }

                for (i = 0; i <= n - 1; i++)
                {
                    if (i != k)
                    {
                        u = i * n + k;
                        for (j = k + 1; j <= n - 1; j++)
                        {
                            v = k * n + j;
                            u = i * n + j;
                            p = pDataCoef[u] * pDataCoef[v];
                            q = pDataCoefImag[u] * pDataCoefImag[v];
                            s = (pDataCoef[u] + pDataCoefImag[u]) * (pDataCoef[v] + pDataCoefImag[v]);
                            pDataCoef[u] = pDataCoef[u] - p + q;
                            pDataCoefImag[u] = pDataCoefImag[u] - s + p + q;
                        }

                        for (j = 0; j <= m - 1; j++)
                        {
                            u = i * m + j;
                            v = k * m + j;
                            p = pDataCoef[u] * pDataConst[v]; q = pDataCoefImag[u] * pDataConstImag[v];
                            s = (pDataCoef[u] + pDataCoefImag[u]) * (pDataConst[v] + pDataConstImag[v]);
                            pDataConst[u] = pDataConst[u] - p + q;
                            pDataConstImag[u] = pDataConstImag[u] - s + p + q;
                        }
                    }
                }
            }

            // 求解调整
            for (k = n - 1; k >= 0; k--)
            {
                if (pnJs[k] != k)
                {
                    for (j = 0; j <= m - 1; j++)
                    {
                        u = k * m + j;
                        v = pnJs[k] * m + j;
                        p = pDataConst[u];
                        pDataConst[u] = pDataConst[v];
                        pDataConst[v] = p;
                        p = pDataConstImag[u];
                        pDataConstImag[u] = pDataConstImag[v];
                        pDataConstImag[v] = p;
                    }
                }
            }

            return true;
        }
}

}

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

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

相关文章

delphi11.3的WebBrower支持Edge

看到此消息后&#xff0c;立即下载了DelphiCE&#xff08;社区版&#xff09; 安装&#xff0c;创建项目&#xff0c;放TWebBrowers&#xff0c;TButton 配置参数为EdgeOnly F9运行&#xff0c;没反应 配置参数为EdgeIfAvailable F9运行&#xff0c;提示浏览器版本过低 全网搜索…

chatgpt赋能python:Python取两者之间的最大值

Python取两者之间的最大值 介绍 Python是一种高级编程语言&#xff0c;广泛应用于计算机科学、人工智能、数据科学、机器学习等不同领域。它的易用性和灵活性使它成为许多开发人员首选的工具。本篇文章将介绍如何使用Python来取两者之间的最大值。 如何取两者之间的最大值 …

URP自定义屏幕后处理

回到目录 大家好&#xff0c;我是阿赵。这次来说一下URP渲染管线里面怎样使用后处理效果&#xff0c;还有怎样去自定义后处理效果。 一、使用URP自带的后处理效果 要使用URP自带的后处理效果&#xff0c;方法很简单&#xff0c;和Unity内置渲染管线的PostProcessing后处理很…

如何在Linux中更改SSH端口?

SSH&#xff08;Secure Shell&#xff09;是一种安全的远程登录协议&#xff0c;它允许您通过网络远程连接到Linux系统并进行管理操作。默认情况下&#xff0c;SSH使用22端口进行通信。然而&#xff0c;为了增强系统的安全性&#xff0c;有时候我们需要更改SSH端口&#xff0c;…

chatgpt赋能python:Python分解——探究Python语言的精髓

Python分解——探究Python语言的精髓 Python作为一种动态解释性语言&#xff0c;逐渐成为数据科学和人工智能领域的“标配”。Python语言的优势不仅在于其简洁而直观的语法&#xff0c;更在于其开源庞大的生态系统。而Python分解&#xff0c;则是将Python语言的优势、拆分并深…

chatgpt赋能python:Python内连接的重要性

Python内连接的重要性 在数据分析和机器学习领域&#xff0c;内连接是一种非常重要的概念&#xff0c;用于筛选和分析不同数据集之间的共同项。Python语言的强大功能和广泛的库可以帮助我们轻松地实现内连接。在本文中&#xff0c;我们将介绍Python内连接的基础知识、实现方式…

chatgpt赋能python:Python分组:组织你的代码,提升可读性和可维护性

Python 分组: 组织你的代码&#xff0c;提升可读性和可维护性 在编写代码时&#xff0c;组织良好的代码结构和架构是非常重要的。对于大规模的项目&#xff0c;特别是多人合作开发的项目来说&#xff0c;代码管理和组织是至关重要的。Python 分组是一种常用的技术&#xff0c;…

css高级技巧

1. 精灵图 index.png 分析图 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title…

chatgpt赋能python:Python单行if语句

Python 单行 if 语句 在 Python 编程中&#xff0c;条件语句 if 是一个非常重要的控制流语句&#xff0c;它的主要作用是根据条件的真假来决定程序的走向。在编写 Python 代码时&#xff0c;经常会遇到需要在某些情况下只执行一行代码的情况。这时&#xff0c;就可以使用 Pyth…

chatgpt赋能python:Python取出列表数字

Python 取出列表数字 如果你是一名 Python 开发者&#xff0c;并且你需要从一个列表中取出数字&#xff0c;那么你来到了对的地方。 介绍 Python 是一门很流行的编程语言&#xff0c;它有很多内置函数和库&#xff0c;可以帮助你快速地完成各种任务。在 Python 中&#xff0…

使用yolov5实现图片分类

文章目录 开始之前下载依赖数据集下载新建配置文件执行训练模型选择训练完成测试模型进行预测自定义模型下载数据集下载地址分享问题 开始之前 你应当先克隆这个仓库 git clone https://github.com/ultralytics/yolov5 # clone下载完毕后&#xff0c;进入克隆的仓库目录 cd …

Linux系统静态IP配置(CentOS)

刚刚装好的Linux系统&#xff08;Ubuntu版本&#xff09;通过ifconfig&#xff08;如果是CentOS版本需要使用ipaddr&#xff09;之后没有发现IP地址 首先在Linux终端通过su root指令进入root用户下获得管理员权限&#xff0c;之后进入cd /etc/sysconfig/network-scripts目录中 …

Linux命令(23)之cat

Linux命令之cat 1.cat介绍 linux命令cat用于把文件内容显示在标准输出设备&#xff08;即&#xff1a;显示器&#xff09;上&#xff0c;也可以(单个/几个)文件内容追加别的文件当中去。 2.cat用法 cat [参数] [文件名称] cat命令常用参数 参数说明-b对所有非空输出进行编号…

大数据 | 实验四:并行化数据挖掘算法设计

文章目录 &#x1f4da;实验目的&#x1f4da;实验平台&#x1f4da;实验内容&#x1f4da;实验步骤&#x1f407;KNN介绍&#x1f407;并行化&#x1f955;在本地编写程序和调试&#x1f955;在集群上提交作业并执行 &#x1f407;非并行化 &#x1f4da;实验目的 机器学习和…

chatgpt赋能python:Python切换输入法:实现更高效的编程

Python 切换输入法&#xff1a;实现更高效的编程 对于有多国语言需求的程序员来说&#xff0c;切换输入法是日常编程的基本操作之一。Python是一门广泛使用的编程语言&#xff0c;对于那些使用中文输入法的开发者来说&#xff0c;如何高效地切换输入法是一个需要考虑的问题。 …

chatgpt赋能python:Python去噪——提高图像质量的神器

Python去噪——提高图像质量的神器 介绍 随着科技的发展&#xff0c;我们的生活被数字化&#xff0c;许多信息都被存储在数字化设备中。这些设备会允许我们拍摄照片、视频和录音等多媒体文件。然而&#xff0c;在实际应用中&#xff0c;多媒体数据通常存在一些问题&#xff0…

chatgpt赋能python:Python加噪声:让你的数据更真实,更可靠

Python加噪声&#xff1a;让你的数据更真实&#xff0c;更可靠 Python作为一种开源高级编程语言&#xff0c;使得加噪声变得非常简单。加噪声是为了让数据更真实、更可靠&#xff0c;防止数据中的过拟合现象。那么本文将介绍Python添加噪声的基本概念和它的具体实现方法。 什…

chatgpt赋能python:Python中取某一列的方法

Python中取某一列的方法 Python是一种易于学习但功能强大的编程语言。它在数据分析、机器学习和Web开发中广泛应用。在这个代码示例中&#xff0c;我们将介绍如何使用Python从数据集中选择某一列。 获取数据集 为了演示如何从数据集中选择某一列&#xff0c;我们将首先使用p…

Packet Tracer - 配置编号标准 IPv4 ACL

Packet Tracer - 配置编号标准 IPv4 ACL 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 R1 G0/0 192.168.10.1 255.255.255.0 不适用 G0/1 192.168.11.1 255.255.255.0 不适用 S0/0/0 10.1.1.1 255.255.255.252 不适用 S0/0/1 10.3.3.1 255.255.255.25…

chatgpt赋能python:Python分配内存的机制

Python 分配内存的机制 Python 是一种高级编程语言&#xff0c;它支持多种数据类型和模块化编程&#xff0c;这使得它成为了快速开发的首选语言。由于 Python 是一种解释型语言&#xff0c;它会动态地分配内存以支持程序执行。在本文中&#xff0c;我们将探讨 Python 分配内存…