首页 > 其他分享 >高斯消元

高斯消元

时间:2024-07-13 10:53:19浏览次数:11  
标签:const int double long eq 高斯消 mod

高斯-约旦消元

解线性方程组

例题:线性方程组

步骤:

  1. 选出未被更新的行中第 \(k\) 列绝对值最大的值,令为主元

  2. 把主元所在行移到当前行,加减消元消去主元

  3. 重复12

  4. 结束后若存在找不到主元(找到是0) 的情况,那就遍历没处理的行,如果有常数项非 \(0\) 则无解,否则无数解

点击查看代码
#include<bits/stdc++.h>
using namespace std;

const double eps=1e-9;
double A[55][55];
int n;

bool eq(double x,double y){
    return fabs(x-y)<eps;
}

int main(){
    cin>>n;
    for(int i=0;i<n;i++) 
        for(int j=0;j<=n;j++)
            cin>>A[i][j];
    int nl=0;
    for(int k=0;k<n;k++){
        int I=nl;
        for (int i=nl+1;i<n;i++){
            if(fabs(A[i][k])>fabs(A[I][k])) I=i;
        }
        if(eq(A[I][k],0)) {continue;}
        for(int j=0;j<=n;j++) swap(A[nl][j],A[I][j]);
        for(int i=0;i<n;i++){
            if(i==nl) continue;
            double mul=A[i][k]/A[nl][k];
            for(int j=k;j<=n;j++){
                A[i][j]-=mul*A[nl][j];
            }
        }
        nl++;
    }
    if(nl<n){
        while(nl<n)
            if(!eq(A[nl++][n],0))
                {cout<<-1;return 0;}// 无解-1
        cout<<0;
    }
    else {
        for(int i=0;i<n;i++){
			printf("x%d=%.2lf\n",i+1,A[i][n]/A[i][i]);
        }
    }
}

计算矩阵逆

把一个单位矩阵拼在给出矩阵后面,高斯约旦消元后再额外将结果的对角线化1,则此时原先单位矩阵位置就是逆矩阵

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7;
const  double eps=1e-9;
int A[405][805];
int n;

bool eq(int x,int y){
    return abs(x-y)<eps;
}

int qpow(int x,int k){
	int ans=1;
	while(k){
		if(k&1) ans=ans*x%mod;
		x=x*x%mod;
		k>>=1;
	}
	return ans%mod;
}

signed main(){
    cin>>n;
    for(int i=0;i<n;i++) 
        for(int j=0;j<n;j++)
            cin>>A[i][j];
    for(int i=0;i<n;i++){
            A[i][i+n]=1;
    }
    int nl=0;
    for(int k=0;k<n;k++){
        int I=nl;
        for (int i=nl+1;i<n;i++){
            if(abs(A[i][k])>abs(A[I][k])) I=i;
        }
        if(eq(A[I][k],0)) {cout<<"No Solution\n";return 0;}
        swap(A[nl],A[I]);
        int kk=qpow(A[nl][k],mod-2);
        for(int i=0;i<n;i++){
            if(i==nl) continue;
            int mul=A[i][k]*kk%mod;
            for(int j=k;j<n*2;j++){
                A[i][j]=(mod+A[i][j]-mul*A[nl][j]%mod)%mod;
            }
        }
        for(int j=0;j<2*n;j++){
            A[nl][j]=(A[nl][j]*kk)%mod;
        }
        nl++;
    }
    for(int i=0;i<n;i++){
        for(int j=n;j<n*2;j++)cout<<(A[i][j]+mod)%mod<<" ";
        cout<<"\n";
    }
} 

计算行列式

这玩意真的还是高斯消元吗...

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=605;
int mod,OK=1;;
int A[N][N];
int n;
int det_calc(int a[N][N],int n){
    for(int i=0;i<n;i++){
        for(int j=i+1;j<n;j++){
            while(a[i][i]){
                int K=a[j][i]/a[i][i];
                for(int k=i;k<n;k++){
                    ((a[j][k]-=K*a[i][k]%mod)+=mod)%=mod;
                }
                swap(a[i],a[j]);OK*=-1;
            }swap(a[i] ,a[j]),OK*=-1;
        }
    }
    int ans=1;  
    for(int i=0;i<n;i++) ans*=a[i][i],ans%=mod;
    ans=ans*OK+mod;ans%=mod;
    return ans ;
}

