我构建了一个非常简单但功能齐全且非常有用的WinForms C#应用程序,它解决了二次方程式的真正根源。
这是我目前的编程逻辑:
string noDivideByZero = "Enter an a value that isn't 0";
txtSolution1.Text = noDivideByZero;
txtSolution2.Text = noDivideByZero;
decimal aValue = nmcA.Value;
decimal bValue = nmcB.Value;
decimal cValue = nmcC.Value;
decimal solution1, solution2;
string solution1String, solution2String;
//Quadratic Formula: x = (-b +- sqrt(b^2 - 4ac)) / 2a
//Calculate discriminant
decimal insideSquareRoot = (bValue * bValue) - 4 * aValue * cValue;
if (insideSquareRoot < 0)
{
//No real solution
solution1String = "No real solutions!";
solution2String = "No real solutions!";
txtSolution1.Text = solution1String;
txtSolution2.Text = solution2String;
}
else if (insideSquareRoot == 0)
{
//One real solution
decimal sqrtOneSolution = (decimal)Math.Sqrt((double)insideSquareRoot);
solution1 = (-bValue + sqrtOneSolution) / (2 * aValue);
solution2String = "No real solution!";
txtSolution1.Text = solution1.ToString();
txtSolution2.Text = solution2String;
}
else if (insideSquareRoot > 0)
{
//Two real solutions
decimal sqrtTwoSolutions = (decimal)Math.Sqrt((double)insideSquareRoot);
solution1 = (-bValue + sqrtTwoSolutions) / (2 * aValue);
solution2 = (-bValue - sqrtTwoSolutions) / (2 * aValue);
txtSolution1.Text = solution1.ToString();
txtSolution2.Text = solution2.ToString();
}
txtSolution1
和txtSolution2
是不允许接收输入但输出计算结果的文本框
nmcA
,nmcB
和nmcC
是NumericUpDown控件,用于最终用户输入的a,b和c值
好的,所以,我希望更进一步,并可能解决想象的价值。考虑到我已经设置了条件,我只需要在判别式等于0
或小于0
时才考虑虚数值。
然而,我想不出一个好方法来解决这个问题。当一个人试图取负数的平方根时会出现复杂的解,导致i
出现在各处。 i = sqroot(-1)
和i^2 = -1
。
有没有人知道如何解决这个问题,或者它是否值得花时间?
修改
通过更多Google搜索,我发现在System.Numerics.Complex
中可以使用C#4.0(或.NET 4.0,我不确定哪个)内置复数支持。我现在正在检查这个。
答案 0 :(得分:4)
e.g。你正试图计算
(-b + sqrt(inside)) / (2*a)
Math.Sqrt
不知道虚数,所以如果inside < 0
就会歪曲。但是我们总是可以乘以1而不改变答案。注意,i 2 = -1。并且-1 * i 2 = 1.所以让我们乘以-1 * i 2 并简化:
(-b + sqrt(inside * -1 * i**2)) / (2*a)
(-b + sqrt(-inside) * sqrt(i**2)) / (2*a)
(-b + sqrt(-inside) * i) / (2*a)
-b/(2*a) + sqrt(-inside)/(2*a) * i
以下C#代码:
solution1String = (-b/(2*a)).ToString() +
" + " + (Math.Sqrt(-inside)/(2*a)).ToString() + " i";
答案 1 :(得分:0)
那么您认为可能存在的问题是什么? 您已经在检查想象结果了。只需相应计算 - 例如。执行平方根但是正值,并跟踪真实和想象的部分。