• 高斯消元小结


    这里只是丢了一个板子,毕竟高斯消元这个东西原理说起来很简单,就是模拟了普通人手工解方程的过程,还是直接上代码来的方便

    一道模板题:luogu2455

    (在这里不推荐luogu的模板题,数据过水,此题数据强度还可以需要适当的和精度搏斗

    主要提一下判断无解和无穷解的情况

    一般的高斯消元是给出(n)个方程求(n)个未知数的解,但是有的时候会出现给出方程重复((x+y=2,2x+2y=4))或者方程矛盾((x+y=2,2x+2y=2)),这个时候我们进行高斯消元的话,最后的一个(或几个)方程会出现系数全部为(0)的情况,需要特殊处理

    具体的,对于方程组中的某一方程(k_1x_1+k_2x_2+cdots+k_nx_n=y)来说,若满足(forall i, k_i=0),那么就需要特殊处理

    1)若(y eq 0),由于方程右边一定是(0),而它等于一个非零数,于是这个方程无解

    2)若(y=0),方程也就是(0=0),这说明(x)取任意值均成立,而高斯消元最后其实每一个方程对应着一个未知数,所以有几个这样的方程就说明未知数中有多少个自有元,它们无论取何值均满足方程,也就是这个方程有无穷解

    几点注意

    1)最好设一个(eps),据说不设的话可以被卡

    2)建议的处理方式是对于方程(i)仅保留含有(x_i)的那一项,方便最后判断无解和无穷解

    #include<iostream>
    #include<string.h>
    #include<string>
    #include<stdio.h>
    #include<algorithm>
    #include<math.h>
    #include<vector>
    #include<queue>
    #include<map>
    #include<set>
    using namespace std;
    #define lowbit(x) (x)&(-x)
    #define fir first
    #define sec second
    #define rep(i,a,b) for (register int i=a;i<=b;i++)
    #define per(i,a,b) for (register int i=a;i>=b;i--)
    #define maxd 1000000007
    #define eps 1e-9
    typedef long long ll;
    const int N=100000;
    const double pi=acos(-1.0);
    int n;
    double ans[110],a[110][110];
    
    int read()
    {
    	int x=0,f=1;char ch=getchar();
    	while ((ch<'0') || (ch>'9')) {if (ch=='-') f=-1;ch=getchar();}
    	while ((ch>='0') && (ch<='9')) {x=x*10+(ch-'0');ch=getchar();}
    	return x*f;
    }
    
    double Fabs(double x)
    {
    	if (x>eps) return x;else return -x;
    }
    
    int main()
    {
    	n=read();
    	rep(i,1,n)
    	{
    		rep(j,1,n+1) scanf("%lf",&a[i][j]);
    	}
    	rep(i,1,n)
    	{
    		int now=i;
    		rep(j,i+1,n)
    			if (Fabs(a[j][i])>Fabs(a[now][i])) now=j;
    		if (now!=i) swap(a[now],a[i]);
    		if (Fabs(a[i][i])<eps) continue;
    		double div=a[i][i];
    		rep(j,i,n+1) a[i][j]/=div;
    		rep(j,1,n)
    		{
    			if (i==j) continue;
    			div=a[j][i];
    			rep(k,i,n+1) a[j][k]-=a[i][k]*div;
    		}
    	}
    	bool nos=0,mors=0;
    	rep(i,1,n)
    	{
    		int cnt=0;
    		rep(j,1,n+1) cnt+=(Fabs(a[i][j])<eps);
    		if ((cnt==n) && (Fabs(a[i][n+1])>eps)) nos=1;
    		else if (cnt==n+1) mors=1; 
    	}
    	if (nos) puts("-1");
    	else if (mors) puts("0");
    	else
    	{
    		ans[n]=a[n][n+1];
    		per(i,n-1,1)
    		{
    			ans[i]=a[i][n+1];
    			rep(j,i+1,n) ans[i]-=a[i][j]*ans[j];
    		}
    		rep(i,1,n) 
    			if (Fabs(ans[i])<=eps) printf("x%d=0
    ",i);
    			else printf("x%d=%.2lf
    ",i,ans[i]);
    	}
    	return 0;
    }
    
  • 相关阅读:
    Ajax ——数据解析
    AJAX
    Flask ==> 目录结构
    Flask ==> Migrate
    Flask ==> scoped_session
    Flask ==> SQLhelper
    Flask ==> ORM之sqlalchemy
    Flask ==> wtforms
    Flask ==> 用扩展实现的简单的页面登录
    分页器组件
  • 原文地址:https://www.cnblogs.com/encodetalker/p/10807152.html
Copyright © 2020-2023  润新知