许可优化
产品
解决方案
服务支持
关于
软件库
当前位置:服务支持 >  软件文章 >  Matlab优化入门指南,助你快速上手

Matlab优化入门指南,助你快速上手

阅读数 70
点赞 0
article_banner

新手笔记,如有错漏,恳请指正。

这段Matlab优化入门的课程,让我对“Matlab就是一个巨大的计算器”这句话有了更具象的认识。只要告诉Matlab要干什么类型的事(优化)、实现什么目的(目标)、能用到哪些参数(变量)、不能超过什么范围(约束),再告诉Matlab“就这些了,开始(求解)吧”,最后再检查一下答案是否合理(评估),就可以完成一个基础的优化任务。

整体流程

  • 创建一个空优化模型optimproblem(告诉Matlab要开始干优化的活了,让它自己准备各种工具)
  • 设置优化变量optimvar(告诉Matlab哪些是它可以动用、以实现目标的)
  • 设置优化目标方程Objective (告诉Matlab最后的目标是什么,默认会求目标函数的最小值)
  • 添加各种约束constrains (避免不合理的解决方案)
  • 求解(让Matlab算算优化变量取什么值可以实现目标)
  • 检查答案evaluate

示例一:最短距离(无约束)

背景:已知三个商店坐标,求工厂坐标使得距离总和最短,不考虑路线障碍。

创建空模型optimproblem

并在"Description"后面写一个给自己看的描述

prob = optimproblem("Description","Factory Location")
show(prob)%看看这个定义的空模型长什么样

设置优化变量optimvar

varname=optimvar("varname")变量比较少时,可以这样单个指定。多时,见示例二。

把坐标x,y设成优化变量。第三步设置目标方程后,这些变量会存进模型里。

x = optimvar("x")
y = optimvar("y")

设置目标函数Objective

X = [5 40 70]; Y = [20 50 15];%已知三个商店的坐标
d = sqrt((x-X).^2 + (y-Y).^2)%每个商店和工厂距离的表达式
dTotal = sum(d)%总距离
prob.Objective = dTotal%把这个总距离设置成目标

求解问题solve(非线性目标要给变量初始值)

initialGuess.x = 10%给初始值
initialGuess.y = 15
[sol,optval]=solve(prob,initialGuess)%变量结果,对应的目标函数值]=solve(模型,初始值套装)
xOpt=sol.x%把变量结果拿出来看看
yOpt=sol.y
scatter(xOpt,yOpt)

检查结果evaluate

dTotalEval=evaluate(dTotal,sol)%求解时的optval也可以用evaluate得到

示例二:最佳搭配(线性约束)

背景:16种早餐,探索如何搭配,使得花费最少的同时满足营养。

创建空模型optimproblem

prob=optimproblem("Description","An Optimal Breakfast")

设置优化变量optimvar

创建16种食物的各自份数servings,作为优化变量,这些份数最小值是0

servings=optimvar("servings",16,"LowerBound",0)%把示例一的单个变量粘过来对比:x =optimvar("x")

设置目标函数Objective(花费最少)

C=food.Price.*servings
prob.Objective=C

求解问题solve(线性目标无需变量初始值)

[sol,optval]=solve(prob)
optval=0%没有设定约束条件,什么都不买花费最少,没毛病。

设置约束constrains

1.等式约束(总共要350卡路里)

cals=food.Calories.*servings%卡路里向量,这里还没求解,只是构建目标所以是servings
totalCals=sum(cals)%卡路里总和
prob.Constraints.calories = totalCals == 350%模型.约束.约束名=约束表达式==设定值

再次求解solve

[sol,optval]=solve(prob)
optServings=sol.servings%看看这次每种食物多少份,这里求解完毕了所以是sol.servings
bar(food.Name,optServings)%柱状图更明显

检查结果evaluate

check = evaluate(totalCals,sol)
caloriesPerDollar=food.Calories./food.Price
bar(food.Name,caloriesPerDollar)

