新手笔记,如有错漏,恳请指正。
这段Matlab优化入门的课程,让我对“Matlab就是一个巨大的计算器”这句话有了更具象的认识。只要告诉Matlab要干什么类型的事(优化)、实现什么目的(目标)、能用到哪些参数(变量)、不能超过什么范围(约束),再告诉Matlab“就这些了,开始(求解)吧”,最后再检查一下答案是否合理(评估),就可以完成一个基础的优化任务。
背景:已知三个商店坐标,求工厂坐标使得距离总和最短,不考虑路线障碍。
并在"Description"后面写一个给自己看的描述
prob = optimproblem("Description","Factory Location")
show(prob)%看看这个定义的空模型长什么样
varname=optimvar("varname")变量比较少时,可以这样单个指定。多时,见示例二。
把坐标x,y设成优化变量。第三步设置目标方程后,这些变量会存进模型里。
x = optimvar("x")
y = optimvar("y")
X = [5 40 70]; Y = [20 50 15];%已知三个商店的坐标
d = sqrt((x-X).^2 + (y-Y).^2)%每个商店和工厂距离的表达式
dTotal = sum(d)%总距离
prob.Objective = dTotal%把这个总距离设置成目标
initialGuess.x = 10%给初始值
initialGuess.y = 15
[sol,optval]=solve(prob,initialGuess)%变量结果,对应的目标函数值]=solve(模型,初始值套装)
xOpt=sol.x%把变量结果拿出来看看
yOpt=sol.y
scatter(xOpt,yOpt)
dTotalEval=evaluate(dTotal,sol)%求解时的optval也可以用evaluate得到
背景:16种早餐,探索如何搭配,使得花费最少的同时满足营养。
prob=optimproblem("Description","An Optimal Breakfast")
创建16种食物的各自份数servings,作为优化变量,这些份数最小值是0
servings=optimvar("servings",16,"LowerBound",0)%把示例一的单个变量粘过来对比:x =optimvar("x")
C=food.Price.*servings
prob.Objective=C
[sol,optval]=solve(prob)
optval=0%没有设定约束条件,什么都不买花费最少,没毛病。
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个可调强度射线发射器。射线穿透细胞后,强度会减小。小射束传递到任何细胞的剂量是该射束的强度和该细胞位置中的值的乘积。
prob=optimproblem("Description","Radiation Therapy Optimization")
I=optimvar("I",8,"LowerBound",0)
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;
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;
sol = solve(prob)
bar(sol.I)
spinalCordDose = 2*I(3) + 2*I(7)
check = evaluate(spinalCordDose,sol)%注意一下下面这样是不对的
.*, C=food.Price.*servings优化入门之旅 | 自定进度在线课程 - 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...