Квадратное уравнение легко решается аналитически, через дискриминант. Алгоритм решения легко можно запрограммировать на Python. Есть еще один способ решения уравнения — это использование численных методов.
Алгоритм решения уравнения численными методами подойдет для решения любого уравнения, не только квадратного. Давайте распишем сначала алгоритм решения на словах, а затем напишем программу.
Алгоритм решения квадратного уравнения
Допустим нужно решить квадратное уравнение
Решаем следующим образом. Сначала используем алгоритм перебора. Затем используем алгоритм половинного деления.
Алгоритм перебора для нахождения отрезка неопределенности
- Определим отрезок внутри которого ожидаем найти корни уравнения. Например от -100 до 100
- Определим шаг с которым мы пройдемся по всему отрезку. Например 0,5.
- Пройтись в цикле по всему отрезку от -100 до 100 с шагом 0,5. Для каждого участка (например -100, -99,5) определить Y на концах участка.
- Если значения Y разных знаков, значит на этом участке есть один корень (точка где Y становится = 0). Если значения Y одного знака, то пропускаем этот участок. Таким образом находим все участки, где Y меняет знак. Такой участок назовем отрезком неопределенности
- Для каждого найденного участка применяем метод половинного деления.
Алгоритм половинного деления
- Участок, где Y меняет знак делим пополам
- Для середины участка определяем знак Y
- Появляются 2 участка: слева от середины и справа. Выбираем тот, где значения Y на концах разного знака. Далее работаем с ним: запоминаем этот участок и переходим к шагу 1.
Повторяем этот алгоритм пока размер учатка не станет меньше чем точность с которой нам нужно определить X. Например мы можем заранее задать точность 0,001
Вот пример выполнения первого алгоритма, который находит отрезок неопределенности:
a = float(input("а = ")) b = float(input("b = ")) c = float(input("c = ")) shag = 0.005 p1 = -10 p2 = 10 x = p1 toch = 0.0001 while x<p2: y1 = a * x**2 + b * x + c x = x + shag y2 = a * x**2 + b * x + c if (y1>0 and y2<0) or (y1<0 and y2>0): print("Отрезок неопределенности от " + str(x-shag) + " до " + str(x))
Вот полный текст программы, где для отрезка неопределенности находим корень уравнения:
a = float(input("а = ")) b = float(input("b = ")) c = float(input("c = ")) shag = 0.005 p1 = -10 p2 = 10 x = p1 toch = 0.0001 while x<p2: y1 = a * x**2 + b * x + c x = x + shag y2 = a * x**2 + b * x + c if (y1>0 and y2<0) or (y1<0 and y2>0): print("Отрезок неопределенности от " + str(x-shag) + " до " + str(x)) x1=x-shag x2=x delta = x2-x1 while delta > toch: x0 = x1+delta/2 y0=a * x0**2 + b * x0 + c y1=a * x1**2 + b * x1 + c if (y1<0 and y0>0) or (y1>0 and y0<0): x1 = x1 x2 = x0 else: x1 = x0 x2 = x2 delta = x2-x1 print("Результат x = " + str(x1))
Мы можем заметить, что в нашей программе есть повторяющиеся участки кода, которые можно вынести в подпрограммы. Например это расчет самой функции. Если мы захотим изменить уравнение, которое нужно решать, то придется вносить изменения в 4 строчки кода. По этому ее целесообразно вынести в функцию.
Так же метод половинного деления можно вывести в отдельную функцию. Код будет выглядеть следующим образом.
def y(a,b,c,x): rezult = a * x**2 + b * x + c return rezult def poldel(x1,x2): delta = x2-x1 while delta > toch: x0 = x1+delta/2 y0=y(a,b,c,x0) y1=y(a,b,c,x1) if (y1<0 and y0>0) or (y1>0 and y0<0): x2 = x0 else: x1 = x0 delta = x2-x1 rezult = x1 return rezult a = float(input("а = ")) b = float(input("b = ")) c = float(input("c = ")) shag = 0.00005 p1 = -10 p2 = 10 x = p1 toch = 0.0001 while x<p2: x1 = x x2 = x + shag y1 = y(a,b,c,x1) y2 = y(a,b,c,x2) x = x + shag if (y1>0 and y2<0) or (y1<0 and y2>0): print("Отрезок неопределенности от " + str(x1) + " до " + str(x2)) rez = poldel(x1,x2) print("Результат x = " + str(rez))