情感天地

高斯消元求解线性方程组 作文评语范例

  • 作者:本站
  • 时间:2019-06-10
  • 7人已阅读
您现在的位置:首页 > 情感婚姻 > 文章
简介 蒟蒻Nanjo_Qi前天考了一次试……第一题就华丽丽地爆零了。 解一次方程组我会啊,但是解一千个有百来八十个未知数的……弃了弃了orz。 考完了才知道有高斯消元这个神奇的东西,于是

高斯消元求解线性方程组 作文评语范例

蒟蒻Nanjo_Qi前天考了一次试……第一题就华丽丽地爆零了。 解一次方程组我会啊,但是解一千个有百来八十个未知数的……弃了弃了orz。

考完了才知道有高斯消元这个神奇的东西,于是就去简单了解了一下。

高斯消元法是线性代数规划中的一个算法,可用来为线性方程组求解,还可以求出矩阵的秩,以及求出可逆方阵的逆矩阵。 消元法就是将方程组中的一方程的未知数用含有另一未知数的代数式表示,并将其代人到另一方程中,这就消去了一未知数,得到一解;或将方程组中的一方程倍乘某个常数加到另外一方程中去,也可达到消去一未知数的目的(其实就是中小学最常用的解二元,三元一次方程组的思想嘛)。

我们把构成n个未知数的,含n个方程的方程组,乱搞一下,一个一个未知数求解,求出一个就再代入回去求其它的,这样就能解出所有的来啦(也有可能会无解或有多组解)!那该怎么搞呢?我们举个栗子,有这样一个三元一次方程组:5x+4y+7z=83x+9y–1z=-28x+3y+2z=9我们默认每一列上的未知数是相同的,如果没有就补个0,这样抛除未知数,我们就得到了一个n*(n+1)的矩阵,然后以后我们规定未知数用x1(x),x2(y),x3(z)等表示:547839-1-28329下面到了算法的核心:如果我们正在求解xi,那么首先我们选取一个方程j=i,使a[j][i]不为0,然后把这个方程和第i行方程互换一下。 随后对于每一行ji,我们把这个方程通过加减方程i的倍数,将其中的xi的系数化为0,即进行消元操作。

这个地方建议手动拿例子模拟一下,代码长这样:1  intp=i;2  for(intj=i;j++j)if(fabs(a[p][i])){p=j;break;}  //选取一个方程使a[j][i]不为03  for(intj=i;j=n+m;++j)swap(a[i][j],a[p][j]);4  for(intj=i+1;j++i){    //向下消元5  if(!a[j][i])continue;    //如果系数已经是0了,不用消元6  for(intk=i+1;k=n+m;++k)7  a[j][k]-=a[i][k]/a[i][i]*a[j][i];8  a[j][i]=0;9  }然后外面套一层循环i=1~n,完成每一个消元的操作,这时对矩阵的操作就完成啦。 这时这个矩阵被搞成了这样,去掉常数那一边的话会是一个严格上三角矩阵(保留两位小数):在高斯消元算法中,当且仅当它是严格上三角矩阵时,才是有唯一解的。

也就是:5x+4y+7z=–=-=-此时从后往前看,我们容易解出z!然后就容易解出y!然后代入解出x,就做完了。 其实还是很简单的,这一步可以这样解决:1  x[n]=a[n][n+i]/a[n][n];  //未知数x[n]2  for(intj=n-1;j--j){  //往前推3  x[j]=a[j][n+i];4  for(intk=j+1;k++k)5  x[j]-=a[j][k]*x[k];6  x[j]/=a[j][j];7  }这样,高斯消元法求解线性方程组的时间是O(n^3)的。 那无解的时候怎么办呢?只需要判断是否出现某时对xi进行消元时,能否找到找到一个xi的系数不为零就可以了,就是:1  if(fabs(a[p][i])eps)return0;下面是考试题目:Pear上数学课(/c/cpp)题目描述:Pear被一群长得很像的一次方程组围住了,快去拯救他!Pear最近的作业之一,就是练习解一次方程组,老师给了他m个方程组,每个方程组未知数个数一样(n个),未知数的系数一样,唯一不同的是每个方程的常数项。 比如n=2,m=3,pear手上有这样的3个方程组:+=3+=20+=4=5=10=0那他会分别解得:=4=15=2=1=5=2现在这个任务就交给你了!保证方程组有解,允许误差范围在1e-3以内。 输入格式:第一行两个正整数n,m;之后n行每行n个整数,第i行的第j个整数ai,j表示第i个方程中xi的系数;之后m行每行n个整数,第i行的第j个整数bi,j表示第m个方程组的第j个方程的常数项(约定方程的左边写未知数,右边写常数项)。

输出格式:输出m行n个实数,第i行第j个实数表示方程组i中的xj的值。 输入样例:23111-135201040输出样例:4-115522数据规模:对于10%的数据n=2;对于30%的数据n,m=20;对于50%的数据n=50,m=100;对于100%的数据n=100,m=1000。 HINT本题包含specialjudge。 有所不同的是题目中含有m个方程组,一个个做的时间是O(n^3*m),会T。 很方便的是每一组数据所有方程组系数是一样的,只有常数不一样,而可以发现在各种对矩阵的操作中实际上常数项并不会影响什么,只是随之加加减减而已,所以不妨将这些常数全放到矩阵对应位置,我们一起操作,这样的时间是O(n^2*(n+m))的,大概是可过的范围。 最后贴一个代码:Solution免责声明:本文仅代表文章作者的个人观点,与本站无关。 其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。

Top