方程求解器:线性与多项式方程的解决方案

方程求解器是一个多功能的应用程序,它能够解决线性和多项式方程。用户可以选择要解决的方程类型,然后输入相应的参数。为了便于用户理解,该程序提供了图形用户界面(GUI)来输入参数。

线性方程是指以下格式的方程:

51x + 4y + 38z = 35

在上述方程中,x、y 和 z 是未知数。如果想要解决三个未知数,需要三个包含这些未知数的方程。

多项式方程是指以下格式的方程:

4x^3 + 7x^2 - 12 = 0

多项式方程只有一个未知变量。在上述方程中,x 是未知变量。未知变量的最高次幂称为方程的阶数。上述方程的阶数是 3。多项式方程的最大解的数量等于该方程的阶数。

求解方程

要得到线性方程的解,未知数的数量必须等于方程的数量。线性方程通常使用矩阵行操作来求解。多项式方程则使用牛顿-拉弗森方法来求解。

程序有三个 GUI 表单来从用户那里获取输入。第一个表单用于获取方程的类型和方程的参数数量。换句话说,就是未知数的数量或方程的阶数。

上述表单用于获取解决线性方程的输入。用相关值填充表格。未知数表示为 X1、X2 等。然后点击 "计算" 按钮。

上述表单用于从用户那里获取输入。点击 "计算" 按钮后,文本框下方会给出输出值。

使用代码

假设需要解决以下三个方程:

4x + 23y - 6z = 3 -7x + 3y + 12z = 25 5 + 10y - 7z = 30

它可以写成矩阵乘法的形式:

[4 23 -6] [x] .. [ 3] [-7 3 12] [y] = [25] [5 10 -7] [z] .. [30]

有三个矩阵:

  • 系数矩阵 (3,3)
  • 未知变量矩阵 (3,1)
  • 答案矩阵 (3,1)

假设未知数的数量是 n。然后考虑第一个矩阵 (n,n) 和第三个矩阵 (n,1),将两者合并创建一个二维数组 (n,n+1)。

例如(对于上述方程):

[4 23 -6 | 3] [-7 3 12 |25] [5 10 -7 |30]

然后通过行操作将系数矩阵转换为单位矩阵。矩阵乘法不会因行操作而改变。所以答案矩阵就变成了未知数的解。

C# 代码示例:

for (int i = 0; i < nVar; i++) { // 如果元素为零,则通过行操作使其非零 if (equationMatrix[i, i] == 0) { int j; for (j = i+1; j < nVar; j++) { if (equationMatrix[j, i] != 0) { for (int k = i; k < nVar + 1; k++) equationMatrix[i, k] += equationMatrix[j, k]; break; } } // 如果这个变量的所有值都为零,则存在重复的方程 if (j == nVar) throw new Exception("Same equation repeated. Can't solve it"); } // 使对角元素为 1 for (int k = nVar; k >= i; k--) equationMatrix[i, k] /= equationMatrix[i, i]; // 使用行操作使上矩阵 for (int j = i+1; j < nVar; j++) { for (int k = nVar; k >= i; k--) equationMatrix[j, k] -= equationMatrix[i, k] * equationMatrix[j, i]; } } // 使对角矩阵 for (int i = nVar-1; i > 0; i--) { for (int j = i-1; j >= 0; j--) { equationMatrix[j, nVar] -= equationMatrix[j, i] * equationMatrix[i, nVar]; equationMatrix[j, i] = 0; } } double[] ans = new double[nVar]; for (int j = 0; j < nVar; j++) ans[j] = equationMatrix[j, nVar];

它使用牛顿-拉弗森方法。这是一种近似方法。因此,它需要更多的迭代次数以获得更精确的值。这个程序的精度大约是 0.0001。迭代次数根据答案的精度而变化。

C# 代码示例:

while (Math.Abs(x - x0) > 0.0001) { if (itr++ > maxIteration) { return NoSolution; } x0 = x; func = 0; dFunc = 0; for (int i = 0; i < coefficient.Count; i++) { func += coefficient[i] * Math.Pow(x, coefficient.Count-1 - i); } for (int i = 0; i < dCoeff.Count; i++) dFunc += dCoeff[i] * Math.Pow(x, dCoeff.Count-1 - i); if (dFunc != 0) x = x - func / dFunc; else if (func < 0.0001) return x; else x += 1; }

注意事项

方法 "List SolvePolynomialEquation(List coeffient)" 和 "double[] SolveLinearEquation(double[,] equationMatrix)" 能够解决阶数超过 10 的方程。在这个程序中,将方程的阶数限制在了 10。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485