scipy-optimizer优化器

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import numpy as np
from scipy.optimize import minimize # 求出最小值 #
from scipy.optimize import leastsq  # 引入最小二乘法算法 #
import matplotlib as plt


def main():
     def rosen(x):
          return sum(100.0*(x[1:]-x[:-1]**2.0)**2.0+(1-x[:-1])**2.0)
     x0 = np.array([1.3,0.7,0.8,1.9,1.2])
     res = minimize(rosen,x0,method="nelder-mead",options={"xtol":1e-8,"disp":True})
#Nelder-Mead法,或称下山单纯形法,可做非线性函数极值以及曲线拟合程序。
#Nelder-Mead法是利用多面体来逐步逼近最佳点x*.设函数变量为n维,则在n维空间里
# 多面体有(n+1)个顶点.设x1,x2,...,xn+1为多面体的顶点,且满足:
#  f(x1)<=f(x2)<=...<=f(xn+1)#
# "xtol":1e-8,定义经度,"disp":True显示中间过程#
     print("ROSE MINI:",res.x)#res.x打印出其属性#
     def func(x):#x可能是一个数组#
          return (2*x[0]*x[1]+2*x[0]-x[0]**2-2*x[1]**2)
     def func_deriv(x):
          dfdx0=(-2*x[0]+2*x[1]+2)
          dfdx1=(2*x[0]-4*x[1])
          return np.array([dfdx0, dfdx1])
     cons=({"type":"eq","fun":lambda x: np.array([x[0]**3-x[1]]),"jac":lambda x:np.array([3.0*(x[0]**2.0),-1.0])},
           {"type":"ineq","fun":lambda x: np.array([x[1]-1]),"jac":lambda x:np.array([0.0,-1.0])})#计算机计算偏导数比较慢,直接给出提高运算速度#
     res=minimize(func,[-1.0,1.0],jac=func_deriv,constraints=cons,method='SLSQP',options={'disp':True})
     #目标函数 func 、取值范围-1到1、优化器# #
     print("RESTRICT:",res)
     from scipy.optimize import root
     def fun(x):
          return x+2*np.cos(x)
     sol = root(fun,0.1)
     print ("ROOT:",sol.x,sol.fun)



if __name__ == "__main__":
    main()
每次的最大感受就是数学基础的重要性,最近都在攻SQL,但想想还是应该把这一阶段的python小结一下。当然,学习PYTHON没有尽头。
 

猜你喜欢

转载自blog.csdn.net/zhangmary/article/details/79878329