⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sancichazhi.c

📁 最优化课程中要用到的所有最优化算法
💻 C
字号:

                //////////////////////////////
                //////   最优化      /////////
                //////信号与信息处理 /////////
                //////    刘君       /////////
                //////06020810021009//////////
                //////////////////////////////

//此程序使用三次插值法,用于计算目标函数在给定精度的条件下的最小值//
#include <stdio.h>
#include <math.h>

/////////////////
#define  FUN  "pow(x, 4) + 2*x +4"
#define  X1   -2    //初始左点
#define  X2   +2    //初始右点
#define  H    0.1   //导数控制参数
/////////////////
float get_derivatives_1n( float x );   //用五点法求一阶导数
float fun( float x);
float process( float e, int *k );
////////////////
int main( void )
{
	float e;
	float x;
	char  input;
	int   k;
	float x1 = X1, x2 = X2;

	printf( "目标函数为:" );
	printf( FUN );
	printf( "\n" );
	printf( "初始点为:x1=%f, x2=%f\n", x1, x2 );

LOOP1:
	printf( "请输入允许误差 e=" );
	scanf( "%f", &e);
	fflush( stdin );
	
	x = process( e, &k );

	printf( "\n经过 %d 次迭代,目标函数最小值为: x=%f\n", k, x );

LOOP2:
	printf( "输入y继续计算,输入n退出程序:");
	scanf( "%c", &input );
	fflush( stdin );
	switch ( input )
	{
	case 'y':
		goto LOOP1;
	case 'n':
		goto END;
	default:
		printf( "你输入了无效命名!!\n" );
		goto LOOP2;
	}

END:
	return 1;	
	
}
////////////////
float fun( float x)
{
	float result;
	result = pow(x, 4) + 2*x +4;
	return result;
}

float get_derivatives_1n( float x )    //用五点法求一阶导数
{
	float z[5], y[5];
	float m;
	int   i;

	z[0] = x - 2*H;
	for( i = 1; i < 5; i ++ )
		z[i] = z[0] + i * H;
	for( i = 0; i < 5; i ++ )
		y[i] = fun( z[i] );

	m = ( y[0] - 8*y[1] + 8*y[3] - y[4] )  / (12*H);

	return m;
}

float process( float e, int *k )
{
	float x1, x2;
	float y11, y12;
	float y21, y22;
	float s, z, w;
	float x;
	float y, y1;
	float abs_x;
	
	*k = 1;

	x1 = X1;
	x2 = X2;

	y11  = fun( x1 );
	y12  = fun( x2 );
	y21 = get_derivatives_1n( x1 );
	y22 = get_derivatives_1n( x2 );
	
	printf( "\n计算过程如下:\n" );
	printf( "k   x2-x1    y11  y12  y21  y22  s   z   w   x   y   y1\n" );

LOOP:
	s = 3 * ( y12 - y11 ) / ( x2 - x1 );
	z = s - y21 - y22;
	w = sqrt( z*z - y21*y22 );
	x = x1 + ( x2 - x1 ) * ( 1 - ( y22 + w + z ) / ( y22 - y21 + 2*w ) );

	y  = fun( x );
	y1 = get_derivatives_1n( x );

	printf( "%3d%8.3f%8.3f%8.3f%8.3f%8.3f%8.3f%8.3f%8.3f%8.3f%8.3f%8.3f\n", *k, x2-x1,  y11, y12, y21, y22, s, z, w, x, y, y1 );

	if( ( abs_x = fabs( x2 - x1 ) ) <= e )	
		return x;			
	else
	{
		if( !y1 )
			return x;
		else if( y1 < 0 )
		{
			x1  = x;
			y11 = y;
			y21 = y1;
			(*k) ++;
			goto LOOP;
		}
		else
		{
			x2  = x;
			y12 = y;
			y22 = y1;
			(*k) ++;
			goto LOOP;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -