方程求解器是一个多功能的应用程序,它能够解决线性和多项式方程。用户可以选择要解决的方程类型,然后输入相应的参数。为了便于用户理解,该程序提供了图形用户界面(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]
有三个矩阵:
假设未知数的数量是 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