鞍点(Saddle
小数点)在
微分方程中,沿着某一方向是稳定的,另一条方向是不稳定的
奇点,叫做鞍点。在
泛函中,既不是极大值点也不是极小值点的临界点,叫做鞍点。在矩阵中,一个数在所在行中是最大值,在所在列中是最小值,则被称为鞍点。在物理上要广泛一些,指在一个方向是极大值,另一个方向是极小值的点。
定义
广义而说,一个光滑函数(曲线,
曲面,或
超曲面)的鞍点
邻域的曲线,曲面,或超曲面,都位于这点的
切线的不同边。
示例
参考右图,鞍点这词来自于不定
二次型的二维图形,像马鞍:x-轴方向往上曲,在y-轴方向往下曲。
检验二元是函数的
驻点是不是鞍点的一个简单的方法,是计算函数在这个点的Hessian矩阵:如果
黑塞矩阵的
行列式小于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)
{
{
const int m = FALSE, n = FALSE;
Input(\u0026m, \u0026n);
{
int * pMatrix = NULL, * pTrueMatrix = NULL;
CreatTureMatrix(\u0026pMatrix, \u0026pTrueMatrix, m, n);
printf("\nMatrix is :\n");
Print(pMatrix, m , n);
printf("\nSaddle
小数点 Ture
基体 is :\n");
Print(pTrueMatrix, m, n);
OutPrint(\u0026pMatrix, \u0026pTrueMatrix, m, n);
}
}
getch();
}
void Print(int * const pMatrix, const int m, const int n)
{
int * p = NULL;
for(p = pMatrix; p \u003c pMatrix + m*n; ++p)
{
printf("%5d", *p);
if( !( (p - pMatrix)%n- (n-1) ) )
{printf("\n"); }
}
}
void Input(const int * const pm,const int * const pn)
{
printf("Please enter a
基体 of rows, columns: ");
{
int flag = TRUE;
while(flag)
{
if(scanf("%d%d", pm, pn) - 2)
{
flag = TRUE;
printf("Worry enter,retry!\n");
fflush(stdin);
}
else if( (*pm\u003c=0 || *pm\u003e=10) \u0026\u0026 (*pn\u003c=0) || (*pn\u003e=10) )
{
flag = TRUE;
printf("Enter Big or small,retry!\n");
}
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 \u003c *pMatrix + m*n; ++p)
{scanf("%d",p);}
}
{
int * p = NULL;
for(p = *pMatrix; p \u003c *pMatrix + m*n; p += n)
{
int * pMaxj = p;
{
int * q = NULL;
for(q = p + 1; q \u003c p + n; ++q)
{
if(*q \u003e *pMaxj)
{pMaxj = q;}
}
}
{
int * q = NULL;
for(q = pMaxj; q \u003c p + n; ++q) /*此处处理所有(不严格)最大值*/
{
if( !(*q - *pMaxj) )
{
int * r = NULL;
for(
r = *pMatrix + (q - *pMatrix)%n
;(r \u003c *pMatrix + m*n) \u0026\u0026 (*r \u003e= *pMaxj)
;r += n
);
if( r \u003e= (*pMatrix + m*n) )
{*(*pTrueMatrix + (q - *pMatrix)) = 1; }
}
}
}
}
}
}
OutPrint(int ** const pMatrix, int ** const pTrueMatrix, const int m, const int n )
{
int * p = NULL;
printf("\nSaddle
小数点 is :\n");
for(p = *pTrueMatrix; p \u003c *pTrueMatrix + m*n; ++p)
{
if(*p)
{
printf("
基体[%d][%d] = %3d, "
, (p - *pTrueMatrix)/n, (p - *pTrueMatrix)%n
, *(*pMatrix + (p - *pTrueMatrix)) );
}
}
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!\n"); }
}
参考资料
Warning: Invalid argument supplied for foreach() in
/www/wwwroot/newbaike1.com/id.php on line
362