алгоритм оптимизации реализации Python

искусственный интеллект алгоритм
алгоритм оптимизации реализации Python

дихотомия

Код реализации:

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], чтобы получить соответствующий сюрприз!
  • Адрес блога, созданный мной:Блог Кошмара Назад

"❤️Спасибо всем"

  • Поставьте лайк и поддержите его, чтобы больше людей увидело этот контент
  • Вы можете поделиться со мной своими мыслями в области комментариев, и вы также можете записать свой мыслительный процесс в области комментариев.