Численные методы: решение квадратного уравнения на Python

Квадратное уравнение легко решается аналитически, через дискриминант. Алгоритм решения легко можно запрограммировать на Python. Есть еще один способ решения уравнения — это использование численных методов.

Алгоритм решения уравнения численными методами подойдет для решения любого уравнения, не только квадратного. Давайте распишем сначала алгоритм решения на словах, а затем напишем программу.

Алгоритм решения квадратного уравнения

Допустим нужно решить квадратное уравнение

2 * x**2 + 3 * x — 5 = 0

Решаем следующим образом. Сначала используем алгоритм перебора. Затем используем алгоритм половинного деления.

Алгоритм перебора для нахождения отрезка неопределенности

  1. Определим отрезок внутри которого ожидаем найти корни уравнения. Например от -100 до 100
  2. Определим шаг с которым мы пройдемся по всему отрезку. Например 0,5.
  3. Пройтись в цикле по всему отрезку от -100 до 100 с шагом 0,5. Для каждого участка (например -100, -99,5) определить Y на концах участка.
  4. Если значения Y разных знаков, значит на этом участке есть один корень (точка где Y становится = 0). Если значения Y одного знака, то пропускаем этот участок. Таким образом находим все участки, где Y меняет знак. Такой участок назовем отрезком неопределенности
  5. Для каждого найденного участка применяем метод половинного деления.

Алгоритм половинного деления

  1. Участок, где Y меняет знак делим пополам
  2. Для середины участка определяем знак Y
  3. Появляются 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)) 

Вам также может понравиться

About the Author: Азат Ахметович

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Максимальный размер загружаемого файла: 999 МБ. Вы можете загрузить: изображение, аудио, видео, документ, таблица, интерактив, текст, архив, код, другое. Ссылки на YouTube, Facebook, Twitter и другие сервисы, вставленные в текст комментария, будут автоматически встроены. Drop files here