有理数系的线性代数运算程序(2) 线性方程组
要解一个线性方程组: \( AX=B \) ,其中
\[A=\begin{bmatrix}a_{11} & a_{12} & a_{13} \\
a_{21} & a_{22} & a_{23} \\
a_{31} & a_{32} & a_{33} \\
\end{bmatrix} ,B = \begin{bmatrix} b_1 \\ b_2 \\ b_3 \end{bmatrix} \]
首先将A化为上三角矩阵,然后逐行将A化成单位阵,在这个变换过程中,B随A的变换同时等价变换,当A是E时,就可以得出运算结果。
private static void swapLine(ref List<RationalNumber> Mat, ref List<RationalNumber> Vect,int N,int k1,int k2) { RationalNumber tmp; tmp = Vect[k1]; Vect[k1] = Vect[k2]; Vect[k2] = tmp; for (int i=0;i<N;i++) { tmp = Mat[k1 * N + i]; Mat[k1 * N + i] = Mat[k2 * N + i]; Mat[k2 * N + i] = tmp; } } private static void upperTriangularWithAugmented_Line(ref List<RationalNumber> Mat, ref List<RationalNumber> Vect, int N, int i) { int k1, k2; for (k1 = i + 1; k1 < N; k1++) { RationalNumber rate = Mat[k1 * N + i] / Mat[i * N + i]; Vect[k1] = Vect[k1] - rate * Vect[i]; for (k2 = i; k2 < N; k2++) { Mat[k1 * N + k2] = Mat[k1 * N + k2] - rate * Mat[i * N + k2]; } } } private static bool upperTriangularWithAugmented(ref List<RationalNumber> Mat, ref List<RationalNumber> Vect,int N) { bool allLineZero = true; for(int i=0;i<N;i++) { for(int k1=i;k1<N;k1++) { if (!(Mat[k1 * N + i] == 0)) { swapLine(ref Mat, ref Vect, N, k1, i); allLineZero = false; break; } } if (allLineZero) { break; } else { upperTriangularWithAugmented_Line(ref Mat,ref Vect, N, i); } } return allLineZero; } private static string Mat2LaTeX(ref List<RationalNumber> Mat, ref List<RationalNumber> Vect,int N) { string msg = @"\pmatrix{"; for(int i=0;i<N;i++) { if(i>0) { msg += @"\\"; } for(int j=0;j<N;j++) { if(j>0) { msg += @"&"; } msg += Mat[i * N + j].ToLaTeX(); } } msg += "}X="; msg += @"\pmatrix{"; for(int i=0;i<N;i++) { if (i > 0) msg += @"\\"; msg += Vect[i].ToLaTeX(); } msg += "}"; return msg; } private static string Vect2LaTeX(ref List<RationalNumber> Vect,int N) { string msg = @"\pmatrix{"; for(int i=0;i<N;i++) { if(i>0) { msg += @"\\"; } msg += Vect[i].ToLaTeX(); } msg += "}"; return msg; } private static void identityMatrix(ref List<RationalNumber> Mat, ref List<RationalNumber> Vect,int N) { int i, j; for(i=N-1;i>=0;i--) { RationalNumber rate = 1 / Mat[i * N + i]; Vect[i] = rate * Vect[i]; Mat[i * N + i] = new RationalNumber(1); for( j=0;j<i;j++) { Vect[j] = Vect[j] - Vect[i] * Mat[j * N + i]; Mat[j * N + i] = new RationalNumber(0); } } } public static string linearEquation(ref List<RationalNumber> Mat,ref List<RationalNumber> Vect) { int N = 1; while(Mat.Count>=(N+1)*(N+1)) { N++; } if (Vect.Count >= N) { upperTriangularWithAugmented(ref Mat, ref Vect,N); string latex_line1 = Mat2LaTeX(ref Mat, ref Vect, N); identityMatrix(ref Mat, ref Vect, N); Vect2LaTeX(ref Vect, N); return latex_line1 +",X="+ Vect2LaTeX(ref Vect, N); ; } else { return @"SyntexError"; } }
计算结果返回的是LaTex形式。