对于线性规划与需要用到的MATLAB知识的一些个人总结与理解

本文大致讲了这些内容:

  1. MATLAB一些函数的介绍与使用方法
  2. 《数学建模算法与应用》中某些题目中的注意事项与总结

MATLAB一些函数的介绍与使用方法

  • Inf 为无穷大量

  • sum函数优先加列

    sum(A,2) 是每一行相加,最后输出为一个列向量,2 的含义是二维的意思, 那么1就是默认第一列相加,那么输出的就是行向量。

./ .* .\

对于以上符号, 在实数,单个数的运算之中是没有什么区别的 ,但是在向量和矩阵之间就有了一些区别。比如说, 两个相同的行向量相乘是不可行的, 但是使用了.*就是里面的元素进行相乘, 就可以了, 还有‘/’ ‘\’ ,想象成分式的形式就可以了。
---------------------关于转置的使用-----------------------------------------
matlab默认的矩阵转置是共轭转置,是对复数进行操作的。
求共轭转置矩阵的指令为A’
非共轭转置矩阵的指令为A.‘,相当于conj(A’),即转置。

当A为实数矩阵时,A’和A.‘没有区别,但当A是复数矩阵时,就会有区别,A.‘相当于conj(A’)。一般来说,没有特殊的要求的话,对复数的转置操作都是用A’,
即共轭转置,因为共轭转置更加自然,对于复数做内积,是必须要共轭转置的。

find函数的用法: 查找非零元素的索引和值
把索引求出来, 再套回原来的矩阵 或者向量。 这样的话, 我们的操作空间就是在find函数上添加一些什么样的条件,最后
套回去取值就OK了。


  • rem函数,
    r = rem(a,b) 返回 a 除以 b 后的余数,其中 a 是被除数,b 是除数。此函数通常称为求余运算。

  • lower()和 upper()函数和Python的用法一样! 但是要输入字符串字母才可以。

  • input()函数 规定使用字符串方法: input('Please: ', ‘s’)

  • fix() 函数 返回一个小于输入值的整数!!!

  • num2cell()可以将数值结构转化为空间结构, num2cell(1:3) ==>> [1] [2] [3]
    num2str 将数字转换为字符数组

  • strcat 函数 水平串联字符串 s = strcat(s1,…,sN) 水平串联 s1,…,sN。每个输入参数都可以是字符数组、字符向量元胞数组或字符串数组. 动手试一试, 比较简单。就是简单的将字符串拼接到一起,输入指定的字符串即可,但是若是直接输入数字,会输出制表符(空格),需要用字符串的形式

  • int2str 顾名思义, 将整数转化为字符串。和上面的strcat 结合,能够添加一些标号,这在图论中有所应用。

  • 建议函数文件名与函数名统一,倘若不相同, 则matlab自动忽略函数名, 重视与函数文件名对比学习, 与Python不同的是, return语句在matlab中是自动结束函数的执行,这一点需要注意!!它会自动返回。

  • 函数的调用格式:[输出实参表]= 函数名(一般等于文件名)(输入实参表)!!!!!这里实参表可以与定义函数的实参表不同,意思就是在定义函数哪里先定义好空间, 这样在调用时
    就可以直接调了!

在定义函数时 ,有:
function 输出形参表=函数名(输入形参表)

这里就涉及到一个理解的问题了, 加上一句, 当我们想要得到的数据(最终结果)多于一个时, ==》》[a,b,c]=f(x)
可以这样理解, 变量名字虽然可以不一样, 但是最后还是和输出形参表等价的。且需要注意, 形参形参, 是需要参与到后面执行的语句之中去的,
即要到群众中去,参考:

function [s,c]=f_oral(r)  % r作为形参是调用的输入选项
s =pi*(r^2);
c=2*pi*r;    %%% 这里s,c 都要下沉到下面的计算公式中去, 最后的实参作为结果可以与形参不同, 但是这里还是要一致的。 

%return

函数调用时输出的结果即将函数调用后赋给的f,即使定义函数时下沉到函数体中的变量。

匿名函数!!!
定义:函数句柄变量=@(匿名函数输入参数)匿名函数表达式。
f=@(x,y)x2+y2
f(3,4)

:::也可以对已有的函数进行操作, 加上@符号后, 属于是把原来已有的函数给操控了。

##%%%@@递归调用, 调用自己可还行。
直接递归。 间接递归: 通过一个媒介函数,在媒介函数中在调用自己。

在命令窗口中 , 也需要定义全局变量。
-------------------我是一条关键的分界线---------------------------------------------------------------------

实战基础与练习与注意事项:

