дихотомия
Код реализации:
def asdf(x):
rres=8*x**3-2*x**2-7*x+3
return rres
i=2
left=0
right=1
while i>0 :
i = i-1
ans = 0.1
mid1 = (left + right + ans) / 2
mid2 = (left + right - ans) / 2
a=asdf(mid1)
c=asdf(mid2)
if a > c :
right = mid1
else :
left = mid2
b=(left+right) / 2
print("左极限=%s,右极限=%s,极小值x=%s"%(left,right,b))
результат операции:
左极限=0.45,右极限=0.775,极小值x=0.6125
def
Это определение среднего пальца Python, которое обычно используется для определения функций.Если для построения сети требуется глубокое обучение, его можно использовать для определения сети.Стоит отметить, что возврат должен быть добавлен на новую строку после функции.Если его не добавить, формула функции — ваза, как и результат, который нельзя вывести.
Вопрос: Зачем добавлять возврат?
return означает вывод любого значения переменной в этом определении в качестве результата. Вообще говоря, это имя реляционного выражения выходной функции, чтобы при вызове этой функции можно было отобразить значение функции, соответствующее переменной, иначе она просто будет работать без результатов и не будет иметь никакого эффекта.
Метод решетки - метод деления по трем точкам
Код реализации:
import numpy as np
def qwer(x):
third = np.exp(x) - 5*x
return third
left = 1
right = 2
mid1 =float(left+right) / 2
mid2 = (left+mid1) / 2
mid3 = (mid1+right) /2
a = qwer(mid1)
b = qwer(mid2)
c = qwer(mid3)
i = 5
while i > 0:
i=i-1
if a > b:
if c > b :
#b
right = mid1
mid1 = mid2
a=b
mid2 = (left + mid1) / 2
mid3 = (mid1 + right) / 2
b = qwer(mid2)
c = qwer(mid3)
else:#b>c
#c
left = mid1
mid1 = mid3
a = c
mid2 = (left + mid1) / 2
mid3 = (mid1 + right) / 2
b = qwer(mid2)
c = qwer(mid3)
else:#b>a
if a > c:
#C
left = mid1
mid1 = mid3
a = c
mid2 = (left + mid1) / 2
mid3 = (mid1 + right) / 2
b = qwer(mid2)
c = qwer(mid3)
else:#b>a&c>a
# a
left = mid2
right = mid3
mid2 = (left + mid1) / 2
mid3 = (mid1 + right) / 2
b = qwer(mid2)
c = qwer(mid3)
print("最小值=%s"%mid1)
print("函数值=%s"%a)
результат операции:
最小值=1.609375
函数值=-3.047189552275773
О переменных данных в python. Результат первого запуска заведомо неверный, поэтому используется отладка. Получается, что mid1 всегда был равен 1, а не 1,5, поэтому я начал понимать переменные данных. Сначала я догадался, что все переменные в питоне по умолчанию являются целыми числами, но по результатам дихотомии понял, что это предположение неверно, поэтому не обязательно менять формат переменных всего файла. Поэтому просто добавьте число с плавающей запятой перед формулой mid1, и результат будет отображаться как 1,5. Но если вся формула заключена в () и впереди добавлено число с плавающей запятой, результат все равно будет 1. Однако формат данных python определяется в соответствии с вводом, то есть, если ваш ввод является целым числом, то результат вычисления, непосредственно связанный с ним, должен быть целым числом, и это все еще целое число, которое не использует нести. До того, как два метода +float/+.0 не использовались, mid1~3 были целыми числами.
left = 1.0
right = 2.0
mid1 =(left+right) / 2
Или больше не добавляйте float перед mid1, просто нажмите точку после ввода
Метод Фибоначчи
Код реализации:
def fibonacci(n):
i=0
a = 0
b = 1
for i in range(n):
i=i+1
c = a+b
a = b
b = c
return c
def bn(x):
ert = x**2 - 6*x + 2
return ert
z = 2
p = 0
left = 0.00000
right = 10.00000
L1 = right - left
while z < 100:
m = fibonacci(z)
l = L1/m
k = 1.000/m
if k < 0.03:
print("n=%s,Fn=%s"%(z,m))
L2 = l*fibonacci(z-1)
t = left + L2
r = right -L2
while p < 3:
p = p + 1
l3 = t - r
e= bn(t)
o = bn(r)
if e>o :
right = t
t = r
r = left + l3
else:#o>e
left = r
r = t
t = right - l3
break
else:
z = z + 1
okk=(left+right)/2
okky=bn(okk)
print(left)
print(right)
print("极小值x=",okk)
print("极小值y=",okky)
золотое сечение
Код реализации:
def gold(x):
gg= x**2 - 6*x + 9
return gg
left = 1
right = 7
ans = 0.4
a = left + 0.618 * (right - left)
b = left + 0.382*(right - left)
gga = gold(a)
ggb = gold(b)
i = 0
while i < 7:
print("i=%s" % i)
print("left=%s,right=%s" % (left, right))
print("x左=%s,x右=%s" % (a, b))
print("y左=%s,y右=%s" % (ggb, gga))
c = right - left
if c > 0.4:
i = i + 1
if gga > ggb:
right = a
a = b
b = left + 0.382*(right - left)
gga = ggb
ggb = gold(b)
else:#gga<ggb
left = b
b = a
a = left + 0.618 * (right - left)
ggb = gga
gga = gold(a)
else:
break
Косвенный метод - квадратичная интерполяция
Код реализации:
def yy(x):
y=x**4-4*x**3-6*x**2-16*x+4
return y
def xing(xm1,xm2,xm3,fm1,fm2,fm3):
yxxx=0.5000*((xm2**2-xm3**2)*fm1+(xm3**2-xm1**2)*fm2+(xm1**2-xm2**2)*fm3)/((xm2-xm3)*fm1+(xm3-xm1)*fm2+(xm1-xm2)*fm3)
return yxxx
x1 = -1.0000
f1 = yy(x1)
x3 = 6
f3 = yy(x3)
x2 = 0.50000*(x1+x3)
f2 = yy(x2)
xp = xing(x1,x2,x3,f1,f2,f3)
fp = yy(xp)
a = abs(xp-x2)
while abs(xp-x2) > 0.05000:
a = abs(xp - x2)
if xp > x2:
if fp > f2:
x3=xp
f3=fp
xp = xing(x1, x2, x3, f1, f2, f3)
fp = yy(xp)
print("ans=%s" % a)
print("left=%s,right=%s" % (x1, x3))
print("x*=%s,fp*=%s" % (xp, fp))
print("x2=%s,f2=%s" % (x2, f2))
print("******************")
else:#f2>fp
x1 = x2
f1 = f2
x2 = xp
f2 = fp
xp = xing(x1, x2, x3, f1, f2, f3)
fp = yy(xp)
print("ans=%s" % a)
print("left=%s,right=%s" % (x1, x3))
print("x*=%s,fp*=%s" % (xp, fp))
print("x2=%s,f2=%s" % (x2, f2))
print("******************")
else:#xp<x2
if fp > f2:
x1 = xp
f1 = fp
xp = xing(x1, x2, x3, f1, f2, f3)
fp = yy(xp)
print("ans=%s" % a)
print("left=%s,right=%s" % (x1, x3))
print("x*=%s,fp*=%s" % (xp, fp))
print("x2=%s,f2=%s" % (x2, f2))
print("******************")
else:
x3 = x2
f3 = f2
x2 = xp
f2 = fp
xp = xing(x1, x2, x3, f1, f2, f3)
fp = yy(xp)
print("ans=%s" % a)
print("left=%s,right=%s" % (x1, x3))
print("x*=%s,fp*=%s" % (xp, fp))
print("x2=%s,f2=%s" % (x2, f2))
print("******************")
Эта формула выглядит громоздкой, поэтому будьте внимательны при ее написании. В прошлый раз я поставил 2 под точкой с запятой, и результат очень большой, поэтому лучше преобразовать его в 0,5 (PS: не забывайте о длинной реке 0). Хотя код очень длинный, это в основном потому, что в нем слишком много отпечатков. Я намеревался печатать в начале, и в конечном результате не будет последней части.
Косвенный метод - метод Ньютона
Код реализации:
def fd(x):
y = 4*x**3-12*x**2-12*x-16
return y
def fdd(x):
ys = 12*x**2-24*x-12
return ys
i = 1
x0 = 3.00000
ans = 0.001
while i < 7:
fd0 = fd(x0)
fdd0 = fdd(x0)
if abs(fd0) > ans:
x1 = x0 - (fd0/fdd0)
x0 = x1
print("次数:%s,所得的值x:%s"%(i,x1))
i = i + 1
else:#fd0<0.001
print("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$")
print("Bingo!顺利通关!祝您学习愉快!")
print("Boss X=%s"%x0)
break
портал ресурсов
- Обратите внимание на публичный аккаунт [Быть программистом-тендером]
- Ответьте на [информация о python] [Осенний набор 2020] в фоновом режиме публичной учетной записи [Be a Tender Programmer], чтобы получить соответствующий сюрприз!
- Адрес блога, созданный мной:Блог Кошмара Назад
"❤️Спасибо всем"
- Поставьте лайк и поддержите его, чтобы больше людей увидело этот контент
- Вы можете поделиться со мной своими мыслями в области комментариев, и вы также можете записать свой мыслительный процесс в области комментариев.