Решение C # приложения для квадратичных мнимых корней - PullRequest
3 голосов
/ 09 ноября 2010

Я создал чрезвычайно простое, но полностью функциональное и весьма полезное приложение 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, я обнаружил, что это возможно в C # 4.0 (или .NET 4.0, я не уверен, что), есть встроенная поддержка комплексных чисел в System.Numerics.Complex.Я проверяю это сейчас.

Ответы [ 2 ]

4 голосов
/ 09 ноября 2010

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

(-b + sqrt(inside)) / (2*a)

Math.Sqrt не знает о мнимых числах, поэтому он квакает, если inside < 0. Но мы всегда можем умножить на 1, не меняя ответ. Обратите внимание, что я 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";
0 голосов
/ 09 ноября 2010

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

...