Как правильно решить для мнимых чисел в квадратичном в python?

#python-3.x

#python-3.x

Вопрос:

Я пытаюсь создать квадратичный решатель, где он сообщит мне значения x. Это работает безупречно, пока один из ответов не будет мнимым числом. Как мне сделать так, чтобы программа не зависала каждый раз и фактически давала правильный ответ в терминах i?

 import math
print()
a = input("Coefficient of a: ")
a = float(a)
b = input("Coefficient of b: ")
b = float(b)
c = input("Coefficient of c: ")
c = float(c)

x_1 = (-b   math.sqrt(b ** 2 - (4 * a * c))) / 2 * a
x_2 = (-b - math.sqrt(b ** 2 - (4 * a * c))) / 2 * a
print()
print(f" X = {x_1} or {x_2}")
print()
  

Комментарии:

1. Просто используйте cmath (сложную математику) вместо math . Он будет рассматривать все числа как комплексные, но вы можете легко проверить x.imag == 0 , является ли число реальным.

Ответ №1:

Вы можете использовать complex() вместо float() :

 a = input("Coefficient of a: ")
a = complex(a)
b = input("Coefficient of b: ")
b = complex(b)
c = input("Coefficient of c: ")
c = complex(c)

x_1 = (-b   (b ** 2 - (4 * a * c))**0.5) / 2 * a
x_2 = (-b - (b ** 2 - (4 * a * c))**0.5) / 2 * a
print()
print(f" X = {x_1} or {x_2}")
print()
  

Печатает (например):

 Coefficient of a: 3 2j
Coefficient of b: 1
Coefficient of c: -2-1j

 X = (3.1748906833227015 8.198076043446118j) or (-6.174890683322701-10.198076043446118j)
  

Комментарии:

1. Вау. Я не знал complex , что существует.

Ответ №2:

Проверьте значение b ** 2 - (4 * a * c) . Если оно отрицательное, у вас есть воображаемые решения.

Таким образом, ваш код становится:

 import math
print()
a = input("Coefficient of a: ")
a = float(a)
b = input("Coefficient of b: ")
b = float(b)
c = input("Coefficient of c: ")
c = float(c)

delta = b ** 2 - (4 * a * c)
if delta >= 0:
    x_1 = (-b   math.sqrt(b ** 2 - (4 * a * c))) / 2 * a
    x_2 = (-b - math.sqrt(b ** 2 - (4 * a * c))) / 2 * a
    print()
    print(f" X = {x_1} or {x_2}")
    print()
else:
    print("The 2 solutions are imaginary:")
    real = -b
    imag = abs(math.sqrt(-delta) / (2 * a))
    print(f" X = {real}   i*{imag} or {real} - i*{imag}")
  

Комментарии:

1. Есть ли какой-либо способ на самом деле упростить радикалы в python, чтобы решением было комплексное число, например 2 3i, вместо того, чтобы использовать форматированную строку в операторе else?

2. Да, есть. Вам просто нужно вычислить фактические значения -b и sqrt(delta)/(2*a) . Я отредактировал свой ответ, чтобы показать вам.

Ответ №3:

вы можете использовать sympy это: пример (уравнение второй и третьей степени и …)

 import sympy as sp
x = sp.Symbol("x")
print(sp.solve(x ** 4 - 1, x))
  

вывод:

 [-1, 1, -I, I]
  

pip install sympy:https://pypi.org/project/sympy /