📄 sancichazhi.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 + -