一维搜索优化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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值