非线性规划(Python)

引入

        常见的收益率、空间运动、运输问题等问题,往往设计到\frac{1}{x}的形式,属于非线性,需要用到非线性规划。

非线性规划

        一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。

        模型特点

  •         至少一个变量时非线性。
  •         线性规划有求准确解的一般方法,且最优解只存在于可行域的边界上;而非线性规划还没有适合各种问题的一般解法,且其最优解(如果有)可能在其可行域的任意一点达到。
  •         对于建模来说,一般求近似解

        非线性规划模型的标准型

        min\ \ \ f(x)

        s.t.\left\{\begin{matrix} Ax\le b & Aeq\cdot x = beq(linear))\\ c(x) \le 0&Ceq(x)=0 (not\ linear)\\ lb\le x\le ub& \end{matrix}\right.

        Python代码

import numpy as np
from scipy.optimize import minimize


# 目标函数
def quadratic_objective(variables):
    return variables[0] ** 2 + variables[1] ** 2 + variables[2] ** 2 + 8


# 约束条件 constraint1 到 constraint4
def inequality_constraint_1(variables):
    return variables[0] ** 2 - variables[1] + variables[2] ** 2


def inequality_constraint_2(variables):
    return -(variables[0] + variables[1] ** 2 + variables[2] ** 2 - 20)


def equality_constraint_1(variables):
    return -variables[0] - variables[1] ** 2 + 2


def equality_constraint_2(variables):
    return variables[1] + 2 * variables[2] ** 2 - 3


# 边界约束 bounds
lower_bound = (0.0, None)
bounds = (lower_bound, lower_bound, lower_bound)

# 约束字典 constraints
constraint_1_dict = {'type': 'ineq', 'fun': inequality_constraint_1}
constraint_2_dict = {'type': 'ineq', 'fun': inequality_constraint_2}
constraint_3_dict = {'type': 'eq', 'fun': equality_constraint_1}
constraint_4_dict = {'type': 'eq', 'fun': equality_constraint_2}

constraints = (constraint_1_dict, constraint_2_dict, constraint_3_dict, constraint_4_dict)

# 初始化初始变量 initial_variables
initial_variables = np.array([0, 0, 0])

# 使用 minimize 函数求解优化问题
solution = minimize(quadratic_objective, initial_variables, method='SLSQP', bounds=bounds, constraints=constraints)
optimized_variables = solution.x

print('目标值: ' + str(quadratic_objective(optimized_variables)))
print('答案为')
print('x1 = ' + str(optimized_variables[0]))
print('x2 = ' + str(optimized_variables[1]))
print('x3 = ' + str(optimized_variables[2]))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值