matlab求两向量夹角_收藏备用|如何用MATLAB求解数学规划模型

0f09b075eb1d2dc7f51a6cb32f24e494.png

在数学建模竞赛中,优化类题目是一个非常重要领域,占比一半以上。

优化类问题相对要难一些,主要就难在模型求解部分,本文来给大家介绍一些MATLAB求解数学规划模型的案例。

1、如何建立优化模型?

为了更直接地说明问题,我们先来看几个例子:

问题一:某工厂在计划期内要安排生产 I、II 两种产品,已知生产单位产品所需的设备台时及A、B两种原材料的消耗,如下表所示 

2e36c38b9f52570d0d86d9521e38d634.png

该工厂每生产一件产品I可获利2元,每生产一件产品II可获利3元。问应如何安排计划使该工厂获利最多?

所谓最优化问题是指使得问题中某一项指标“最优”的方案,”最优”包括:“最大”、“最小”、“最高”、“最低”、“最多”和“最少”等。解决优化问题第一步需要找到目标函数,也就是要找到“最优”;第二步需要寻找决策变量,也就是可以优化的变量,再通俗一点就是我们可以控制并使得目标函数更优的变量;第三步就是确定约束条件,在建模过程中比较难把握的就是约束条件,约束条件需要全面准确,否则会产生无穷多最优解或没有最优解,另外约束条件往往是对现实条件的数学刻画,对约束条件的合理简化也是比赛时候需要重点关注的地方。

在上面这个例子中,显然工厂利用就是目标函数,产品的生产计划就是决策变量,约束条件为原材料消耗和生产设备的使用时长,因此,其数学模型可表示为:

221a866817ac8b8b08d7ca025ab73c1f.png

其中,x1,x2表示产品1和产品2的生产数量。

进一步,我们可以来总结一下优化问题的一般建模步骤:

Step1:确定决策变量;

Step2:用关于决策变量的函数表示目标,并确定是求极小还是极大;

Step3:明确约束条件,并用关于决策变量的数学语言表示;

Step4:根据变量的物理性质研究变量是否有非负性。

特别说明一下step4,这是建模过程中非常容易遗忘的一个点,像上文例子的第四条约束就反应了决策变量的非负性,因为我们知道根据物理性质,产品生产个数不能为负,其实这条约束仍然不是很严谨,产品个数不仅不能为负,同时还应该为整数,第四条约束应该为非负整数约束。

2、MATLAB求解线性规划模型

简单来说,约束条件和目标函数都是线性的,称之为线性规划,MATLAB求解线性规划的标准形式表示为:

0ab2e1d97ad2d994030ff99dfbaa2dde.png

线性规划的求解可以通过MATLAB中的linprog函数来进行求解。其调用格式为:

[x,fval,exitflag] = linprog(fun,A,Aeq,beq,lb,ub,x0,options)

输入参数中,fun表示优化函数,x0表示优化的初始值,参数A、b为满足线性不等式约束的系数矩阵和结果向量,参数Aeq、beq为满足线性等式约束的系数矩阵和结果向量,lb、ub表示决策变量的取值范围,参数options为优化的各种属性,通过optimset函数进行设置。

输出参数中,x表示最优解,fval表示最优值,exitflag表示程序退出优化运算的类型,取值为-2,、-1、0、1、2、3、4、5,分别代表不同的异常类型,比如1表示程序运行成功。

62eae8b07c8eb3083298f96238ee37d0.png

例程:

c=[-3,-2];A = [2,1;3,4;-3,2];b = [3;7;2];lb = [0;0];ub = [10;10];

[x,fval,exitflag] = linprog(c,A,b,[],[],lb,ub)

输出结果:

67e69290dee17fbc07916f4f940ab191.png

3、MATLAB求解非线性规划模型

对于非线性无约束优化,在MATLAB中可以采用fminsearch函数和fminunc函数进行求解,其调用格式为:

[x,fval,exitflag,output] = fminsearch(fun,x0,options)

输入参数:fun表示需要优化的目标函数,x0表示执行优化的初始数值,参数options为有优化的各种属性。

输出参数:x表示最优解,fval表示最优解队形的函数值,exitflag表示退出运算的原因,1表示收敛于最优解,0表示函数迭代次数超过设定阈值,output为结构体变量,显示优化的有关信息。

