jjzjj

线性方程组的直接解法——Gauss消去法

椰羊在静静地吃草 2023-03-28 原文

考虑线性方程组

\[\mathrm{A}x=\mathrm{b} \]

其中,\(\mathrm{A}=(a_{ij})_{n\times n}\)\(\mathrm{b}=[b_1,b_2,\cdots,b_n]^{\mathrm{T}}\)。在线性代数的课程中,我们已经学习过Gauss消元法,具体操作是将矩阵A转化为“阶梯型”矩阵。为方便起见,本文仅仅讨论系数矩阵非奇异的方程组,此时,目标是将矩阵A转化为上三角矩阵,再执行回代过程,即可给出方程组的解。本文将给出在计算机上的具体操作及实例代码。

一、基本Gauss消去法

我们仅仅讨论对矩阵第一列的操作,剩余的操作可以以此类推,因而不再赘述。
在执行Gauss消去法时,我们将第一列对角元以下的元素全部变为零。记第一列消元操作后的增广矩阵为\([\mathrm{A}^{(1)},\mathrm{b}^{(1)}]\),容易知道

\[[\mathrm{A}^{(1)},\mathrm{b}^{(1)}]= \begin{bmatrix} a_{11} & a_{22} & \cdots &a_{1n} & b_1 \\ 0 & a_{22}^{(1)} &\cdots &a_{2n}^{(1)} & b_2^{(1)}\\ \vdots &\vdots & & \vdots &\vdots\\ 0 & a_{n2}^{(1)} & &a_{nn}^{(1)} & b_n^{(1)} \end{bmatrix}\]

其中

\[a_{ij}^{(1)}=a_{ij}-\frac{a_{i1}}{a_{11}}a_{1j},j=2,\cdots ,n \]

\[a_{i1}^{(1)}=0 \]

\[b_i^{(1)}=b_i-\frac{a_{i1}}{a_{11}}b_1 \]

观察到重复出现的结构\(\frac{a_{_{i1}}}{a_{_{11}}}\),我们记它为\(l_{i1}\),称为消元因子,并将它存储在原来\(a_{i1}\)的位置。在计算的过程中,先计算消元因子并存储在相应位置,再执行后续的算法。
对于后续部分的运算,在第k步,只要对矩阵\(A^{(k-1)}(k:n,k:n)\)执行相同操作即可。

二、列主元Gauss消去法

在执行Gauss消元法的过程中,如果\(a_{kk}^{(k-1)}\)相对于其他元素绝对值较小,则会产生较大的舍入误差,影响计算精度,为此,我们引入了列主元Gauss消去法,基于交换矩阵的行不影响线性方程组的解。
记执行完k-1步消元后的增广矩阵为\([\mathrm{A}^{(k-1)},\mathrm{b}^{(k-1)}]\)。考虑第k列对角元及其以下的部分。选择绝对值最大的元所在行,与当前行执行行交换,再进行Gauss消元法。

三、计算实例

用列主元Gauss消去法解以下线性方程组:

