一维搜索优化python

黄金分割法

def f(x):
    return x ** 3 - 2 * x + 1
def run(a,b,e):
    x1 = a + 0.382 * (b - a)
    x2 = a + 0.618 * (b - a)
    while abs(b-a)>e:
        if f(a)<f(b):
            b=x2
            x2=x1
            x1=a + 0.382 * (b - a)
        else:
            a=x1
            x1=x2
            x2=a + 0.618 * (b - a) 
    return a,b
run(0,2,0.002)
(0.8160020378087369, 0.8174630366839891)

二分法

def f(x):
    return x ** 3 - 2 * x + 1
def f1(x):
    return 3*(x ** 2) - 2 
def run(a,b,e):
    if f1(a)*f1(b)<0:
        while b-a>e:
            x0=0.5*(a+b)
            if f1(a)*f1(x0)<0:
                b=x0
            if f1(b)*f1(x0)<0:
                a=x0 
        return x0
    else:
        print ('无法使用二分法')
run(0,2,0.004)
0.81640625

牛顿法

from sympy import *

# 函数求导
x = symbols('x')#注意symbols与Symbol
def f(x):
    return x ** 4- 4*x ** 3 -6*x**2-16*x+4
f_d=diff(f(x),x)
print('一阶导=',f_d)
s_d=diff(f_d,x)
print('二阶导=',s_d)
一阶导= 4*x**3 - 12*x**2 - 12*x - 16
二阶导= 12*x**2 - 24*x - 12
def run(x0,e):
    while abs(f_d.subs({
    
    x:x0}))>e:
        x0=x0-(f_d.subs({
    
    x:x0}))/(s_d.subs({
    
    x:x0}))
    return str(float(x0))#要加str float
run(6,0.01)
'4.000046976980266'
from sympy import *

x = symbols("x")  # 符号x,自变量
f_x = x ** 4 - 4*x ** 3-6*x**2-16*x+4 #公式
# 求一阶导数
first_grad = diff(f_x,x)
print("one_grad=",first_grad)  # one_grad= 4*x**3 - 12*x**2 - 12*x - 16
# 求二阶导数
second_grad = diff(first_grad,x)
print("second_grad=",second_grad)  # second_grad= 12*x**2 - 24*x - 12
one_grad= 4*x**3 - 12*x**2 - 12*x - 16
second_grad= 12*x**2 - 24*x - 12
from sympy import *

# 函数求导
x = Symbol('x')
def f(x):
	return x ** 3 - 2 * x + 1
a = diff(f(x), x)
print(a)

3*x**2 - 2

猜你喜欢

转载自blog.csdn.net/qq_44425179/article/details/130162405