1、线性方程组的几种解法线性方程组形式如下:常记为矩阵形式其中一、高斯消元法高斯(Gauss)消元法的基本思想是:通过一系列的加减消元运算,也就是代数中的加减消去法,将方程组化为上三角矩阵;然后,再逐一回代求解出 x 向量。现举例说明如下:(一)消元过程第一步:将(1)/3 使 x1的系数化为 1 得再将(2)、(3)式中 x1的系数都化为零,即由(2)-2(1) (1)得)1(322.04x)(1.由(3)-4(1) (1)得第二步:将(2) (1)除以 2/3,使 x2系数化为 1,得再将(3) (1)式中 x2系数化为零,即由(3) (1)-(-14/3)*(2)(2) ,得第三步:将(3)
2、 (2)除以 18/3,使 x3系数化为 1,得经消元后,得到如下三角代数方程组:(二)回代过程由(3) (3)得 x 3=1,将 x3代入(2) (2)得 x2=-2,将 x2 、x 3代入(1) (1)得 x2=1所以,本题解为x=1,2,-1 T (三) 、用矩阵演示进行消元过程第一步: 先将方程写成增广矩阵的形式第二步:然后对矩阵进行初等行变换)3(.)2(.68)2(3.0)1(33.604初等行变换包含如下操作(1) 将某行同乘或同除一个非零实数(2) 将某行加入到另一行(3) 将任意两行互换第三步:将增广矩阵变换成上三角矩阵,即主对角线全为 1,左下三角矩阵全为 0,形式如下:示
3、例:(四)高斯消元的公式综合以上讨论,不难看出,高斯消元法解方程组的公式为1 消元(1) 令aij(1) = aij , (i,j=1,2,3,n)bi(1) =bi , (i=1,2,3,n)(2) 对 k=1 到 n-1,若 akk(k)0,进行lik = aik (k) / akk(k) , (i=k+1,k+2,n )aij(k+1) = aij(k) - lik * akj(k), (i,j= k+1,k+2,n)bi(k+1) = bi(k) - lik * bk(k), (i= k+1,k+2,n)2 回代若 ann(n) 0xn = bn(n) / ann(n)xi = (bi
4、(i) sgm(aij(i) * xj )/- aii(i) ,(i = n-1,n-2,1),( j = i+1,i+2,n )(五)高斯消元法的条件消元过程要求 aii(i) 0 (i=1,2,n),回代过程则进一步要求 ann(n) 0,但就方程组 Ax=b讲,a ii(i)是否等于 0 时无法事先看出来的。注意 A 的顺序主子式 Di(i=1,2,n),在消元的过程中不变,这是因为消元所作的变换是“将某行的若干倍加到另一行” 。若高斯消元法的过程进行了 k-1 步(a ii(i) 0,ik 时,l kr=0, 且 lkk=1,因为所以,同理可推出计算 L 的第 k 列的公式:因此得到如
5、下算法杜利特(Doolittle)算法:(1)将矩阵分解为 A=LU,对 k=1,2,nnrrjkkjj nkulau1,.1nrrjkkjjl1nrkrjkii niulal1 ,.1/)(nrrjkkjula11,.1/)( ,.1knrkrjkiirrjkkjjl niulau:公 式(2)解 Ly=b(3)解 Ux=y例:求解方程组472390 156892 4 1x解:由公式 1 得出 1 63 2 4,1 23 LU于是化为两个方程组 43214321 63 21 79 yxy利用公式 2,3 可解 y=(9,5,3,-1)T,x=(0.5,2,3,-1)T三、应用1,.2:2kr
6、rk nylby公 式 nkrkrkuxx1 1,./)(3:公 式问题 1:维他命的配方维他命是一种好的药品,人们都需要摄入一定量的各种维生素,现在有若干种维他命,问能否利用这些维他命配制出适合人需求的各种维生素。数据输入:第一行:人们需补充的 V(1=V=25) 种维生素。第二行:V 个数,第 i 个数为 Vi,表示人体对第 i 种维生素的需求量。(1=Vi=1000 )第三行:已知的 G (1=G=15) 种维他命。以下 G*V 的整数矩阵:第 i 行第 j 个数为 Aij,表示第 i 种维他命中所含的第 j 种维生素的含量(1=Aij=1000 ) 。数据输出:第一行:输出能否配制,若
7、能输出 Yes,否则输出 No第二行:若能配制,则输出 G 个整数,其中第 i 个整数 Gi,表示第 i 种维他命所取的数量,若有多种配置方案,输出一种即可。若不能配制,则第二行为空。样例:input.txt4100 200 300 400450 50 50 5030 100 100 10020 50 150 25050 100 150 200output.txtYes1 1 1 0 分析:因为不知道每种维他命的数量,如果采用枚举,很难估计每种维他命的上界,而且时间复杂度很高,下面我们尝试用解方程的方法。设需要配制的维他命每种数量分别为 x1,xn,其中 n=15,根据题意,可列出如下方程。用
8、高斯消元法求解:这里,虽然 x4 可取任意值,显然,表示 x4 的数量与答案无关,因此 x4=0,代入,可得x3=1, x2=1, x1=1,因此,原问题的解为( 1,1,1,0) 。 0 01/2 75 3 41 0 21 537 4 4 20 1 5378 62 530 01 5 2(3)7 2*(3)-1)1(524350)4(321 交 换与032 205 1 34x问题 2:虫食算(NOIP2005)给出一个 N (N=26)进制的加法算式,如下:ABCED+BDACEEBBAA其中有些是数字,有些是字母,字母可代表(1N)中的任何一个数字,每个字母数字都不一样。你的任务是,对于给定
9、的 N 进制加法算式,求出 N 个不同的字母分别导标的数字,使得该加法算式成立。输入数据保证有且仅有一组解。【数据规模】对于 30%的数据,保证有 N=10;对于 50%的数据,保证有 N=15;对于全部的数据,保证有 N=26。分析:显然,我们很容易想到如下算法,枚举 N 个未知数,由于每个未知数的取数值范围为0n-1,共 n 种,因此时间复杂度为 nn,又因为每个未知数的数值都不相同,因此时间复杂度为 n!,由于 n 可达到 26,这样做显然比较高 ,因此需要寻找其他解法。仔细分析,上述思路的局限性在于没有充分利用加法等式这个条件。我们只要分析有没有进位,由于有 N 个变量因此可以列出 N
10、 个方程,N 个方程 N 个未知数,由于原问题有唯一解,因此方程应该有唯一解。如上例,可得如下方程组:D+E-A=x1E+C-A=x1+x2C+A-B=x2+x3B+D-B=x3+x4A+B-E=x4其中 xi属于 0、1,枚举每个 xi,则时间复杂度为,2 n-1,用 LU 分解方程的时间为 n2,当然这个时间复杂度还是较高,可以利用一些已知条件,确定一些 xi的值,如 A+0=A,显然不可能有进位等等,加入这样一些剪枝条件即可。问题 3: 求最大异或值(SGU275)给你 n 个非负整数 A1,A2,An 集合,要你求出一个子集Ai1,Ai2,Aik(1=i1i2ik=n) ,使得 Ai1
11、 XOR Ai2 XOR Ai3 XOR Aik 的值最大。【数据规模】(1=n=100,A i=1018)分析:设用“”表示 XOR 操作。将问题进行转换成,求序列 x1,x2,xn,使得:(x1*A1) (x 2*A2) (xn*An)最大,其中 xi=0 或 1由于 XOR 操作时没有进位,所以我们把 A1,An 的每个二进制位分离出来考虑。设 Ai=a(i,0)*20+a(i,1)*21+a(i,k)*2k可知,若答案的第 k 位是 1,则a(1,k)*x1a(2,k)*x 2a(n,k)*x n=1 否则 a(1,k)*x1a(2,k)*x 2a(n,k)*x n=0由此,我们可以对
12、答案进行枚举。首先设答案的最高为为 1,得到一个方程,如果方程有解,则该位被确定为 1,否则为 0,继续枚举下面的每一位,直到每一位都确定为止。因此时间复杂度为 log2 (1018)*n2例如 n=3,A i=11,9,5 。首先我们把这三个数转成二进制,即:(11)10=(1011)2;(9)10=(1001)2;(5)10=(0101)2我们知道答案的最高位至多是第 4 位(也就是 23 位) ,我们设第 4 位为 1,得到方程:x1 x 2=1 (1)然后枚举第 3 位,设为 1,得到方程:x3=1 (2)然后枚举第 2 位,设为 1,得到方程:x1=1 (3)此时仍然可以将(1)(2
13、)(3) 联立而不发生矛盾,继续枚举最后一位,先设为 1,得到方程:x1x 2x 3=1 (4)用(1)(2)(3)的主元对 (4)进行消元,得到:0=1 (4)(1) 矛盾!可知(4) 无法和前三个方程联立。所以最低位不能为 1,只能为 0。这样我们就得到了答案(1110) 2=(14)10问题 4: Puzzle(SGU260)有 N 个格子,每个格子可能是黑色或者白色。目前有 N 种操作方式,第 i 种操作可以将,A i,1,Ai,2,Ai,ki 这 Ki 个格子的颜色同时改变。 (从黑到白,或者从白到黑)现在给出N 个格子的初始状态,与这 N 种操作。请你判断是不是可以通过 N 种操作
14、,将所有格子变成同一种颜色。如果可以请输出一种方案。【数据规模】(1=n=200)分析:通过一定的分析,就可以知道本题可以表示成一个 N 元逻辑方程。首先可以明确的是同一个操作使用超过两次是没有意义的。因为一个操作被使用了两次相当于什么都没有改变,于是可以:设 Xi 表示第 i 种操作是否使用。如果使用则值为真,不使用则为假。我们先判断是不是可以将所有的格子的颜色都变成黑,变成白则可以类似处理。对于每个格子 i,设可以将 i 的格子颜色改变的操作有 C 个,它们为 B1,B2,BC。若i 的初始颜色为黑,即我们不能让 i 颜色改变,所以有: FalseXBCBB .321若 i 的初始颜色为白
15、,则有: TruXBBB.321总共有 N 个格子,即 N 个方程。有 N 种操作,即 N 个未知数。原问题就变成了判断 N元 Xor 方程组有没有解的问题了,可以在 O(N3)的时间复杂度内用高斯消元的方法解决。问题 5:Nikifor(Ural1041 )现在有 M 个 N 维向量 P1Pm,你需要从中“购买”N 个向量,它们是线性无关的。同时每个向量有一个价格,在选出 N 个向量的同时,要求价格和最小。所谓 N 个向量 Q1Qn 线性无关,即对于其中任意 N-1 个向量(假设为 Q1Qn) ,方程:Q1X1+Q2X2+Qn-1Xn-1 = Qn没有实数解(X 1,X2,Xn-1) 。【数
16、据规模】M=2000 N=50分析:本题我们采用贪心的方法。首先将所有向量按照价格从小到大排序。之后从价格小的向量开始依次检查,倘若已经购买了的向量无法表示出当前检查的向量,则此向量也需要购买,否则就不需要购买。若发现已经购买了 n 个向量,就得到一组解,若检查完所有向量之后依然没有 n 个向量,就表示无解。贪心正确性的证明:首先我们需要证明购买的若干个向量是线性无关的。考虑用数学归纳法,假设购买的前 t 个向量 P1Pt 是线性无关的,现在发现向量 Q 也需要购买,我们证明 P1Pt,Q 也是线性无关的:由于 Q 需要购买,则方程 P1X1+P2X2+PtXt = Q 无解。假设结论不成立,
17、即存在(Y 1,Y2,Yt)使得 P1Y1+P2Y2+Pt-1Yt-1+QYt = Pt,那么若 Yt=0,即 P1Y1+P2Y2+Pt-1Yt-1 = Pt,则与 P1Pt 是线性无关矛盾;若 Yt 不为 0,于是有 P1(Y1/Yt)+P2(Y2/Yt)+Pt-1(Yt-1/Yt)-Pt(1/Yt) = Q,则与“方程P1X1+P2X2+PtXt = Q 无解 ”矛盾。因此 P1Pt,Q 也是线性无关的。因此前 t+1 个向量也是线性无关,于是命题得证。此外还有一个问题,在贪心过程中每次遇到需要购买的向量,我们就马上购买,但会不会造成之后无解呢?显然不会,下面我们再来证明一个结论:设前 t
18、 次购买的向量为 P1Pt,第 t+1 次购买的向量为 Pt+1,那么若存在一组可行解(P 1,P2,Pt,Q1,Qs) ,则一定会存在一组解( P1,P2,Pt+1,W1,Wk) 。证明:(P 1,P2,Pt,Q1,Qs)是可行解,则它们一定可以表示所有的向量。设 P1X1+P2X2+PtXt+Q1Y1+QsYs = Pt+1,那么 Y1Ys 不可能全为 0。若全为 0,则方程简化为 P1X1+P2X2+PtXt = Pt+1,但 P1Pt+1 是线性无关的,因此这是不可能的。不妨设 Ys 不为 0,那么我们只须将 Qs 替换为 Pt+1,则( P1,P2,Pt+1,Q1,Qs-1)同样也为可行解。因此结论得到证明。每次判断一个向量需不需要购买,实际上就是判断一个方程组有没有实数解,整个算法的时间复杂度为 O(MN2)。