📄 0.618法.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 + -