Как можно улучшить код для нахождения корней квадратного уравнения при любых входных значениях?

Как можно модифицировать функцию `discrim(a, b, c)` на Python для решения квадратного уравнения ax^2 + bx + c = 0? Какие корни уравнения будут выводиться в зависимости от входных значений a, b, c? Какое сообщение будет выведено в случае комплексного корня?
  • 7 марта 2024 г. 5:58
Ответы на вопрос 3
Для улучшения кода для нахождения корней квадратного уравнения при любых входных значениях, можно использовать более точные методы вычисления корней, например, метод Ньютона или метод Брента. Эти методы более эффективны и точны, особенно для случаев с большими значениями коэффициентов a, b, c или при близких корнях.

Вот модифицированная функция `discrim(a, b, c)` на Python для решения квадратного уравнения:

```python
import cmath

def solve_quadratic(a, b, c):
    discrim = b**2 - 4*a*c

    if discrim > 0:
        x1 = (-b + discrim**0.5) / (2*a)
        x2 = (-b - discrim**0.5) / (2*a)
        return x1, x2
    elif discrim == 0:
        x = -b / (2*a)
        return x
    else:
        x1 = (-b + cmath.sqrt(discrim)) / (2*a)
        x2 = (-b - cmath.sqrt(discrim)) / (2*a)
        return x1, x2

a = 1
b = 5
c = 6
result = solve_quadratic(a, b, c)
print(result)
```

В данной функции в зависимости от дискриминанта выводятся различные значения:
- Если дискриминант > 0, то выводятся два действительных корня.
- Если дискриминант = 0, то выводится один действительный корень.
- Если дискриминант < 0, то выводятся два комплексных корня.

В случае комплексного корня будет выведено сообщение вида `(a + bj)`, где a и b - действительная и мнимая части корня соответственно.
Решай задачу в общем случае: сразу считай дискриминант. 
Только перед этим в начале функции если а равен нулю, просто подними ошибку, что это не квадратное уравнение (у тебя ж задача искать корни квадратного, верно?), а то можешь словить ZeroDivisionError.
Условное ветвление пригодится только при сравнении дискриминанта с нулем.
В таком случае не придется делать проверку на комплексное.
Оптимизируй код до того момента, пока вычисление дискриминанта не будет выполняться в коде один единственный раз.
Для Python 3.10 и выше 
def squareEquation(a, b, c):
  match a, b, c:
    case 0, 0, 0:
      return 'All numbers', None
    case 0, 0, _:
      return 'Empty set', None
    case 0, _, _:
      return -c / b, None
  d = b * b - 4 * a * c;
  r = -b / 2 / a
  i = (abs(d) ** 0.5) / 2 / a
  if (d < 0):
    return f'{r} + {i}i', f'{r} - {i}i'
  if (d == 0):
    return r, None
  return r - i, r + i
Похожие вопросы