Квадратное уравнение легко решается аналитически, через дискриминант. Алгоритм решения легко можно запрограммировать на 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))

