matlab 求解非线性规划
在matlab中,fmincon函数可以用于求解带约束的非线性多变量函数的最小值,即可以用来求解非线性规划问题。
2. 基本语法
[x, fval] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon, options)
(1)编写 M 函数 fun1.m 定义目标函数:
function f = fun1(x); f = x(1).^2 + x(2).^2 + x(3).^2 + 8;
(2)编写 M 函数 fun2.m 定义非线性约束条件:
function [g, h] = fun2(x); g = [-x(1).^2+x(2)-x(3).^2 x(1)+x(2).^2+x(3).^3-20]; h = [-x(1)-x(2).^2+2 x(2)+2*x(3).^2-3];
(3)编写主程序函数
[x, y] = fmincon(fun1, rand(3, 1), [], [], [], [], zeros(3,1), [], fun2)
所得结果为:
1. minimize函数的寻找参数 在 python 的 scipy.optimize 库中包含该函数的替代函数 minimize() ,该函数的使用与 matlab 的 fminunc 函数有些不同,下面总结下,自己在使用的过程中遇到的问题。
# 这是其声明,我认为去查看函数的说明可以达到事半功倍的效果,千万别忽略 def minimize(fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None):
着重介一些重要参数代表什么:
The objective function to be minimized. fun(x, *args) -> float where x is an 1-D array with shape (n,) and args is a tuple of the fixed parameters needed to completely specify the function.
意思就是损失函数在定义时,**theta 必须为第一个参数且其shape必须为(n, )**即一维数组。在计算损失函数的时候用到的其他参数以元组的形式传入到 args 参数中(其他参数具体指 X,Y,lambda 等),最后返回损失的值,可以为数组形式,也可以为一个实数.
2.minimize求解约束函数最小值
1.计算 1/x+x 的最小值 # coding=utf-8 from scipy.optimize import minimize import numpy as np #demo 1 #计算 1/x+x 的最小值 def fun(args): a=args v=lambda x:a/x[0] +x[0] return v if __name__ == "__main__": args = (1) #a x0 = np.asarray((2)) # 初始猜测值 res = minimize(fun(args), x0, method=SLSQP) print(res.fun) print(res.success) print(res.x)