signed main(){
    cin>>n>>mod;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            cin>>A[i][j];
        
    cout<<det_calc(A,n);
}

标签:const,int,double,long,eq,高斯消,mod
From: https://www.cnblogs.com/exut/p/18297633

相关文章

  • 高斯消元
    前言:由于作者未系统过学习线性代数,故下文肯定有不严谨的成分,不过应付算法竞赛是绰绰有余了QAQ。\[\begin{cases}a_{1,1}x_1+a_{1,2}x_2+\cdots+a_{1,n}x_n=b_1\\a_{2,1}x_1+a_{2,2}x_2+\cdots+a_{2,n}x_n=b_2\\\cdots\\a_{n,1}x_1+a_{n,2......
  • 高斯消元和矩阵快速幂
    高斯消元高斯消元是一种能在\(O(N^3)\)的时间内求解\(N\)元一次方程组的算法。其思路大致如下:使第一个未知数只有第一个式子中系数非\(0\)。使第二个未知数只有第二个式子中系数非\(0\)。\(\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\vdots\)使第......
  • AcWing算法基础课笔记——高斯消元
    高斯消元用来求解方程组a11x1+......
  • 高斯消元学习笔记
    引入高斯-约当消元法(Gauss–Jordanelimination)是求解线性方程组的经典算法,它在当代数学中有着重要的地位和价值,是线性代数课程教学的重要组成部分。高斯消元法除了用于线性方程组求解外,还可以用于行列式计算、求矩阵的逆,以及其他计算机和工程方面。过程一个经典的问题,给定一......
  • 高斯消元学习笔记
    高斯消元学习笔记其实这个主题能够复活主要还是粘了\(\text{LGV}\)引理的光,不然我还不知道高斯消元其实不光能求解线性方程组。求解线性方程组这个只能说是典中典了,我不相信没有一个人的高斯消元不是从这里开始的。我们考虑求解线性方程组的本质:将每一个式子所有未知数前都......
  • 高斯消元学习笔记——P304题解
    如果你觉得这篇太啰嗦问题[SDOI2006]线性方程组题目描述已知\(n\)元线性一次方程组。\[\begin{cases}a_{1,1}x_1+a_{1,2}x_2+\cdots+a_{1,n}x_n=b_1\\a_{2,1}x_1+a_{2,2}x_2+\cdots+a_{2,n}x_n=b_2\\\cdots\\a_{n,1}x_1+a_{n,2}x......
  • 高斯消元
    不会高斯消元/kk。高斯消元,就是通过某种操作消元得到答案。eg:\[\begin{cases}3x+5y+z=20\\x-2y+3z=19\\2x-6y+z=6\end{cases}\]把它变成增广矩阵形式:\[\begin{bmatrix}3&5&1&&20\\1&-2&3&&19\\2&-6&1&&6\end{bmatrix}\]怎么把\(x\)消掉......
  • [学习笔记] 高斯消元 - 线性代数
    高斯-约旦消元下面给两道板子【模板】高斯消元法最最基础的板子,没啥哆嗦的。下面给出高斯-约旦消元解法。#include<bits/stdc++.h>usingnamespacestd;intn,dt=1;doubleeps=1e-9,m[102][102];intmain(){ scanf("%d",&n); for(inti=1;i<=n;++i) for(intj......
  • 高斯消元
    epsilon=pow(10,-10)g=[]for_inrange(int(input())):g.append([*map(float,input().split())])n,m=len(g),len(g[0])row=0forcolinrange(n):max_row=row#找出剩下行最大列值所在的行foriinrange(row,n):ifabs(g[i][col]......
  • 高斯消元学习笔记
    注:此篇一直在讲高斯-约旦消元法。https://oi-wiki.org/math/numerical/gauss/相信大家都读过上面那个wiki。大家其实都看得挺懵的对吧。今天我就来教一下大家高斯消元。技术指导:milk,周百万,TB\(\LaTeX\)指导:不是你觉得这文章\(\LaTeX\)很好吗?所以没有指导。首先小学知识......