【最优化】scipy.optimize.fmin.

文章首发于本人的个人博客

这代码借鉴了《Python科学计算》,进行了改动

import scipy.optimize as opt
import numpy as np

points=[]
def obj_func(p):
    x,y=p
    z=(1-x)**2+100*(y-x**2)**2
    points.append((x,y,z))
    return z

#偏导数,有些优化方法用得到,有些用不到
def fprime(p):
    x,y=p
    dx=-2+2*x-400*x*(y-x**2)
    dy=200*y-200*x**2
    return np.array([dx,dy])
init_point=(-2,-2)

#这两种优化方法没用到偏导
#result=opt.fmin(obj_func,init_point)
#result=opt.fmin_powell(obj_func,init_point)

#用到偏导的:
#result=opt.fmin_cg(obj_func,init_point,fprime=fprime)
#result=opt.fmin_bfgs(obj_func,init_point,fprime=fprime)
result=opt.fmin_tnc(obj_func,init_point,fprime=fprime)
#result=opt.fmin_l_bfgs_b(obj_func,init_point,fprime=fprime)

#其它
#result=opt.fmin_cobyla(obj_func,init_point,[])
print(result)


### 绘图
import pylab as pl
p=np.array(points)
xmin,xmax=np.min(p[:,0])-1,np.max(p[:,0])+1
ymin,ymax=np.min(p[:,1]),np.max(p[:,1])+1
Y,X=np.ogrid[ymin:ymax:500j,xmin:xmax:500j]
Z=np.log10(obj_func((X,Y)))
zmin,zmax=np.min(Z),np.max(Z)

pl.imshow(Z,extent=(xmin,xmax,ymin,ymax),origin="bottom",aspect="auto")
pl.plot(p[:,0],p[:,1])
pl.scatter(p[:,0],p[:,1],c=range(len(p)))
pl.xlim(xmin,xmax)
pl.ylim(ymin,ymax)
pl.show()

下面这2个优化方法的展示:

这里写图片描述

这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值