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

📄 0.618法.c

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

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

//此程序使用0.618法,用于计算目标函数在给定区间和精度的条件下的最小值//

//////////////////////////////////////////////////////
#include <stdio.h>
#include <math.h>
////////other defination//////////////////////////////
float fun( float x)
{
	float result;
	result = exp( -x ) + x*x;
	return result;
}
////////the main process function//////////////////////
int fun_MIN( float *a_min, float *b_min )
{
	float a = MIN, b = MAX;
	float ak = a, bk = b;
	float y, u;
	float fun_y, fun_u;
	int   k = 1;

	y = a + 0.382 * ( b - a );
	u = a + 0.618 * ( b - a );

	fun_y = fun( y );
    fun_u = fun( u );
	
	printf( "计算过程如下: \n\n" );
	printf( " k  ak       bk       yk       uk       f(yk)    f(uk)\n\n" );
	

LOOP:
	printf( " %-3d%-9f%-9f%-9f%-9f%-9f%-9f\n",k,ak,bk,y,u,fun_y,fun_u );
	if( ( bk - ak ) <= L )
	{
		*a_min = ak;
		*b_min = bk;
		return k;
	}


	if( fun_y > fun_u )
	{
		ak = y;
		y  = u;
		u  = ak + 0.618*( bk - ak );
		fun_y = fun_u;
		fun_u = fun( u );

		k += 1;
		goto LOOP;
	}
	else
	{
		bk = u;
		u  = y;
		y  = ak + 0.382*( bk - ak );
		fun_u = fun_y;
		fun_y = fun( y );

		k += 1;
		goto LOOP;
	}


}

	k = fun_MIN( &a_min, &b_min );

    x = ( a_min + b_min ) / 2;

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

⌨️ 快捷键说明

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