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
,
Однако я не могу придумать хороший способ приблизиться к этому. Сложные решения возникают, когда кто-то пытается получить квадратный корень из отрицательного числа, что приводит к i
появляются везде. i = sqroot(-1)
а также i^2 = -1
,
Кто-нибудь знает, как подойти к этой проблеме, или она просто не стоит времени?
РЕДАКТИРОВАТЬ
С немного большим количеством Google, я обнаружил, что это возможно с C# 4.0 (или.NET 4.0, я не уверен, что), есть встроенная поддержка комплексных чисел в System.Numerics.Complex
, Я проверяю это сейчас.
2 ответа
Например, вы пытаетесь рассчитать
(-b + sqrt(inside)) / (2*a)
Math.Sqrt
не знает о мнимых числах, так что если inside < 0
, Но мы всегда можем умножить на 1, не меняя ответ. Обратите внимание, что я2 = -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#:
solution1String = (-b/(2*a)).ToString() +
" + " + (Math.Sqrt(-inside)/(2*a)).ToString() + " i";
Так в чем же проблема, которая, по вашему мнению, может возникнуть? Вы уже проверяете мнимые результаты. Просто посчитайте соответственно - например. выполнить квадратный корень, но положительного значения, и отслеживать реальные и мнимые части.