高斯消元讲解 && 洛谷P3389 【模板】高斯消元法 题解

摘要:
前言:回到数论问题,发现他的高斯消去法是0分……我回到博客公园搜索我以前对高斯消去法的解释,但我没有看到。高斯消去法:什么是高斯消去法?它是线性代数编程中的一种算法,可用于求解线性方程。在当前的学习阶段,高斯消去法通常用于求解多项式,例如x+3y+2z=1,2x+7y-z=2,3x-2y+5z=9。高斯消去法是将多项式的系数和结果抽象成矩阵,并在一些混淆操作后成功求解多项式的过程。我希望这对你学习高斯消去法有帮助。

前言:回去刷数论的题,发现自己的高斯消元是0分。。。。。。很可能是当年交上去了没看结果就直接过了。。。。。。回来博客园搜自己之前对高斯消元的讲解想看看,没看到。只能从头过了一遍,顺便补上之前的锅。


高斯消元:

什么是高斯消元线性代数规划中的一个算法,可用来为线性方程组求解——度娘

在现阶段的学习中,高斯消元常被应用于求多项式的解:

形如

x+3y+2z=1,

2x+7y-z=2,

3x-2y+5z=9。

的多项式。

根据平常文化课的学习,我们不难知道对于n个未知数,只要给你n个不同(化简后依然不同)的多项式即可求出每一个未知数的解。在2元方程以下我们一般直接秒掉。3元也不是很难,再往上的就有点费精力了。高斯消元就是将多项式系数和结果抽象成一个矩阵,经过一些颠三倒四不知所以的操作后,成功求出多项式的解的过程。


举例:(借用了pksAFO巨佬的例子)

高斯消元讲解 && 洛谷P3389 【模板】高斯消元法 题解第1张

 以上是三个三元方程,我们将其抽象成矩阵后,变为:

|3     2     1     10|

|5     1     6     25|

