/********************************
黄金分割算法
********************************/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
float GoldSection(float a0,float b0,float f);//f表示精度
float Fun(float x);
void main()
{
float y;
y=GoldSection(-2,5,0.01);
printf("\n\t得出最后解是:%f\n",y);
}
float GoldSection(float a0,float b0,float f)
{
float r,u,v,a,b;
int k=0;
r=0.618;
a=a0; b=b0;
u=b0-r*(b0-a0);
v=a0+r*(b0-a0);
printf("k\t[ak,bk]\t\t uk\t vk\t f(uk)\t f(vk)\n");
printf("%d [%f,%f] %f %f %f %f\n",k,a,b,u,v,Fun(u),Fun(v));
while(b-a>f)
{
if(Fun(u)==Fun(v))
{
a=u; b=v;
u=b-r*(b-a);
v=a+r*(b-a);
k++;
printf("%d [%f,%f] %f %f %f %f\n",k,a,b,u,v,Fun(u),Fun(v));
}
if(Fun(u)<Fun(v))
{
b=v; v=u;
u=b-r*(b-a);
k++;
printf("%d [%f,%f] %f %f %f %f\n",k,a,b,u,v,Fun(u),Fun(v));
}
if(Fun(u)>Fun(v))
{
a=u; u=v;
v=a+r*(b-a);
k++;
printf("%d [%f,%f] %f %f %f %f\n",k,a,b,u,v,Fun(u),Fun(v));
}
}
return (a+b)/2;
}
float Fun(float x)
{
//return 3*pow(x,4)-16*pow(x,3)+30*pow(x,2)-24*x+8;
return (1-x+x*x)*(1-x+x*x);
}
黄金分割最优解
最新推荐文章于 2023-12-20 15:27:17 发布