栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

数学建模导论:基于Python语言1.3笔记

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数学建模导论:基于Python语言1.3笔记

最近在跟着B站的平成最强假面骑士学习数学建模,我是想走python路径的,同时也是一个刚刚入门数学建模的小白,现将学习到1.3的笔记记录一下,顺带发现了一个错误并加以修正

 KKT

附上视频例题

视频代码复现:

from scipy.optimize import minimize
import numpy as np

def func(x):

    return 10.5+0.3*x[0]+0.32*x[1]+0.3*x[2]+0.0007*x[0]**2+0.0004*x[1]**2+0.00045*x[2]**2


cons=({"type":'eq','func':lambda x:x[0]+x[1]+x[2]-700})
b1,b2,b3=(100,200),(120,250),(150,300)
x0=np.array((180,230,290))
res=minimize(func,x0,method='BFGS',constraints=cons,bounds=(b1,b2,b3))
print(res)

运行结果如下:

翻译后发现是BFGS无法处理约束条件

在评论区回复后,假面骑士回复了我的消息,说可能是约束条件有冲突,让我使用不同的求解器去尝试一下

在csdn了一段时间后,了解了如何解决,在此感谢这篇文章的作者,我从他的代码段中找到了思路https://blog.csdn.net/sinat_17697111/article/details/81534935

即为,去掉bounds,给各参数赋上下限,在cons中手敲各参数的约束代码,如下

from scipy.optimize import minimize
import numpy as np

def fun(x):

    return 10.5+0.3*x[0]+0.32*x[1]+0.3*x[2]+0.0007*x[0]**2+0.0004*x[1]**2+0.00045*x[2]**2

x0min,x0max,x1min,x1max,x2min,x2max=100,200,120,250,150,300
#给三个变量赋上下限
cons=({"type":'eq','fun':lambda x:x[0]+x[1]+x[2]-700},
      {"type":'ineq','fun':lambda x : x[0] - x0min},
      {"type":'ineq','fun':lambda x : -x[0] + x0max},
      {"type":'ineq','fun':lambda x : x[1] - x1min},
      {"type":'ineq','fun':lambda x : -x[1] + x1max},
      {"type":'ineq','fun':lambda x : x[2] - x2min},
      {"type":'ineq','fun':lambda x : -x[2] + x2max})
# 约束条件 分为 eq 和 ineq
    #eq表示 函数结果等于0 ; ineq 表示 表达式大于等于0
    #tips:由于ineq为f(x)≥0,
    #所以在遇到上限时需要在等式左边加一个负号,由于f(max)≥f(x0),所以-f(x0)+f(max)≥0
x0=np.array((180,230,290))
res=minimize(fun,x0,method='SLSQP',constraints=cons)
print(res)

运行结果如下:

输出了正确结果

疑问: 源代码中函数定义为func,在改进代码中换成了fun,原因是当采用func时,会出现如下报错

 不知为何,将【func】换回【fun】后即可正常运行

请教一下各位

暑期编程PK赛 得CSDN机械键盘等精美礼品!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1015103.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号