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

📄 gold.cpp

📁 黄金分割法求函数极小值点本人的作业大家可以参考参考参考啊啊啊啊
💻 CPP
字号:
#include<stdio.h>
#include<conio.h>
#include<math.h>
#define e 0.001    /*收敛精度*/
#define tt 0.01    /*一维搜索步长*/

float function(float x)    /*定义已知函数*/
{
	float y=pow(x,4)-4*pow(x,3)-6*pow(x,2)-16*x+4;
	return(y);
}

void finding(float a[4])    /*进退法求区间[a,b]*/    
{
	float h=tt;    /*初始步长*/
	float x0,x1,f1,x2,f2,x3,f3;
	int i;
	printf ("输入一个初始值:");
	scanf ("%f",&x0);
	x1=x0,x2=x1+h;
	f1=function(x1),f2=function(x2);
	if(f1==f2)
	   a[0]=x1,a[3]=x2;
	else
	{
		if(f1>f2)    /*作前进计算*/
		{
			x3=x2+h;
			f3=function(x3);
			if (f3<f2)    /*若满足条件,继续做前进计算*/
			for(i=0;;i++)    
			{
				h=2*h;
	            x1=x2,f1=f2;
	            x2=x3,f2=f3;
	            x3=x2+h;
	            f3=function(x3);
				if (f2<f3) break;    /*到此条件停止前进计算*/
			}
		}
		else
		{
			x2=x1-h;    /*作后退计算*/
			f2=function(x2);
			x3=x2-h;
			f3=function(x3);
			if (f3<f2)    /*若满足条件,继续做后退计算*/
			for(i=0;;i++)
			{
				h=2*h;
	            x1=x2,f1=f2;
	            x2=x3,f2=f3;
	            x3=x2-h;
	            f3=function(x3);
				if (f2<f3) break;    /*到此条件停止后退计算*/
			}
		}
	}
	if(x1<x3)
	a[0]=x1,a[3]=x3;    /*将所求区间值赋给a,b用以输出*/
	else
	a[0]=x3,a[3]=x1;
	printf("所求搜索区间[a,b]=[%.2f,%.2f]\n",a[0],a[3]);
	return;
}

float gold(float *ff)    /*黄金分割法求解*/
{
	float a1[3],f1[3],a[4],f[4];
	float aa;
	int i;
	finding(a);
	a[1]=a[0]+0.382*(a[3]-a[0]),a[2]=a[0]+0.618*(a[3]-a[0]);
	f[0]=function(a[0]),f[1]=function(a[1]),f[2]=function(a[2]),f[3]=function(a[3]);
	for(i=1;;i++)    /*计算迭代次数*/
	{
		if(f[1]>=f[2])
		{
			a[0]=a[1];f[0]=f[1];
			a[1]=a[2];f[1]=f[2];
			a[2]=a[0]+0.618*(a[3]-a[0]);f[2]=function(a[2]);
		}
		else{
			a[3]=a[2];f[3]=f[2];
			a[2]=a[1];f[2]=f[1];
			a[1]=a[0]+0.382*(a[3]-a[0]);f[1]=function(a[1]);
		}
		if(a[3]-a[0]<e)
		{
			aa=(a[1]+a[2])/2;
			*ff=function(aa);
            printf("\n迭代次数n=%d\n",i);
			break;
		}
	}
    return(aa);
}

void main()
{
	printf("**黄金分割法求函数极小值点**\n");
	float xx,ff;
	xx=gold(&ff);
	printf("优化设计的结果是:\n");
	printf("x*=%f\nf*=%f\n",xx,ff);
	printf("**梁清航**\n");
	getch();
}







⌨️ 快捷键说明

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