C#,码海拾贝(24)——求解“复系数方程组”的“全选主元高斯-约当消去法”之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="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#源代码相关推荐
- 全选主元高斯消去法 matlab程序,[VB]全选主元高斯消去法求解线性方程组
功能: 使用全选主元高斯消去法求解线性方程组 ' 参数 n - Integer型变量,线性方程组的阶数 ' dblA - Double型 n x n 二维数组,线性方程组的系数矩 ...
- MATLAB求解复系数特征方程的实数根的方法
已知一个复系数的特征方程,我们规定其特征根为实数,那么求根的过程其实就是将该方程展开,分别列出其实部方程和虚部方程,然后依次求解.这里需要用到的MATLAB函数有: expand(扩展表达式并简化函数 ...
- C#,码海拾贝(05)——拉格朗日(Lagrange)三点式曲线插值算法之C#源程序
一.约瑟夫·拉格朗日 约瑟夫·拉格朗日(Joseph-Louis Lagrange,1736~1813)全名为约瑟夫·路易斯·拉格朗日,法国著名数学家.物理学家.1736年1月25日生于意大利都灵,1 ...
- [码海拾贝 之Perl]获取日期以及日期的加减
前言 在Perl 中, 不安装其他模组的状况下, 可以使用 localtime 来获取当地日期和时间. 在标量上下文中, 返回的是字符串格式. my $localtime = localtime(); ...
- C#,码海拾贝(11)——拉格朗日(Lagrange)三点式曲面插值(Surface Interpolation)算法C#源程序
本文开始是曲面插值(Surface Interpolation,也称作:二维插值,二元插值). 数值计算三点式 数值计算三点式是一种常见的数值计算方法,它是通过对已知函数在某个点及其左右两个点处的函数 ...
- [码海拾贝 之TC] 使用View 定义动态的Class
前言 在TC 中, Persistent Class 和 Table 是对应的关系. 定义一个Persistent的Class , updatedb 的时候就会产生对应的table. 在TC 的开发环 ...
- [码海拾贝 之TC] 呼叫外部应用程序或脚本
前言 在Teamcenter Enterprise 的服务端开发中, 如何调用到外部的程序或是脚本. 一般, 呼叫外部的程序或脚本 在Java 中, 可以用这样的方式 Process child = ...
- [码海拾贝 之JS] JS 之删除数组中的元素
前言 在Java 中要从一个list 中删除一个元素, 直接使用 remove 方法就可以了. 在js 中的array 并没有 remove 方法, 但是在js 中array 有splice 方法可以 ...
- [码海拾贝 之Perl]在字符串数组中查找特定的字符串是否存在
前言 检索一个字符串是否存在于一个数组中, 最基本的想法应该就是对数组进行循环, 逐个判断数组的每个元素值和给定的值是否相等. (在Java语言还可以把数组转成 List , 在 list 中直接有 ...
最新文章
- cvc-complex-type.3.2.2: 元素 'constructor-arg' 中不允许出现属性 'name'
- Microsoft Speech SDK 编程入门
- ansible配置详解及基本示例
- boost::graph::distributed::hohberg_biconnected_components用法的测试程序
- (转)剖析Delphi中的构造和析构
- spring— Bean标签scope配置和生命周期配置
- 基于Chrome浏览器的前端调试
- 形容计算机专业好句子,关于形容专业水平高的句子大全 精于专业的名言警句...
- 【语音采集】基于matlab语音采集及处理【含Matlab源码 1737期】
- 兆,字节,位等单位转换
- 安装molten教程
- shapely包的使用
- Python 去除重复行数据
- 面向接口编程VS《倚天屠龙记》里张三丰教无忌打太极
- python中关于Process finished with exit code -1073740791 (0xC0000409)的解决办法
- 找2021考研资料?这些超强资源网站必须知道!
- java课程设计atm机_java课程设计报告-自动取款机模拟程序.doc
- SQL经典案例(学生表,课程表,选课表,教师表) 练习
- 软件性能测试方案怎么编写?
- 总之,总而言之的不同英文表达方式
热门文章
- vs2010 添加删除工具栏资源的上图标按钮
- IT人物之《Netty权威指南》中文作者 专访华为李林锋:我与Netty那些不得不说的事
- 将 Kali v.2020_2 x64 GNOME 3 桌面上的Top Bar 移到底部
- cad连接不同线段的端点_cad里可不可以自动在多段线的端点上生成点?
- ArcGIS Pro 共享地图(MPKX)
- Beyond Compare“授权密钥已被吊销”的解决办法
- 怎么利用抖音引流微信?抖音吸粉到微信的方法
- fundamentals of power electronics (third edition)
- 入侵排查篇--- windows入侵排查
- Python逻辑运算符有哪些?