Решите это уравнение с помощью метода итерации с фиксированной точкой в Python
f(x) = x^2- 2x - 3 = 0
Как я могу решить это нелинейное уравнение и использовать метод итерации с фиксированной точкой в Python?
3 ответа
Итерация с фиксированной точкой
f(x) = x^2-2x-3 = 0 â ‡ 'x(x-2) = 3 â ‡' x = 3 / (x-2)
import math
def g(x):
if 2 == x:
return x + 1e-10
return 3/(x-2)
def quadratic(ff,x=0):
while abs(x-ff(x)) > 1e-10:
x = ff(x);
return x
print(quadratic(g))
-1
формула поиска корней
# -*- coding:utf8 -*-
import math
def quadratic(a, b, c):
''' ax² + bx + c = 0
return
True : all real number
Fasle : no solutions
(x1,x2)
'''
if not isinstance(a, (int, float)):
raise TypeError('a is not a number')
if not isinstance(b, (int, float)):
raise TypeErrot('b is not a number')
if not isinstance(c, (int, float)):
raise TypeError('c is not a number')
derta = b * b - 4 * a * c
if a == 0:
if b == 0:
if c == 0:
return True
else:
return False
else:
x1 = -c / b
x2 = x1
return x1, x2
else:
if derta < 0:
return False
else:
x1 = (-b + math.sqrt(derta)) / (2 * a)
x2 = (-b - math.sqrt(derta)) / (2 * a)
return x1, x2
print(quadratic(1, -2, -3))
(3,0, -1,0)
Возможная итерация с
f(x) = 2 + 3 / x.
Производная
f'(x) = - 3 / x²
так что итерации сходятся для x² > 3
.
Начиная с 2
, итерации
2, 7/2, 20/7, 61/20, 182/61, 547/182... -> 3
Это не работает для другого корня (который является отрицательным), потому что отрицательные значения быстро становятся положительными.
Формула, используемая @tinyhare,
f(x) = 3 / (x - 2)
имеет производную
f'(x) = - 3 / (x - 2)²
и, конечно, остается и сходится в отрицании.
-2, -3/4, -12/11, -33/34, -102/101, -303/304, ... -> -1
Обратите внимание, что в обоих случаях числитель каждый раз отключается на единицу, а знаменатель регулярно увеличивается.
Это квадратное уравнение, которое вы можете решить, используя выражение в замкнутой форме (т.е. не нужно использовать итерацию с фиксированной точкой), как показано здесь.
В этом случае у вас будет два решения:
x1 = -(p/2) + math.sqrt((p/2)**2-q)
x2 = -(p/2) - math.sqrt((p/2)**2-q)
где p - ваш первый коэффициент (-2 в вашем примере), а q - ваш второй коэффициент (-3 в вашем примере).
В общем случае вам нужно будет проверить выражение внутри оператора sqrt на большее или равное нулю. Если оно меньше нуля, уравнение не будет иметь решения в виде действительных чисел. Если он равен нулю, два решения равны (это называется двойным корнем).