`
呼延浩云
  • 浏览: 84939 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
69e5c1d2-1364-320a-a0f2-0de5143310d8
互联网的那点事
浏览量:10987
社区版块
存档分类
最新评论

C++线性方程求解

阅读更多

介绍

 

程序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-->
0
0
分享到:
评论

相关推荐

    C++实现线性方程组求解

    用C/C++语言实现如下函数: 1. bool lu(double* a, int* pivot, int n);矩阵的LU分解。 假设数组anxn在内存中按行优先次序存放。此函数使用高斯列选主元消去法将其就地进行LU分解。pivot为输出参数,pivot[0,n) 中...

    c++解线性方程组的几种方法

    根据给定的信息,本文将详细解释使用C++解决线性方程组的几种方法,包括克莱默法则(Cramer's Rule)、高斯消元法(Gauss Elimination)、全高斯消元法(Full Gauss Elimination)以及杜利特分解法(Doolittle ...

    c++线性方程组求解源代码 原创

    c++线性方程组求解源代码c++线性方程组求解源代码

    C++程序求解线性方程组

    在提供的压缩包文件"Linear_Function"中,可能包含了实现这些算法的源代码文件,通过阅读和分析代码,可以深入理解C++在求解线性方程组中的应用。学习和掌握这些知识,不仅有助于理解数值计算的基础,还能提升在实际...

    解线性方程组的C++类库

    本篇将详细介绍“解线性方程组的C++类库”及其在实际应用中的重要性。 线性方程组通常由多个变量和它们之间的线性关系构成,形式为 Ax = b,其中A是系数矩阵,x是未知数向量,b是常数向量。求解线性方程组的方法有...

    线性方程组求解(C++)

    求线性方程组的解C++源代码。求出系数行列式的值,再根据克莱姆法则求解。(保证全过)

    二分法解非线性方程C++代码

    二分法解非线性方程C++代码

    Eigen求解线性方程组

    通过上述方法,我们可以方便地使用C++和Eigen库来求解线性方程组。这种方法不仅简洁而且效率高,非常适合于实际工程项目中。同时,Eigen库的强大功能也为更复杂的线性代数运算提供了可能。对于开发者来说,掌握这一...

    利用eigen矩阵库求解线性方程组

    c++代码,利用eigen矩阵库,求解线性方程组。 c++代码,利用eigen矩阵库,求解线性方程组。 c++代码,利用eigen矩阵库,求解线性方程组。 c++代码,利用eigen矩阵库,求解线性方程组。 c++代码,利用eigen矩阵库,...

    使用MKL求解线性方程组的C++程序

    LU分解是一种有效的求解线性方程组的方法,它将矩阵A分解为一个下三角矩阵L和一个上三角矩阵U的乘积,即A = LU。这样,原问题可以转换为两个更简单的步骤:首先解Ly = b得到y,然后解Ux = y得到x。 **Intel MKL中的...

    C++求解方程组

    根据给定的文件标题“C++求解方程组”及描述中的方法,本文将详细介绍以下几种线性方程组的求解算法:克拉默(Cramer)法则、高斯列主元消去法、高斯全主元消去法以及杜利特尔(Doolittle)分解法。 ### 1. 克拉默...

    线性方程求解代码

    在提供的压缩包文件"08010228(1)"中,很可能包含了一个用C++实现的线性方程求解器。这个程序可能包含了上述方法中的一种或多种,通过读取和解析输入数据,计算解,并输出结果。为了理解并使用这段代码,你需要具备...

    C++拟牛顿法解非线性方程组

    采用拟牛顿法求解非线性方程组,结构完整,非线性方程组在此程序里为显示,若是隐式也可借鉴

    非线性方程求解、高斯消元发、高斯列主消元法、牛顿迭代法、割线法

    本压缩包包含的文件详细介绍了几种常用的数值计算方法,包括非线性方程求解、高斯消元法、高斯列主消元法、牛顿迭代法以及割线法。以下是对这些方法的详细介绍: 1. **非线性方程求解**: 非线性方程是指方程的...

    用C++实现二分法的线性方程求解

    二分法实现线性方程求解 C++源代码 轻松改动就可变换其他算法

    非线性方程求解

    非线性方程求解是数学中的一个关键领域,它涉及到许多实际问题,如物理学、工程学、经济学等。在这些领域中,我们经常遇到无法用简单线性关系描述的复杂系统,这时就需要使用非线性方程的解法。Matlab作为一款强大的...

    用gauss消去法求解线性方程组

    根据给定的文件信息,我们可以总结出以下关于使用Gauss消元法求解线性方程组的相关知识点: ### Gauss消元法概述 Gauss消元法是一种在数学上求解线性方程组的经典算法。它通过一系列的行变换将矩阵转化为阶梯形或...

    实现列住元素法求解线性方程组的C++源代码

    实现列主元素法求解线性方程组的C++源代码 列主元素法简介 列主元素法是一种常用的线性方程组解法,它通过选主元、消元和回代三个步骤来解决线性方程组。该方法可以解决具有相同系数矩阵的线性方程组,且可以避免...

    用CUDA(显卡)解线性方程组

    CUDA,全称Compute Unified Device Architecture,是由NVIDIA公司推出的编程平台,允许程序员直接利用GPU的强大计算能力来执行通用计算任务,包括求解线性方程组。本文将深入探讨如何利用CUDA来加速线性方程组的求解...

    非线性方程求根 数值方法实验 数值计算方法实验

    非线性方程求根-数值方法实验-数值计算方法实验 从给定的文件信息中,我们可以生成以下知识点: 1. 非线性方程的定义和类型:非线性方程是一个变量方程,其中变量的最高次幂大于1。常见的非线性方程包括多项式方程...

Global site tag (gtag.js) - Google Analytics