模型整理: ①线性规划模型(Linear Programming):
对于决策变量的理解:从因果关系上来看, 果对应的是决策变量, 即各种原材料, 人工的准备是因 ,最后产出的是果,

这里在现实中有一个时间的跨度, 比如说投资时要考虑一系列影响收益的因素,风险率啊, 收益率啊,等等 ,最后这些都妥了之后

就可以进行资金的投资了, 那么这里投资的不同产品的资产的量就是决策变量, 这是从所谓的因果关系上得到来的结果。

还可以这样理解, 决策变量即是决定变量, 是老大, 一切是为了得到它们, 一切的准备是为了得到这个,就拿产量来举例即可。
并且,产量有了,那么这就能够决定一些准备的材料了, 总之, 决策变量是老大!!

一般步骤:
:决策变量,问题中要解决的未知量;目标函数, 是关于决策变量的函数,由决策变量组成,我们的目的一般是求它的最大值, 最小值;
约束条件:不等式。
MARLAB化:
方法:[x, fval] = linprog(f, A, b) %% 先添加两个约束矩阵的两头。A是约束矩阵, b是列向量。还有f作为决策变量的伴随值,同样作为列向量添加, matlab
会自动转置为行向量和决策变量相乘。 x返回决策变量 ,fval返回最优值。


[x,fval] = linprog(f,A, b, Aeq,Beq)  有就添加, 等式约束矩阵的两头!
% 若还有,在加,具体到时候再看
[x,fval] = linprog(f, A,b ,Aeq, Beq, lb, ub);  

总结来说就是 前三个是必须的 , 后面的视情况而定 。

当我们使用[}放置多个约束条件时 ,一定都是同向小于某个数, 不可以一个大于一个小于, 但是单独放置应该可以吧?

------------------------------plot 函数----------------------------------------

title 函数中 Latex 语法:
\geq \leq 大于等于,小于等于, \bf \it \rm 加粗, 倾斜 正体
一般latex语言要加上 {} 符号才行。
x1 x2 > X_{1}{\geq}X_{2}
α
=>??
β
=> \beta
w====>\omega
pi -----> \pi

--------其他辅助绘图工具--------------------
grid on off 加不加网格线
box on off 加不加边框
axis 自定义坐标轴, 前四个选项是二维取消的xy 的最小最大值的范围。
axis([-0.1,0.1,1,1]);

subplot hold on 两个函数 的用法;
前者是分割, 实际意义更大, 后者是保持上一个图形不被刷新。

《数学建模算法与应用》中某些题目中的注意事项与总结

找到转折点之后, 我们想要得到具体的投资的金额, 那么就需要用到find()函数了, 前置知识已经讲过了,那么从已经设定好的X中抽取我们需要的最优的x的值, 那么做到这一点就必须在脑子里对X矩阵的形状有大致了解, 从纸上画一下就好

X=[]
xx=sol.x;
X=[X;xx'];

易知sol.x默认是列向量, 那么对xx取转置就好了, 然后灵性的在X中加上一个; 符号, 那么我们可以知道X矩阵是如何生成的了 ,它是一行一行添加的, 每一次的循环都把xx的值添加到了这个矩阵之中。
有了这些知识, 再配合find()函数就可以取出来需要的值了。

2021年8月30日 图论

算是Dijkstra算法的核心函数, shortestpath()函数, 其作用是

两个单一节点之间的最短路径
P = shortestpath(G,s,t) 计算从源节点 s 处开始到目标节点 t 处结束的最短路径。如果图进行了加权(即 G.Edges 包含变量 Weight),则这些权重用作沿图中各边的距离。否则,所有边距离都视为 1。
[P,d] = shortestpath(___) 还使用上述语法中的任何输入参数返回最短路径的长度 d。这是我们常常使用的调用函数的形式。

s= cellstr(strcat('v',int2str([1:11]')));
G= graph(a,s,'Upper');
[p,d] = shortestpath(G,1,11);
h = plot(G, 'EdgeLabel',G.Edges.Weight); % 绘制无向图
% 突出highlight最短路径
highlight(h,p,'EdgeColor','r','LineWidth',2)

其中highlight函数用时自行查阅即可,十分简单,个人感觉掌握这一种使用方法就可以了,毕竟只是完成求解之后的辅助。而plot函数中的一些参数也就照葫芦画瓢,很容易猜测G.Edges.Weight就是突出无向图的权重,而前面的EdgeLabel就是类似python字典中 的键值对了,前面是属性后面是值或者具体的操作。

你可能感兴趣的:(MATLAB,算法)