#!/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没有尽头。