(离散数学)输入一个关系矩阵,用C语言编程求出它的自反闭包,对称闭包和传递闭包
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(离散数学)输入一个关系矩阵,用C语言编程求出它的自反闭包,对称闭包和传递闭包相关的知识,希望对你有一定的参考价值。
其中传递闭包要求用两种方法实现
不好意思小弟刚进来,分不够,还请哪位高手帮个忙
#include<iostream.h>
template<class T>
void Warshall( T *a , int m , int n )
int i = 0,j = 0;
for( i = 0 ; i < n ; i++ )
for( j = 0 ; j < m ; j++ )
if( a[j][i] == 1 )
int k = 0;
for( int x = 0 ; x < n ; x++ )
a[j][k] = a[j][k] || a[i][k];
k++;
for( i = 0 ; i < m ; i++ )
for( j = 0 ; j < n ; j++ )
cout << a[i][j] << '\t';
cout<<endl;
void main()
int ai[4][4] = 0,1,0,0 , 1,0,1,0 , 0,0,0,1 , 0,0,0,0 ;
Warshall(ai,4,4);
数学基础系列----拉格朗日乘子法行列式矩阵基础
一、拉格朗日乘子法
1、通俗解释
给个函数:$Z=f(x,y)$如何求出它的极值点呢?有了前面的知识,简单来说直接求它的偏导不就OK了吗?
那现在假如说对这个函数加上一个约束条件呢?也就说现在假如有这样一个约束条件$2xy+2yz+2zx=S$,那该怎么样求出函数$Z(x,y,z)=xyz$的最大值呢?
在这样的约束条件下,到底什么点是我们想要的?
假如说我们现在有这样一座山峰,这座山峰的高度是$f(x,y)$,其中有一条曲线是$g(x,y) =C$。曲线镶嵌在山上,我们该如何找到曲线的最低点呢?
为了找到曲线上的最低点,首先就从最低的等高线(0那条)开始往上数。数到第三条,等高线终于和曲线有交点了(如上图所示)。因为比这条等高线低的地方都不在约束范围内,所以这肯定是这条约束曲线的最低点了。
而且约束曲线在这里不可能和等高线相交,一定是相切。因为如果是相交的话,如下图所示,那么曲线一定会有一部分在B区域,但是B区域比等高线低,这是不可能的。
两条曲线相切,意味着它们在这点的法线平行,也就是法向量只差一个任意的常数乘子(取为$-lambda $):$igtriangledown f(x,y)=-lambda igtriangledown g(x,y)$,其中$igtriangledown$表示偏导。
我们可以把上式的右边移到左边,并把常数移进微分算子然后得到:$igtriangledown f(x,y)+lambda igtriangledown g(x,y)=0$。
把这个式子重新解释一下,这个就是$f(x,y)+lambda g(x,y)$无约束情况下极值点的必要条件。简单来说,就是把带有约束条件下的求极值转化为无约束条件下的求极值。
2、使用方法
然后我们看下拉格朗日乘子法具体的使用方法。求解函数:$z=f(x,y)$在条件$varphi (x,y)=0$条件下的极值。
既然求极值,那就是令其偏导等于0。
构造函数$F(x,y)=f(x,y)+lambda varphi(x,y)$,其中$lambda$为拉格朗日乘数。如此,我们就可以得到下面的这个表达式
这样通过上面的方程组求解出来的(X,Y)就是极值点坐标。
拉格朗日乘子法一般用于自变量多于两个的条件下。
求解函数:$u=f(x,y,z,t) $在条件$varphi (x,y,z,t)=0,psi (x,y,z,t)=0$下的极值。
同理构造函数:$F(x,y,z,t)=f(x,y,z,t) +lambda _{1}varphi (x,y,z,t)+lambda _{2}psi (x,y,z,t)$。其中$lambda _{1},lambda _{2}$均为拉格朗日乘数,同样通过偏导为0以及约束条件求解极值点坐标。
3、例题
求函数$u=x^{3}y^{2}z$在约束条件x+y+z=12下的最大值。
同理构造函数:$F(x,y,z)=x^{3}y^{2}z+lambda (x+y+z-12)$。然后分别求偏导,得到如下表达式。
$left{egin{matrix}
F_{x}‘=3x^{2}y^{2}z+lambda =0
F_{y}‘=2x^{3}yz+lambda =0
F_{z}‘=x^{3}y^{2}+lambda =0
x+y+z=12
end{matrix}
ight.$
求解上面的方程组可以得到唯一驻点(6,4,2),这样的话最大值$u_{max}=6^{3}cdot 4^{2}cdot 2=6912$。
二、行列式
1、二阶行列式
首先来看看二元线性方程组的求解:$left{egin{matrix}a_{11}x_{1}+a_{12}x_{2}=b_{1} a_{21}x_{1}+a_{22}x_{2}=b_{2}end{matrix} ight.$
对上面这个方程组求解可得:$egin{matrix}(a_{11}a_{22}-a_{12}a_{21})x_{1}=b_{1}a_{22}-a_{12}b_{2} (a_{11}a_{22}-a_{12}a_{21})x_{2}=a_{11}b_{2}-b_{1}a_{21}end{matrix}$。
当$a_{11}a_{22}-a_{12}a_{21} eq 0$时方程组有唯一解:$x_{1}=frac{b_{1}a_{22}-a_{12}b_{2}}{a_{11}a_{22}-a_{12}a_{21}},x_{2}=frac{a_{11}b_{2}-b_{1}a_{21}}{a_{11}a_{22}-a_{12}a_{21}}$。
根据上面的解看起来好像有些规律呀
表达式$a_{11}a_{22}-a_{12}a_{21}$即为二阶行列式。
$D=egin{vmatrix}a_{11} & a_{12} a_{21} & a_{22}end{vmatrix}=a_{11}a_{22}-a_{12}a_{21}$。其中aij(i=1,2;j=1,2)称为元素。i代表行标,j代表列标。
2、三阶行列式
二阶看起来挺容易就算出来了,三阶的呢?
3、例题
计算$D=egin{vmatrix}1 & 2 & -4 -2 & 2 & 1 -3 & 4 & -2end{vmatrix}$的行列式。
三、矩阵
1、何为矩阵
某航空公司在A,B,C,D四城市之间开辟了若干航线,如图所示表示了四城市间的航班图,如果从A到B有航班,则用带箭头的线连接 A 与B。
如果说我们用表格的形式来表示这种关系并且用1和0来表示城市之间是否联通。
何为矩阵:输入的数据就是矩阵,对数据做任何的操作都是矩阵的操作了。
矩阵的组成:矩阵是由行和列来组成的:
矩阵的特殊形式:行向量与列向量。$egin{pmatrix}a_{1} & a_{2} & cdots & a_{n}end{pmatrix}$,$egin{pmatrix}a_{1} a_{2} vdots a_{n}end{pmatrix}$
2、行列式与矩阵的区别
方阵:行和列的数量一样就是方阵了,一般叫做n阶方阵。
下面介绍几种特殊的矩阵
同型矩阵和矩阵相等是一个事吗?
两个矩阵行列数相同的时候称为同型矩阵,例如$egin{pmatrix}1 & 2 2 & 3end{pmatrix}$与$egin{pmatrix}2 & 4 1 & 2end{pmatrix}$
在同型的前提下,并且各个元素相等,这就是矩阵相等了:
3、矩阵的基本运算
假如说有两个$M imes N$的矩阵$A=(a_{ij}),B=(b_{ij})$:
矩阵乘法的运算规律:
注意:矩阵的乘法是没有交换律的
以上是关于(离散数学)输入一个关系矩阵,用C语言编程求出它的自反闭包,对称闭包和传递闭包的主要内容,如果未能解决你的问题,请参考以下文章
编程实现:输入一个 n*n 的矩阵,求出两条对角线元素值之和。