|2     3     4     20|(这个蒟蒻不会markdown?踩他

假设有n个未知数,那么矩阵就有n行n+1列。


此矩阵的奇怪性质:

1.对于多个多项式,你把其中一个写在最上方,或者写在最下方,很明显就是换了个顺序,所以对答案并没有什么影响。也就是,矩阵的行可以任意互换

2.小学学过的方法:对于一整行多项式,你把它整体上扩大/缩小多少倍,对答案没有影响。矩阵同一行上的数,可以任意扩大/缩小k倍(k为实数)

3.二元方程常用方法:加减相消。具体例子:

x+2y=5;  1式

3x-2y=-1;  2式

2式+1式得:4x=4,x=1,y=2。

换句话说,我们可以这样表达:

(1+3)x+(2-2)y=5-1;

0x+0y=0;(加到1式上了,没用了)

变成这样:

4x+0y=4;

0x+0y=1;

回过来,我们可以把这两个二元多项式方程看做矩阵:

|1     2     5|

|3     -2   -1|

我们可以将第二行整体加到第一行上,使得矩阵变成了:

|4     0     4|

|0     0     0|

求得x=1,回带得y=2。

对于矩阵上任意一行,我们都可以将其整体地对于另一行进行加/减


如何利用这三个性质进行求方程解?

灵活运用性质2和3,将矩阵除对角线以外消为0:

1     0     0     k

0     1     0     a

0     0     1     b

解就是k,a,b。

步骤:

1.把当前对角线上的元素运用性质2变成1

2.用这个1去消掉除了当前对角线上的元素

重复这两个步骤n次(对角线长度)

注意:在对角线元素变为1的过程中,同一行的其他元素也要进行扩大/缩小相同的倍数。

如果1列上没有任何元素(全为0)说明这个未知数不存在,输出无解(No Solution)。


代码:

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n,mo=100000007;
double a[1001][1001];
int main()
{    bool sc=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n+1;j++)
            scanf("%lf",&a[i][j]);//这次没用祖传快读doge 
    int bj,flag=0;
    for(int i=1;i<=n;i++)
    {
        bj=i;
        while(a[bj][i]==0&&bj<=n)
            bj+=1; 
        if(bj==n+1){printf("No Solution");return 0;}
        //以上部分,我们做的是获取第一个此列中非0的行号。如果此列全为0,证明无解,直接退出、 
        for(int j=1;j<=n+1;j++)swap(a[i][j],a[bj][j]);
        //对角线上的元素不能为0,于是我们找到当前列号不为0的一行与对角线进行交换。可能当前对角线上元素也不为0.但是这样做囊括了更多情况。 
        double kk=a[i][i];//确保对角线上的数是1
        for(int j=1;j<=n+1;j++)
            a[i][j]/=kk;//其余数跟着处理,包括对角线上的数。运用性质2 
        for(int j=1;j<=n;j++)
        {
            if(i!=j)
            {
                double k=a[j][i];
    //k=这行第一个数,因为对角线上是1,那么这个“第一个数”可以表示为1*k。所以k也就是扩大/缩小的倍数 
                for(int m=1;m<=n+1;m++)
                    a[j][m]-=k*a[i][m];
    //此行所有的数减去第一个数*k,运用性质2 ,3 
            }      
        }
        if(i==n)//消完输出
        {
            for(int j=1;j<=n;j++)
                printf("%.2lf
",a[j][n+1]);
    //只有对角线上有元素,且值为1,代表这个位置对应的列号未知数。第n+1列就代表着未知数的值。输出即可 
        }
    }
}

完结撒花。希望对各位的高斯消元学习有所帮助。

免责声明:文章转载自《高斯消元讲解 &amp;amp;&amp;amp; 洛谷P3389 【模板】高斯消元法 题解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇c# 压缩 解压 7zUnity ShaderForge插件的使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

OptimalSolution(5)--数组和矩阵问题(1)简单

  一、转圈打印矩阵   题目:给定一个整型矩阵matrix,按照转圈的方式打印它。   要求:额外空间复杂度为O(1) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 打印结果为:1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10   思路:矩阵分圈处理问题。用...

Unity 中的坐标系

说明: 注意几点: 0 行向量右乘矩阵与列向量左乘矩阵,两个矩阵互为逆矩阵 1 法线转换与mul,mul函数左乘矩阵当列矩阵计算,右乘当行矩阵计算 2 叉乘与左右手系,左手系用左手,右手系用右手,axb四指指向a,向b旋转(沿小与两个角度180的方向转),拇指的方向是叉乘方向 3 unity观察系的z方向,unity观察系是右手系,其他都是本地坐标,世界坐...

跟我学算法-pca(降维)

pca是一种黑箱子式的降维方式,通过映射,希望投影后的数据尽可能的分散, 因此要保证映射后的方差尽可能大,下一个映射的方向与当前映射方向正交 pca的步骤: 第一步: 首先要对当前数据(去均值)求协方差矩阵,协方差矩阵= 数据*数据的转置/(m-1) m表示的列数,对角线上表示的是方差,其他位置表示的是协方差 第二步:需要通过矩阵对角化,使得协方差为0,只...

使用numpy教你复习线性代数基础

楔子 下面我们来一起复习一下线性代数的基础知识,并同时使用numpy进行演示,所以需要你有一些关于numpy的知识(但不需要太多)。另外在线性代数中,存在行列式和矩阵,它们长得都差不多,都类似于二维表的格式。但是行列式要求其行数和列数必须相等,但是矩阵则没有此要求,而我们在创建在numpy中创建行列式和矩阵的时候均使用numpy.array这个函数,这个函...

灰度共生矩阵--纹理

共生矩阵用两个位置的象素的联合概率密度来定义,它不仅反映亮度的分布特性,也反映具有同样亮度或接近亮度的象素之间的位置分布特性,是有关图象亮度变化的二阶统计特征。它是定义一组纹理特征的基础。 一幅图象的灰度共生矩阵能反映出图象灰度关于方向、相邻间隔、变化幅度的综合信息,它是分析图象的局部模式和它们排列规则的基础。 设f(x,y)为一幅二维数字图象,其大小为M...

高斯模糊的算法(高斯卷积 高斯核)

通常,图像处理软件会提供"模糊"(blur)滤镜,使图片产生模糊的效果。 "模糊"的算法有很多种,其中有一种叫做"高斯模糊"(Gaussian Blur)。它将正态分布(又名"高斯分布")用于图像处理。 本文介绍"高斯模糊"的算法,你会看到这是一个非常简单易懂的算法。本质上,它是一种数据平滑技术(data smoothing),适用于多个场合,图像处理...