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;
        }
}

}

C#,码海拾贝(24)——求解“复系数方程组”的“全选主元高斯-约当消去法”之C#源代码相关推荐

  1. 全选主元高斯消去法 matlab程序,[VB]全选主元高斯消去法求解线性方程组

    功能:  使用全选主元高斯消去法求解线性方程组 '  参数    n     - Integer型变量,线性方程组的阶数 ' dblA   - Double型 n x n 二维数组,线性方程组的系数矩 ...

  2. MATLAB求解复系数特征方程的实数根的方法

    已知一个复系数的特征方程,我们规定其特征根为实数,那么求根的过程其实就是将该方程展开,分别列出其实部方程和虚部方程,然后依次求解.这里需要用到的MATLAB函数有: expand(扩展表达式并简化函数 ...

  3. C#,码海拾贝(05)——拉格朗日(Lagrange)三点式曲线插值算法之C#源程序

    一.约瑟夫·拉格朗日 约瑟夫·拉格朗日(Joseph-Louis Lagrange,1736~1813)全名为约瑟夫·路易斯·拉格朗日,法国著名数学家.物理学家.1736年1月25日生于意大利都灵,1 ...

  4. [码海拾贝 之Perl]获取日期以及日期的加减

    前言 在Perl 中, 不安装其他模组的状况下, 可以使用 localtime 来获取当地日期和时间. 在标量上下文中, 返回的是字符串格式. my $localtime = localtime(); ...

  5. C#,码海拾贝(11)——拉格朗日(Lagrange)三点式曲面插值(Surface Interpolation)算法C#源程序

    本文开始是曲面插值(Surface Interpolation,也称作:二维插值,二元插值). 数值计算三点式 数值计算三点式是一种常见的数值计算方法,它是通过对已知函数在某个点及其左右两个点处的函数 ...

  6. [码海拾贝 之TC] 使用View 定义动态的Class

    前言 在TC 中, Persistent Class 和 Table 是对应的关系. 定义一个Persistent的Class , updatedb 的时候就会产生对应的table. 在TC 的开发环 ...

  7. [码海拾贝 之TC] 呼叫外部应用程序或脚本

    前言 在Teamcenter Enterprise 的服务端开发中, 如何调用到外部的程序或是脚本. 一般, 呼叫外部的程序或脚本 在Java 中, 可以用这样的方式 Process child = ...

  8. [码海拾贝 之JS] JS 之删除数组中的元素

    前言 在Java 中要从一个list 中删除一个元素, 直接使用 remove 方法就可以了. 在js 中的array 并没有 remove 方法, 但是在js 中array 有splice 方法可以 ...

  9. [码海拾贝 之Perl]在字符串数组中查找特定的字符串是否存在

    前言 检索一个字符串是否存在于一个数组中, 最基本的想法应该就是对数组进行循环, 逐个判断数组的每个元素值和给定的值是否相等. (在Java语言还可以把数组转成 List , 在 list 中直接有 ...

最新文章

  1. cvc-complex-type.3.2.2: 元素 'constructor-arg' 中不允许出现属性 'name'
  2. Microsoft Speech SDK 编程入门
  3. ansible配置详解及基本示例
  4. boost::graph::distributed::hohberg_biconnected_components用法的测试程序
  5. (转)剖析Delphi中的构造和析构
  6. spring— Bean标签scope配置和生命周期配置
  7. 基于Chrome浏览器的前端调试
  8. 形容计算机专业好句子,关于形容专业水平高的句子大全 精于专业的名言警句...
  9. 【语音采集】基于matlab语音采集及处理【含Matlab源码 1737期】
  10. 兆,字节,位等单位转换
  11. 安装molten教程
  12. shapely包的使用
  13. Python 去除重复行数据
  14. 面向接口编程VS《倚天屠龙记》里张三丰教无忌打太极
  15. python中关于Process finished with exit code -1073740791 (0xC0000409)的解决办法
  16. 找2021考研资料?这些超强资源网站必须知道!
  17. java课程设计atm机_java课程设计报告-自动取款机模拟程序.doc
  18. SQL经典案例(学生表,课程表,选课表,教师表) 练习
  19. 软件性能测试方案怎么编写?
  20. 总之,总而言之的不同英文表达方式

热门文章

  1. vs2010 添加删除工具栏资源的上图标按钮
  2. IT人物之《Netty权威指南》中文作者 专访华为李林锋:我与Netty那些不得不说的事
  3. 将 Kali v.2020_2 x64 GNOME 3 桌面上的Top Bar 移到底部
  4. cad连接不同线段的端点_cad里可不可以自动在多段线的端点上生成点?
  5. ArcGIS Pro 共享地图(MPKX)
  6. Beyond Compare“授权密钥已被吊销”的解决办法
  7. 怎么利用抖音引流微信?抖音吸粉到微信的方法
  8. fundamentals of power electronics (third edition)
  9. 入侵排查篇--- windows入侵排查
  10. Python逻辑运算符有哪些?