Решение приложений C # для квадратных мнимых корней

Я создал чрезвычайно простое, но полностью функциональное и весьма полезное приложение 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.

Однако я не могу придумать хороший способ подойти к этому. Сложные решения возникают, когда кто-то пытается извлечь квадратный корень из отрицательного числа, что приводит к появлению is повсюду. i = sqroot(-1) и i^2 = -1.

Кто-нибудь знает, как подойти к этой проблеме, или это просто не стоит времени?

ИЗМЕНИТЬ

Немного погуглив, я обнаружил, что это возможно с C # 4.0 (или .NET 4.0, я не уверен, какой) есть встроенная поддержка комплексных чисел в System.Numerics.Complex. Я проверяю это сейчас.


person Qcom    schedule 08.11.2010    source источник
comment
Я понятия не имею, почему вы конвертируете все в десятичные числа, также вы берете квадратный корень из нуля без видимой причины (он всегда равен нулю и ничего не вносит в ответ), и в этом случае solution2String должен быть повторением корня, а не Нет реальное решение.   -  person Ben Voigt    schedule 09.11.2010
comment
Упс, забыл про повторяющийся рут, вместо него должно быть multiplicity of 0 или что-то в этом роде. Спасибо что подметил это! Кроме того, десятичная дробь дает более высокую точность, не так ли?   -  person Qcom    schedule 09.11.2010
comment
Вы делаете математику в double, а потом конвертируете в decimal. Так что нет, вы не получаете более высокой точности, вы просто замедляете работу.   -  person Ben Voigt    schedule 09.11.2010
comment
Я считаю, что платформа .Net 4 поддерживается только языком CLR 4 (следовательно, C # 4). См. stackoverflow.com/questions/148833/   -  person Peter M    schedule 09.11.2010
comment
@ Бен, хорошо, я исправлю это и немного обновлю код. @Peter спасибо за ссылку там.   -  person Qcom    schedule 09.11.2010


Ответы (2)


например вы пытаетесь вычислить

(-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";
person Ben Voigt    schedule 08.11.2010

Так в чем, по вашему мнению, может быть проблема? Вы уже проверяете результаты воображения. Просто рассчитайте соответственно - например. вычислить квадратный корень, но с положительным значением, и отслеживать реальную и воображаемую части.

person winwaed    schedule 08.11.2010