2.不等式约束(蛋白质等不少于。。)

这里和等式约束基本差不多

Protein=food.Protein.*servings
totalProtein=sum(Protein)
prob.Constraints.protein = totalProtein >= 15
sol2=solve(prob)
bar(food.Name,sol2.servings)
optProtein=evaluate(totalProtein,sol2)

示例三:最佳搭配(综合示例)

背景:

治疗癌细胞的同时使得健康细胞受到的辐射最小,并且脊髓细胞辐射值不能超过7。

治疗的方式是把癌细胞及附近划分成4*4的网格,水平和垂直方向各有4个可调强度射线发射器。射线穿透细胞后,强度会减小。小射束传递到任何细胞的剂量是该射束的强度和该细胞位置中的值的乘积。

创建空模型optimproblem

prob=optimproblem("Description","Radiation Therapy Optimization")

设置优化变量optimvar

I=optimvar("I",8,"LowerBound",0)

设置目标函数Objective

d=[10 7 3 8 8 5 9 10]'
D=sum(d.*I)
%%d=[10 7 3 8 8 5 9 10]
%%D=d*I%%d是行向量的话,由于I是列向量,通过矩阵乘法计算直接求和了
prob.Objective = D;

设置约束constrains

prob.Constraints.spinal = 2*I(3)+2*I(7) <= 5;%脊髓I小于5

prob.Constraints.A = 3*I(2)+3*I(6) >= 7;%四个癌细胞I大于7
prob.Constraints.B = 3*I(3)+2*I(6) >= 7;
prob.Constraints.C = 4*I(3)+2*I(5) >= 7;
prob.Constraints.D = 2*I(4)+I(7) >= 7;

求解问题solve

sol = solve(prob)
bar(sol.I)

检查结果evaluate

spinalCordDose = 2*I(3) + 2*I(7)
check = evaluate(spinalCordDose,sol)%注意一下下面这样是不对的

基础知识点

  • 创建空模型:prob = optimproblem("Description","Factory Location")
  • 设置单个优化变量:varname=optimvar("varname")
  • 设置多个优化变量:servings=optimvar("servings",16,"LowerBound",0)
  • 设置目标函数:prob.Objective = dTotal
  • 非线性目标要给变量初始值:initialGuess.x = 10
  • 求解solve:[sol,optval]=solve(prob,initialGuess)%[变量结果,对应的目标函数值]=solve(模型,初始值套装)
  • 等式约束:prob.Constraints.calories = totalCals == 350%模型.约束.约束名=约束表达式==设定值
  • 检查计算结果:check = evaluate(要求的表达式,解的名称)
  • 变量和数组运算的写法:d = sqrt((x-X).^2 + (y-Y).^2)
  • 五种约束
  • 按元素运算符.*, C=food.Price.*servings
  • 矩阵乘法求和:行向量*列向量
  • 柱状图:bar(类别)

优化入门之旅 | 自定进度在线课程 - MATLAB & Simulink


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

武汉格发信息技术有限公司,格发许可优化管理系统可以帮你评估贵公司软件许可的真实需求,再低成本合规性管理软件许可,帮助贵司提高软件投资回报率,为软件采购、使用提供科学决策依据。支持的软件有: CAD,CAE,PDM,PLM,Catia,Ugnx, AutoCAD, Pro/E, Solidworks ,Hyperworks, Protel,CAXA,OpenWorks LandMark,MATLAB,Enovia,Winchill,TeamCenter,MathCAD,Ansys, Abaqus,ls-dyna, Fluent, MSC,Bentley,License,UG,ug,catia,Dassault Systèmes,AutoDesk,Altair,autocad,PTC,SolidWorks,Ansys,Siemens PLM Software,Paradigm,Mathworks,Borland,AVEVA,ESRI,hP,Solibri,Progman,Leica,Cadence,IBM,SIMULIA,Citrix,Sybase,Schlumberger,MSC Products...

相关文章
QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空