二次虚根的C#应用求解

二次虚根的C#应用求解,c#,winforms,polynomial-math,complex-numbers,quadratic,C#,Winforms,Polynomial Math,Complex Numbers,Quadratic,我构建了一个极其简单、功能齐全且非常有用的WinForms C#应用程序,用于求解二次方程的实根 以下是我当前的编程逻辑: string noDivideByZero = "Enter an a value that isn't 0"; txtSolution1.Text = noDivideByZero; txtSolution2.Text = noDivideByZero; decimal aValue = nmcA.Value; decimal bV

我构建了一个极其简单、功能齐全且非常有用的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();
    }
string noDivideByZero=“输入一个非0的值”;
txtSolution1.Text=noDivideByZero;
txtSolution2.Text=noDivideByZero;
十进制值=nmcA.值;
十进制B值=nmcB.值;
十进制C值=nmcC.值;
十进制解1,解2;
字符串solution1String、solution2String;
//二次公式:x=(-b+-sqrt(b^2-4ac))/2a
//计算判别式
十进制内方值=(b值*b值)-4*有效值*c值;
如果(内部平方英尺<0)
{
//没有真正的解决办法
solution1String=“没有真正的解决方案!”;
solution2String=“没有真正的解决方案!”;
txtSolution1.Text=solution1String;
txtSolution2.Text=solution2String;
}
else if(insideSquareRoot==0)
{
//一个真正的解决方案
十进制sqrtOneSolution=(十进制)Math.Sqrt((双精度)insideSquareRoot);
解1=(-b值+sqrtOneSolution)/(2*有效);
solution2String=“没有真正的解决方案!”;
txtSolution1.Text=solution1.ToString();
txtSolution2.Text=solution2String;
}
否则如果(insideSquareRoot>0)
{
//两个真实的解决方案
十进制sqrtTwoSolutions=(十进制)Math.Sqrt((双精度)insideSquareRoot);
解决方案1=(-bValue+sqrtTwoSolutions)/(2*aValue);
解决方案2=(-b值-sqrtTwoSolutions)/(2*有效);
txtSolution1.Text=solution1.ToString();
txtSolution2.Text=solution2.ToString();
}
txtSolution1
txtSolution2
是不允许接收输入但输出计算结果的文本框

nmcA
nmcB
nmcC
是数字上下控制,用于最终用户输入a、b和c值

好的,所以,我希望它能更进一步,可能也能解出虚值。考虑到我已经设置了条件,我只需要在判别式等于
0
或小于
0
时考虑虚值

然而,我想不出一个好办法来解决这个问题。当人们试图取负数的平方根时,就会出现复杂的解,导致
i
s无处不在
i=sqroot(-1)
i^2=-1

是否有人知道如何解决这个问题,或者是否不值得花时间

编辑


通过谷歌搜索,我发现C#4.0(或.NET 4.0,我不确定是哪一种)可以在
System.Numerics.complex
中内置复数支持。我现在正在检查。

那么您认为您可能有什么问题?
你已经在检查想象的结果了。只需相应地计算-例如,执行平方根,但为正值,并跟踪真实和想象部分。

例如,您正在尝试计算

(-b + sqrt(inside)) / (2*a)
Math.Sqrt
不知道虚数,所以如果
在<0
内,它会发出嘎嘎声。但是我们总是可以乘以1而不改变答案。请注意,i2=-1。和-1*i2=1。让我们乘以-1*i2并简化:

(-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#代码:


我不知道你为什么要把所有的东西都转换成十进制,你也毫无理由地取零的平方根(它总是零,对答案没有贡献),在这种情况下,
solution2String
应该是“重复根”,而不是“没有真正的解”。哎呀,我忘记了重复根,它应该是0的多重性,或者类似的东西。谢谢你指出这一点!此外,十进制精度更高,不是吗?您在
double
中进行数学运算,然后转换为
decimal
。因此,不,你没有获得更高的准确性,你只是放慢了工作速度。我相信.NET4框架只受CLR4(因此是C#4)语言的支持。请看@Ben,好的,我会纠正这一点,并在一点时间内更新代码@彼得:谢谢你的推荐。
solution1String = (-b/(2*a)).ToString() +
                      " + " + (Math.Sqrt(-inside)/(2*a)).ToString() + " i";