[x,fval,exitflag,output,grad,hessian] = fminunc(fun,x0,options)

输出参数中grad表示函数在返回的最优解处的梯度,hessian为最优解处的hessian矩阵。

例:求解函数f(x) = 100(x2-x12)2+(1-x1)2

function f = myfun(x)

    f = 100*(x(2) - x(1)^2)^2 + (1-x(1))^2;

end

x0 = [-0,0];[x,fval,exitflag,output] = fminsearch(@myfun,x0)

ae9a43a37c350a969269af9b911870e3.png

约束条件下的优化问题比无约束条件的优化问题要复杂的多,种类也比较多。对不同类型的优化问题,MATLAB提供了不同的优化方法。其中常用的是fmincon函数,调用格式为:

[x,fval,exitflag,output] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,options)

例:

ace535aa3735dc7af0789cd713ff2c66.png

function f= optfun(x)

    f = -x(1)*x(2)*x(3);

End

x0 = [1,1,1];A = [1,2,2;0,1,0;0,0,1];b = [72;5;10];

[x,fval,exitflag,output] = fmincon(@optfun,x0,A,b)

843635e7fffd5ccf477ff42756f6e515.png

4、总结

本文介绍了优化问题的一般建模方法及MATLAB中求解线性规划和非线性规划的常用命令,对于非线性规划还可以采用基于梯度的算法、基于概率搜索的算法、遗传算法等进行求解,在后续的文章中会陆续进行介绍。

~相关文章~

数学建模中的优化问题

经典优化算法大合集(比赛备用,值得收藏)

优化算法系列——模拟退火算法(1)

优化算法系列——模拟退火算法(2)——0-1背包问题

优化算法系列——遗传算法原理

优化算法系列——遗传算法MATLAB实例

优化算法系列——粒子群算法

优化算法系列——蚁群算法

优化算法系列——贪心算法

优化算法系列——最速下降法

优化算法系列——牛顿法

优化算法系列——共轭梯度法

75634a9299a1877d80e4cb655c43b978.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MATLAB中,可以使用向量的点积和模长来计算向量组与向量之间的夹角。具体步骤如下: 1. 首先,将向量组和向量表示为列向量或行向量的形式。 2. 使用MATLAB中的dot函数计算向量组和向量的点积。 3. 使用MATLAB中的norm函数计算向量组和向量的模长。 4. 使用MATLAB中的acos函数计算点积除以模长的结果的反余弦值,得到夹角的弧度值。 下面是一个示例代码,演示了如何使用MATLAB求解向量组和向量之间的夹角: ```matlab % 定义向量组和向量 vector1 = [1, 2, 3]; vector2 = [4, 5, 6]; vector3 = [7, 8, 9]; vector = [10, 11, 12]; % 计算向量组和向量的点积 dot_product1 = dot(vector1, vector); dot_product2 = dot(vector2, vector); dot_product3 = dot(vector3, vector); % 计算向量组和向量的模长 norm1 = norm(vector1); norm2 = norm(vector2); norm3 = norm(vector3); norm_vector = norm(vector); % 计算夹角的弧度值 angle1 = acos(dot_product1 / (norm1 * norm_vector)); angle2 = acos(dot_product2 / (norm2 * norm_vector)); angle3 = acos(dot_product3 / (norm3 * norm_vector)); % 将弧度值转换为角度值 angle1_deg = rad2deg(angle1); angle2_deg = rad2deg(angle2); angle3_deg = rad2deg(angle3); % 输出结果 disp(['向量组和向量夹角1(弧度):', num2str(angle1)]); disp(['向量组和向量夹角1(角度):', num2str(angle1_deg)]); disp(['向量组和向量夹角2(弧度):', num2str(angle2)]); disp(['向量组和向量夹角2(角度):', num2str(angle2_deg)]); disp(['向量组和向量夹角3(弧度):', num2str(angle3)]); disp(['向量组和向量夹角3(角度):', num2str(angle3_deg)]); ``` 请注意,上述代码中的向量组和向量可以根据实际情况进行修改。此外,还可以使用其他MATLAB函数和方法来计算向量组和向量之间的夹角,具体取决于具体的需和数据结构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值