黄金分割法求函数极小值点本人的作业大家可以参考参考参考啊啊啊啊

源代码在线查看: gold.cpp

软件大小: 2 K
上传用户: a369100057
关键词: 分割 函数
下载地址: 免注册下载 普通下载 VIP

相关代码

				#include
				#include
				#include
				#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							for(i=0;;i++)    
							{
								h=2*h;
					            x1=x2,f1=f2;
					            x2=x3,f2=f3;
					            x3=x2+h;
					            f3=function(x3);
								if (f2							}
						}
						else
						{
							x2=x1-h;    /*作后退计算*/
							f2=function(x2);
							x3=x2-h;
							f3=function(x3);
							if (f3							for(i=0;;i++)
							{
								h=2*h;
					            x1=x2,f1=f2;
					            x2=x3,f2=f3;
					            x3=x2-h;
					            f3=function(x3);
								if (f2							}
						}
					}
					if(x1					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]						{
							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();
				}
				
				
				
				
				
				
				
							

相关资源