介绍
程序SolveLinearEquations解决联立方程。该方案需要一个文本文件,其中包含输入和输出方程解决。这个项目是几年前我写在C#中http://www.codeproject.com/Articles/673076/Linear-Equation-Solver线性方程组求解。以外,这个程序没有图形用户界面和一个稍微修改公式格式,这个计划是非常类似于C#程序,该程序使用SparseArray模板类来实现向量和矩阵。矩阵使用DoubleIndex的类,这需要两个整数指数,实行单一的键使用SparseArray类。矩阵SparseArray的存储类型是双精度数。每个向量只是一个实例的的SparseArray类存储一个双精度值一个整数索引一键。代码使用原油的解析器来解析输入文件中的方程。这是原油,因为它需要有些僵硬的输入格式,不支持括号或数学函数。
输入文件是一个文本文件,其中包含方程。可以有不超过1024个字符的行上。方程以分号结束。如果没有分号结尾的行,然后在下一行上继续方程。
该方程具有以下格式,它允许使用加法和减法符号,以结合的形式:
[number][variable]
每个方程中必须有一个单等号。
无论是数字或变量是可选的,可以结合使用加号或减号所需的许多条款。这个数字可以包含小数点和指数。变量可以
只包含字母字符或下划线字符。
浮点指数前^字符,而不是通常的ê字符,以避免任何模糊变量名。下面的行显示一个浮点数,等于230万。
X = 2.3^6
公式必须包含一个等号。
方程组的一个例子是:
3 X + 4 Y = -5 Z
X + Z = 10 Y
X + Z = 42.5
注意空行分隔方程。
该程序产生的解决方案,这些方程:
X = 114.75
Y = 4.25
Z = -72.25
设置3个方程的另一个例子可能是:
MARYS_AGE=2BOBS_AGE ; BOBS_AGE = 3 CATHYS_AGE
CATHYS_AGE = 4;
或另外一个例子:
HEIGHT = 5 + 10
如果您忘记了公式的格式
运行下面的命令行程序,将给上述有关公式输入文件中的要求的格式相同的信息。
SolveLinearEquations -h
背景
我在大学的时候,我写了一个电路分析程序在Fortran。我需要一种方法来解联立方程,我无意中发现了下面这本书和算法:
病态线性方程组 “,由JH威尔金森,”数字计算机的数学方法“第2卷,编辑安东尼·罗尔斯顿和赫伯特·S·维尔夫,1967年,约翰·威利父子,第65-93页的“ 解决方案。虐待空调的方程组是一组方程,是很困难或不可能解决使用给定的浮点精度。方程病态当两个或更多的方程定义几乎平行的线,或两个以上的尺寸,几乎平行的平面几乎平行的超平面的情况下。病态方程的一个例子将是:
3 10 -12 X + Y = 0.7
X + Y = 0.9,我很幸运,栽倒在这个特定的参考。虽然这本书给出了一个标准的执行 高斯消去部分旋转,教计算机科学线性代数课程,这种算法也确定是否可以找到一个准确的解决方案。这是通过使用两个矩阵的 规范和一个常数,它被设置的基础上的一个浮点数的尾数的比特数。
我已经重写了该算法几次。我写这在Fortran,C + +使用简单的数组,再在C + +使用的是稀疏的容器类,终于在C#中。
早在20世纪70年代末,我一个DEC-10计算机上运行这个算法,解决1000 1000在大约30秒的变量方程。今天,与原来的C代码,一个问题,就是在PC上运行,大小在
眨眼。这段代码是比较慢,因为它使用了一个的SparseArray,但它仍然是非常快的。
文件列表
SolveLinearEquations.cpp – 主程序。
LinearEquationParser.cpp – 解析输入文件包含方程。
LinearEquationParser.h – 分析器头文件。
CharString.cpp – 一个字符串处理类
CharString.h – 字符串类的头文件。
MatrixPackage.cpp – 包含线性方程组的求解器功能。
MatrixPackage.h – 线性方程组求解的头文件。
SparseArray.h – 的SparseArray模板文件。
DoubleIndex.cpp进入一个关键的两个指标 – A类。
DoubleIndex.h – 头文件DoubleIndex
SolveLinearEquations.vcproj – Visual Studio 2008项目文件。
SolveLinearEquations.sln – Visual Studio 2008的解决方案文件。
关于SolveLinearEquations功能
一组线性方程组的矩阵方程表示:
aMatrix xVector = bVector
该aMatrix bVector,并给出的xVector是解决。
上面给出的方程组的第一个例子中可改写为:
3 X + 4 Y + 5 Z = 0
1 X – 10 Y + 1 Z = 0
1 X + 0 Y + 1 Z = 42.5
这些方程的矩阵形式为:
| 3 4 5 | | X | | 0 | | 1 10 1 | | Y | = | 0 | | 1 0 1 | | Z | | 42.5 |
的aMatrix是在左边的方阵。在右边的bVector。
的xVector,其中包含的变量名,这是个未知数,是在中间。为了解决这些方程,调用SolveLinearEquations功能在MatrixPackage命名空间。此功能在文件MatrixPackage.h和定义实施文件MatrixPackage.cpp。
Status_T SolveLinearEquations(unsigned int number_of_equations, const SparseMatrix & a_matrix, const SparseVector & b_vector, SparseVector & x_vector);
一天的意图,实现更大的一组矩阵运算命名这些文件MatricPackage的意图。所有我需要的时候是一个方程求解,,和一些错误代码,现在是矩阵包。xVector,这将存储解决方案,是最后一个参数。方程的数量是一维的正方形矩阵的大小。
该计划还将表示,如果一组方程是’奇异’的工作精度。甲奇异的一组方程没有单一的解决方案,因为两个或更多的方程仅仅是其他公式的倍数,如:
X + Y = 7 2X + 2Y = 36
即使第二个方程,“2X + 2Y = 14”,所以这是与第一个方程相一致,没有单一的解决方案的两个方程,方程是奇异的加工精度,该方案将报告。
确定如果方程是病态的一个重要参数
文件MatrixPackage.cpp包含一个常数,它是一套基于数位双精度浮点数的尾数。
const double f_SMALL_FLOAT = 5.69E-14;
如果线性方程解算器移植到另一个平台上,那么一定要调整这个常数。该代码包含以下注释,关于这个常数。
/ / 原来实行浮动的电脑上
。对于该系统,下面的值
/ / 设置为2.92E-11,只是略大于
/ / 1 /(2 ^ 35),这是2.91E-11。对于我的英特尔系统,尾数
/ / 双精度浮点数是48位,所以
/ / 值设置为略大于1 /(2 ^ 44)。1 /(^ 44)
/ / 计算结果为5.68E-14,所以值5.69E-14是用在这里。
为什么稀疏的容器用于向量和矩阵。
在20世纪70年代后期,我实现了这个算法在Fortran的电路分析程序。该阵列是硬编码的大小。因此,要解决1000 1000系统的方程需要两个矩阵,有1000 项,或一百万个条目!多年以后,我重新编码,这在C语言中,再次与硬编码的大小。大多数现实世界的问题,要求矩阵大小远远小于1000 1000,或矩阵是稀疏的。电路分析程序通常需要大约5每个方程中,其中每个词对应的一列“组成的”矩阵。所以,一个1000 1000矩阵这样的问题会只有1000 5星,或5000的非零项。因此,稀疏容器将只有5000双精度值存储,1000 1000,而一个完整的矩阵将需要一百万双精度值,或尽可能多值的200倍!
对于非常大的问题,节省空间巨大,值得在运行时的性能退化。
另外,我意识到,这是很容易实现稀疏的容器和算法,将其转换为使用固定大小的数组,而做相反的是大量的工作。所以,有人可以转换使用了大量的空间,并有可能更快。随着现代处理器的高速缓存中,根据总线的速度和处理器体系结构,使得该算法使用了大量的内存,可以使算法的速度较慢,即使当执行的指令数是由更小。
使用代码
创建一个文件,该文件只包含方程早在这篇文章中提到的格式,或使用提供的文件equations.txt的。输入:
SolveLinearEquations equations.txt
该计划将输出变量名和值按字母顺序排序的列表。对于文件equations.txt,输出将是:
Linear Equation Solver – Version 2.01
Copyright (C) William Hallahan 2001-2013.
Ann = 2
Joe = 8
Mary = 12
Rita = 18
Tom = 70
总结
只有的ASCII构建支持Windows。字符串类型类不支持Unicode,但大部分其他的代码将被移植。最困难的代码端口将输入文件的代码,使用ofstream的。虽然这是可能的,但它需要更多的工作,使其跨平台移植。
我还没有测试在g+ +编译器中的代码SparseArray.h MatrixPackage.cpp(H)在Linux上使用。我预计,如果代码不编译和在Linux,使其工作所需的改变将是最小的和简单的。
<!--EndFragment-->
相关推荐
用C/C++语言实现如下函数: 1. bool lu(double* a, int* pivot, int n);矩阵的LU分解。 假设数组anxn在内存中按行优先次序存放。此函数使用高斯列选主元消去法将其就地进行LU分解。pivot为输出参数,pivot[0,n) 中...
根据给定的信息,本文将详细解释使用C++解决线性方程组的几种方法,包括克莱默法则(Cramer's Rule)、高斯消元法(Gauss Elimination)、全高斯消元法(Full Gauss Elimination)以及杜利特分解法(Doolittle ...
c++线性方程组求解源代码c++线性方程组求解源代码
在提供的压缩包文件"Linear_Function"中,可能包含了实现这些算法的源代码文件,通过阅读和分析代码,可以深入理解C++在求解线性方程组中的应用。学习和掌握这些知识,不仅有助于理解数值计算的基础,还能提升在实际...
本篇将详细介绍“解线性方程组的C++类库”及其在实际应用中的重要性。 线性方程组通常由多个变量和它们之间的线性关系构成,形式为 Ax = b,其中A是系数矩阵,x是未知数向量,b是常数向量。求解线性方程组的方法有...
求线性方程组的解C++源代码。求出系数行列式的值,再根据克莱姆法则求解。(保证全过)
二分法解非线性方程C++代码
通过上述方法,我们可以方便地使用C++和Eigen库来求解线性方程组。这种方法不仅简洁而且效率高,非常适合于实际工程项目中。同时,Eigen库的强大功能也为更复杂的线性代数运算提供了可能。对于开发者来说,掌握这一...
LU分解是一种有效的求解线性方程组的方法,它将矩阵A分解为一个下三角矩阵L和一个上三角矩阵U的乘积,即A = LU。这样,原问题可以转换为两个更简单的步骤:首先解Ly = b得到y,然后解Ux = y得到x。 **Intel MKL中的...
c++代码,利用eigen矩阵库,求解线性方程组。 c++代码,利用eigen矩阵库,求解线性方程组。 c++代码,利用eigen矩阵库,求解线性方程组。 c++代码,利用eigen矩阵库,求解线性方程组。 c++代码,利用eigen矩阵库,...
根据给定的文件标题“C++求解方程组”及描述中的方法,本文将详细介绍以下几种线性方程组的求解算法:克拉默(Cramer)法则、高斯列主元消去法、高斯全主元消去法以及杜利特尔(Doolittle)分解法。 ### 1. 克拉默...
在提供的压缩包文件"08010228(1)"中,很可能包含了一个用C++实现的线性方程求解器。这个程序可能包含了上述方法中的一种或多种,通过读取和解析输入数据,计算解,并输出结果。为了理解并使用这段代码,你需要具备...
采用拟牛顿法求解非线性方程组,结构完整,非线性方程组在此程序里为显示,若是隐式也可借鉴
本压缩包包含的文件详细介绍了几种常用的数值计算方法,包括非线性方程求解、高斯消元法、高斯列主消元法、牛顿迭代法以及割线法。以下是对这些方法的详细介绍: 1. **非线性方程求解**: 非线性方程是指方程的...
二分法实现线性方程求解 C++源代码 轻松改动就可变换其他算法
非线性方程求解是数学中的一个关键领域,它涉及到许多实际问题,如物理学、工程学、经济学等。在这些领域中,我们经常遇到无法用简单线性关系描述的复杂系统,这时就需要使用非线性方程的解法。Matlab作为一款强大的...
根据给定的文件信息,我们可以总结出以下关于使用Gauss消元法求解线性方程组的相关知识点: ### Gauss消元法概述 Gauss消元法是一种在数学上求解线性方程组的经典算法。它通过一系列的行变换将矩阵转化为阶梯形或...
非线性方程求根-数值方法实验-数值计算方法实验 从给定的文件信息中,我们可以生成以下知识点: 1. 非线性方程的定义和类型:非线性方程是一个变量方程,其中变量的最高次幂大于1。常见的非线性方程包括多项式方程...
CUDA,全称Compute Unified Device Architecture,是由NVIDIA公司推出的编程平台,允许程序员直接利用GPU的强大计算能力来执行通用计算任务,包括求解线性方程组。本文将深入探讨如何利用CUDA来加速线性方程组的求解...
实现列主元素法求解线性方程组的C++源代码 列主元素法简介 列主元素法是一种常用的线性方程组解法,它通过选主元、消元和回代三个步骤来解决线性方程组。该方法可以解决具有相同系数矩阵的线性方程组,且可以避免...