词条 | 鞍点 |
释义 | 鞍点(Saddle point)在微分方程中,沿着某一方向是稳定的,另一条方向是不稳定的奇点,叫做鞍点。在泛函中,既不是极大值点也不是极小值点的临界点,叫做鞍点。在矩阵中,一个数在所在行中是最大值,在所在列中是最小值,则被称为鞍点。在物理上要广泛一些,指在一个方向是极大值,另一个方向是极小值的点。 详细介绍广义而说,一个光滑函数(曲线,曲面,或超曲面)的鞍点领域的曲线,曲面,或超曲面,都位于这点的切线的不同边。 参考右图,鞍点这词来自于不定二次型x2-y2的二维图形,像马鞍:x-轴方向往上曲,在y-轴方向往下曲。 检验二元是函数F(x,y)的驻点是不是鞍点的一个简单的方法,是计算函数在这个点的黑塞矩阵:如果黑塞矩阵的行列式小于0,则该点就是鞍点。例如:函数z = x2 − y2在驻点(0,0)的黑塞矩阵是: |2 0 | |0 -2| 我们可以看到此矩阵有两个特征值2,-2。它的行列小于0,因此,这个点是鞍点。然而,这个条件只是充分条件,例如,对于函数z = x4 − y4,点(0,0)是一个鞍点,但函数在原点的黑塞矩阵是零矩阵,并不小于0。如右图,一维鞍点看起来并不像马鞍!在一维 维空间里,鞍点是驻点.也是反曲点点。因为函数图形在鞍点由凸转凹,或由凹转凸,鞍点不是区域性极点。 思考一个只有一个变数的函数。这函数在鞍点的一次导数等于零,二次导数换正负符号.例如,函数 就有一个鞍点在原点。 思考一个拥有两个以上变数的函数。它的曲面在鞍点好像一个马鞍,在某些方向往上曲,在其他方向往下曲。在一幅等高线图里,一般来说,当两个等高线圈圈相交叉的地点,就是鞍点。例如,两座山中间的山口就是一个鞍点。 C语言求鞍点代码#include "stdio.h" #include "conio.h" #include "malloc.h" #define TRUE 1 #define FALSE 0 #define OK 0 #define ERROR 1 #define MAXX 80 void Print(int * const pMatrix, const int m, const int n); void Input(const int * const pm, const int * const pn); void CreatTureMatrix(int ** const pMatrix,int ** const pTrueMatrixconst, const int m, const int n); OutPrint(int ** const pMatrix, int ** const pTrueMatrix, const int m, const int n ); int main(void) { system("cls"); { const int m = FALSE, n = FALSE; Input(&m, &n); { int * pMatrix = NULL, * pTrueMatrix = NULL; CreatTureMatrix(&pMatrix, &pTrueMatrix, m, n); printf("\Matrix is :\"); Print(pMatrix, m , n); printf("\Saddle point Ture Matrix is :\"); Print(pTrueMatrix, m, n); OutPrint(&pMatrix, &pTrueMatrix, m, n); } } getch(); return (OK); } void Print(int * const pMatrix, const int m, const int n) { int * p = NULL; for(p = pMatrix; p < pMatrix + m*n; ++p) { printf("%5d", *p); if( !( (p - pMatrix)%n- (n-1) ) ) {printf("\"); } } } void Input(const int * const pm,const int * const pn) { printf("Please enter a matrix of rows, columns: "); { int flag = TRUE; while(flag) { if(scanf("%d%d", pm, pn) - 2) { flag = TRUE; printf("Worry enter,retry!\"); fflush(stdin); } else if( (*pm<=0 || *pm>=10) && (*pn<=0) || (*pn>=10) ) { flag = TRUE; printf("Enter Big or small,retry!\"); } else {flag = FALSE;} } } } void CreatTureMatrix(int ** const pMatrix,int ** const pTrueMatrix, const int m, const int n) { *pMatrix = (int *)malloc( m*n*sizeof(int) ); *pTrueMatrix = (int *)calloc( m*n,sizeof(int) ); { int *p = NULL; for(p = *pMatrix; p < *pMatrix + m*n; ++p) {scanf("%d",p);} } { int * p = NULL; for(p = *pMatrix; p < *pMatrix + m*n; p += n) { int * pMaxj = p; { int * q = NULL; for(q = p + 1; q < p + n; ++q) { if(*q > *pMaxj) {pMaxj = q;} } } { int * q = NULL; for(q = pMaxj; q < p + n; ++q) /*此处处理所有(不严格)最大值*/ { if( !(*q - *pMaxj) ) { int * r = NULL; for( r = *pMatrix + (q - *pMatrix)%n ;(r < *pMatrix + m*n) && (*r >= *pMaxj) ;r += n ); if( r >= (*pMatrix + m*n) ) {*(*pTrueMatrix + (q - *pMatrix)) = 1; } } } } } } } OutPrint(int ** const pMatrix, int ** const pTrueMatrix, const int m, const int n ) { int count = 0; int * p = NULL; printf("\Saddle point is :\"); for(p = *pTrueMatrix; p < *pTrueMatrix + m*n; ++p) { if(*p) { printf("Matrix[%d][%d] = %3d, " , (p - *pTrueMatrix)/n, (p - *pTrueMatrix)%n , *(*pMatrix + (p - *pTrueMatrix)) ); ++count; } } free(*pMatrix); *pMatrix = NULL; free(*pTrueMatrix); *pTrueMatrix = NULL; if(count) { const int xPos = wherex(), yPos = wherey(); if(xPos - 1) {gotoxy(xPos - 2, yPos); } else {gotoxy(MAXX - 1, yPos - 1); } printf("."); } /*此处TC一类特有的函数gotoxy()*/ else {printf("It is not exist!\"); } } |
随便看 |
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。