\[\left\{ \begin{array}{} 0.5x_1+1.1x_2+3.1x_3=6,\\ 2x_1+4.5x_2+3.6x_3=0.02,\\ 5x_1+0.96x_2+6.5x_3=0.96. \end{array} \right.\]

#include <iostream>
#include <math.h>
using namespace std;

int main()
{
    double A_Extended[3][4]={0.5,1.1,3.1,6,2,4.5,3.6,0.02,5,0.96,6.5,0.96};
    double X_solution[3];
    for (int i=0;i<=2;i++)
    {
        int n=i;
        for (int p=i+1;p<=2;p++)
        {
            if (fabs(A_Extended[p][i])>fabs(A_Extended[n][i]))
            {
                n=p;
            }
        }

        for (int p=i;p<=2+1;p++)
        {
            double k=A_Extended[n][p];
            A_Extended[n][p]=A_Extended[i][p];
            A_Extended[i][p]=k;
        }

        for (int p=i+1;p<=2;p++)
        {
            A_Extended[p][i]=-A_Extended[p][i]/A_Extended[i][i];
            for (int pco=i+1;pco<=2+1;pco++)
            {
                A_Extended[p][pco]=A_Extended[p][pco]+A_Extended[p][i]*A_Extended[i][pco];
            }
        }
    }
    X_solution[2]=A_Extended[2][3]/A_Extended[2][2];
    for (int i=1;i>=0;i--)
    {
        double sum=0;
        for (int k=2;k>i;k--)
        {
            sum=sum+A_Extended[i][k]*X_solution[k];
        }
        X_solution[i]=(A_Extended[i][3]-sum)/A_Extended[i][i];
    }

    cout<<X_solution[0]<<" "<<X_solution[1]<<" "<<X_solution[2]<<endl;
    return 0; 
}

有关线性方程组的直接解法——Gauss消去法的更多相关文章

  1. ruby-on-rails - 如何在 Rails 中的不同数据库上执行直接 SQL 代码 - 2

    我正在编写一个Rails应用程序,它将监视某些特定数据库的数据质量。为了做到这一点,我需要能够对这些数据库执行直接SQL查询——这当然与用于驱动Rails应用程序模型的数据库不同。简而言之,这意味着我无法使用通过ActiveRecord基础连接的技巧。我需要连接的数据库在设计时是未知的(即:我不能将它们的详细信息放在database.yaml中)。相反,我有一个模型“database_details”,用户将使用它来输入应用程序将在运行时执行查询的数据库的详细信息。因此与这些数据库的连接实际上是动态的,细节仅在运行时解析。 最佳答案

  2. ruby-on-rails - 我可以在没有 Controller 的情况下直接从 routes.rb 渲染布局吗? - 2

    我想为网站的管理和公共(public)部分设置一对样式指南。每个都需要自己的布局,其中包含静态html和调用erbpartials的混合(因此静态页面不会削减它)。我不需要Controller来为这些页面提供服务,而且我不希望有效的仅开发内容使其余代码困惑。这让我想知道是否有一种方法可以直接呈现布局。免责声明:我明白这不是我应该经常/永远做的事情,而且我知道有很多争论可以解释为什么这是一个坏主意。我对这是否可能感兴趣。有没有办法让我直接从routes.rb渲染布局而不通过Controller? 最佳答案 出于某种奇怪的原因,我想暂时

  3. ruby-on-rails - 在 Rails 中是否有比 Observers 更直接的方式来执行发布/订阅模式? - 2

    我有一个模型依赖于一个单独的、联合的模型。classMagazine图像是多态的,可以附加到许多对象(页面和文章),而不仅仅是杂志。杂志需要在相关图像发生任何变化时自行更新该杂志还保存了一张自己的截图,可用于宣传:classMagazine现在如果图像发生变化,杂志也需要更新其截图。所以杂志真的需要知道图片什么时候出了问题。所以我们可以天真地直接从封面图片触发屏幕截图更新classImage...但是图片不应该代表杂志做事然而,图片可以用于许多不同的对象,实际上不应该对杂志进行特定的操作,因为这不是图片的责任。该图像也可能附加到页面或文章,并且不需要为它们做各种事情。“正常”的rail

  4. ruby-on-rails - 直接显示使用 chunkypng 创建的图像(不保存) - 2

    所以我使用chunky_png创建了一个PNG图像.我不想保存这张图片,因为它只对这个请求有用,所以我试图将这张图片保存为实例变量并将其显示在我的View中。问题是,在我看来,这会导致UTF-8中的无效字节序列错误。我做了什么:#controller@img=source_img.resize(200,200).to_string#view"/>使用raise@img.to_yaml调试@img变量输出正确的字符串,f.e.:---!binary|-iVBORw0KGgoAAAANSUhEUgAAAMgAAADIAQAAAACFI5MzAAACP0lEQVR4nO1YQY6jQAy0A

  5. 线性代数让我想想:快速求三阶矩阵的逆矩阵 - 2

    快速求三阶矩阵的逆矩阵前言一般情况下,我们求解伴随矩阵是要注意符号问题和位置问题的(如下所示)A−1=1[  ][−[  ]−[  ]−[  ]  −[  ]]=A−1=1[  ][   M11−[M12]   M13−[M21]   M22−[M23]     M31−[M32]   M33]⊤\begin{aligned}&A^{-1}=\frac{1}{[\\]}\left[\begin{array}{cccccc}&-[\\]&\\-[\\]&&-[\\]\\\\&-[\\]&\\\end{array}\right]=\\\\&A^{-1}=\frac{1}{[\\]}\left[\b

  6. ruby-on-rails - 在 Facebook、转推等上分享直接 Ruby gem 中的按钮? - 2

    注意http://techcrunch.com/2010/04/04/he-even-makes-coldplay-sound-fun/顶部的那些按钮在社交网络上分享网址?我想为我正在构建的网站做一些非常相似的事情。ShareThis提供了一个可以做同样事情的小部件,但它是品牌化的和外部的。我正在寻找纯Ruby解决方案。包含可包含在RailsApplicationHelper类中的模块的gem将是完美的。在我重新发明轮子之前,感谢您的建议!想象一下: 最佳答案 我能找到的最好的是:http://www.addthis.com/这里有

  7. ruby - 是否有一种直接的包罗万象的方法来记录在 Ruby 中的对象上调用的方法? - 2

    有没有一种快速的方法来跟踪在对象上调用的方法?通常,当我在gem的公共(public)界面之下的级别上工作时,我会遇到难以追踪的错误。最终,我最终通过源代码跟踪对象并将所有内容都记在脑海中。但是,如果能够在对象上调用类似#log_method_calls的东西,那么,比如说,调用它的所有方法都会打印到stdout或其他东西。有什么办法可以做到这一点? 最佳答案 有几种方法可以做到这一点,视情况而定。如果可以创建一个新对象而不是被观察对象,您可以使用method_missing轻松编写一个观察者类。classLogProxydefin

  8. 慢跑者与狗 & 地中海鲨鱼问题的matlab解法 - 2

    慢跑者与狗问题描述一个慢跑者在平面上沿椭圆以恒定的速率𝒗=𝟏跑步,设椭圆方程为:𝒙=𝟏𝟎+𝟐𝟎𝒄𝒐𝒔(𝒕),𝒚=𝟐𝟎+𝟓𝒔𝒊𝒏(𝒕)。突然有一只狗攻击他,这只狗从原点出发,以恒定速率𝒘跑向慢跑者,狗的运动方向始终指向慢跑者。分别求出𝒘=𝟐𝟎,𝒘=𝟓时狗的运动轨迹。模型建立设时刻t慢跑者的坐标为(𝑿(𝒕),𝒀(𝒕)),狗的坐标为(𝒙(𝒕),𝒚(𝒕))。则𝑿=𝟏𝟎+𝟐𝟎𝒄𝒐𝒔(𝒕),𝒀=𝟐𝟎+𝟏𝟓𝒔𝒊𝒏(𝒕),狗从(0,0)出发,建立狗的运动轨迹的参数方程:由于狗始终对准人,因而狗的速度方向平行于狗与人位置的差向量:消去𝝀,得由题意𝑿=𝟏𝟎+𝟐𝟎𝒄𝒐𝒔𝒕,𝒀=𝟐𝟎+1𝟓𝒔𝒊𝒏(𝒕),狗从(0,0)

  9. ruby-on-rails - Rubyzip:将 zip 文件直接导出到 S3 而无需将 tmpfile 写入磁盘? - 2

    我有这段代码,它将一个zip文件写入磁盘,读回,上传到s3,然后删除文件:compressed_file=some_temp_pathZip::ZipOutputStream.open(compressed_file)do|zos|some_file_list.eachdo|file|zos.put_next_entry(file.some_title)zos.printIO.read(file.path)endend#Writezipfiles3=Aws::S3.new(S3_KEY,S3_SECRET)bucket=Aws::S3::Bucket.create(s3,S3_BUCK

  10. ruby-on-rails - haml_tag 直接输出到 Haml 模板 - 2

    我的HAML模板的这个助手有什么问题?defdisplay_event(event)event=MultiJson.decode(event)markup_class=get_markup_class(event)haml_tag:li,:class=>markup_classdohaml_tag:b,"Foo"haml_tag:i,"Bar"endend这是错误:haml_tagoutputsdirectlytotheHamltemplate.Disregarditsreturnvalueandusethe-operator,orusecapture_hamltogetthevalu

随机推荐