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

📄 daan.cpp

📁 机械优化设计作业(鲍威尔) 说明:学完优化设计
💻 CPP
字号:
#include <time.h>
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <sys/stat.h>

typedef struct chi_struct
{
	long double X[2];
	long double a;
}MYSTRUCT;

MYSTRUCT JieA( long double X[2], long double d[2]);					//输入Xik,输出Xik+1,a
long double JieF( long double X[2] );								//输入Xi,输出函数值f(x1,x2)
bool Distinguish(long double F[4],long double deta[4]);				//输入F,deta 判断是否符合判别条件
long   GetFileSize(char   *chFileName) ;							//判断文件是否为空


void main()
{
	 long double X[4][2],a[2],temp[2],deta[4],F[4];
	 int k=0,i=1,t=0,xunhuan=0,flage=0;
     long double d1[2]={1,0};
	 long double d2[2]={0,1};
	 long double d3[3];
	 long double daan[2],XK1[2];
	 long double e;
	 deta[0]=0;
	 MYSTRUCT tempx;
//---------------------往文本上添加软件当前运行时间
	time_t nowtime; 
	struct tm *timeinfo; 
	time( &nowtime ); 
	timeinfo = localtime( &nowtime ); 
	int year, month, day,hour,min,sec; 
	year = timeinfo->tm_year + 1900; 
	month = timeinfo->tm_mon + 1; 
	day = timeinfo->tm_mday;
	hour=timeinfo->tm_hour;
	min=timeinfo->tm_min;
	sec=timeinfo->tm_sec;
	printf("程序运行时间:%d-%d-%d %d:%d:%d\n", year, month, day,hour,min,sec); 



//---------------------//文本保存功能
	  FILE  *out;

	   if ((out = fopen("YouHuaBao04051157.txt", "a"))
		   == NULL)
	   {
		  fprintf(stderr, "Cannot open output \
		   file.\n");
	   }

	 if(!GetFileSize("YouHuaBao04051157.txt"))
	 {
		 fprintf(out,"%s","\t\t机械优化设计鲍威尔法————完成人:公孙小龙 04051***\n\n");//为文本添加标题
		 fprintf(out,"%s","\t---------——————————————————————————————————\n\n");
		 flage=1;
	 }
//--------------------------------------------
	 fprintf(out,"程序运行时间:%d-%d-%d %d:%d:%d\n\n", year, month, day,hour,min,sec); 
	 printf("初始搜索方向为e1[1,0],e2[0,1],请输入出示点X0(x01,x02)和精度e ^_^ \n");
	 scanf("%lf %lf %lf",&X[0][0],&X[0][1],&e);
	 fprintf(out,"初始搜索方向为e1[1,0],e2[0,1],初始点点X0(%lf,%lf)和精度%lf ^_^ \n",X[0][0],X[0][1],e);
	 printf("初始搜索方向为e1[1,0],e2[0,1],初始点点X0(%lf,%lf)和精度%lf ^_^ \n",X[0][0],X[0][1],e);

//-------------------------						//进入循环
	 while(1)
	 {
		     xunhuan++;
			 for(t=0;t<2;t++) temp[t]=X[0][t];			//为了更好地传递二维数组
			 F[0]=JieF(temp);							// 为了传递函数方便而作的一个temp 没啥意思
			 tempx=JieA(temp,d1);						//等找到更好的传递方法再弄掉这个东东
			 X[1][0]=tempx.X[0];
			 X[1][1]=tempx.X[1];						//取出求得的xik,取出a1 注:a[0]=a1,a[1]=a2;
			 a[0]=tempx.a;
			 F[1]=JieF(tempx.X);
			 deta[1]=F[0]-F[1];						    //至此,f(Xi-1k),f(Xik),Xik,a1,deta1求出,
														//以下求f(Xi+1k),Xi+1k
		//-------------------------
			 for(t=0;t<2;t++)		 temp[t]=X[1][t];  
			 tempx=JieA(temp,d2);						
			 X[2][0]=tempx.X[0];
			 X[2][1]=tempx.X[1];						//取出求得的xi+1k,取出a2 注:a[0]=a1,a[1]=a2;
			 a[1]=tempx.a;
			 F[2]=JieF(tempx.X);
			 deta[2]=F[1]-F[2];						    //至此,f(Xi+1k),a2,deta2求出,
														//以下求f(Xi+2k),Xi+2k
		//-------------------------
			 d3[0]=X[2][0]-X[0][0];
			 d3[1]=X[2][1]-X[0][1];
			 X[3][0]=2*X[2][0]-X[0][0];
			 X[3][1]=2*X[2][0]-X[0][0];

			 for(t=0;t<2;t++) temp[t]=X[3][t];
			 F[3]=JieF(temp);
			 
			 deta[3]=(deta[1]>deta[2] ) ? deta[1] : deta [2] ;


		//--------------------------					//此下,判断判别条件是否满足

			 if(Distinguish(F,deta))
			 {
				 for(t=0;t<2;t++) temp[t]=X[2][t];
				 tempx=JieA(temp,d3);
				 XK1[0]=tempx.X[0];
				 XK1[1]=tempx.X[1];
				 for(t=0;t<2;t++) d1[t]=d2[t];
				 for(t=0;t<2;t++) d2[t]=d3[t];
			 }
			 else
			 {
			    if(F[2]<F[3]) 
				{
					XK1[0]=X[2][0];
					XK1[1]=X[2][1];
				}
				else
				{
					XK1[0]=X[3][0];
					XK1[1]=X[3][1];
				}
			 }

		//--------------------------					//此下,判别是否符合|Xnk-X0k|<e;符合就退出循环,否则,继续循环;

     fprintf(out,"第%d次循环,解为 %e X1为%e X2为%e \n",xunhuan,JieF(XK1),XK1[0],XK1[1]);//存储到文件
	 printf("第%d次循环,解为 %e X1为%e X2为%e \n",xunhuan,JieF(XK1),XK1[0],XK1[1]);//调试用
     printf("fabsl为%e \n",fabsl((X[2][0]-X[0][0])) );//调试用
			 if( fabsl((X[2][0]-X[0][0]))<e && fabsl((X[2][1]-X[0][1]))<e) 
			 {
				 for(t=0;t<2;t++) daan[t]=XK1[t];
				 break;
			 }
			 else
			 {
				 for(t=0;t<2;t++) X[0][t]=XK1[t];			  
			 }
			



	 }
	 
     fprintf(out,"最优解为 %e X1为%e X2为%e \n",JieF(daan),daan[0],daan[1]);
	 fprintf(out,"————————————————————————\n\n\n");
     printf("最优解为 %e X1为%e X2为%e \n",JieF(daan),daan[0],daan[1]);
	 if(!flage) printf("结果已经添加到本目录 \'\'\\\\ YouHuaBao04051157.txt\'\' 下\n");
		 else printf("文本 \'\' YouHuaBao04051157.txt\'\' 已经保存在目录\n");
	 getch();
	 fclose(out);
}

MYSTRUCT JieA( long double X[2], long double d[2])
{
	MYSTRUCT chiyulong;
	chiyulong.a=(X[0]*d[1]+X[1]*d[0]+10*d[0]+4*d[1]-2*X[0]*d[0]-2*X[1]*d[1]) /  (2*d[0]*d[0] + 2*d[1]*d[1] - 2*d[0]*d[2]);

	chiyulong.X[0]=X[0]+chiyulong.a*d[0];
	chiyulong.X[1]=X[1]+chiyulong.a*d[1];
	
	return chiyulong;
}

long double JieF(  long double X[2] )
{ 
	long double score;
	score=X[0]*X[0]+X[1]*X[1]-X[0]*X[1]-10*X[0]-4*X[1]+60;
	return score;
}

bool Distinguish(long double F[4],long double deta[4])
{
	bool N1,N2,N3;
	long double Left=0;
	long double Right=0;

	Left=(F[0]-2*F[2]+F[3])*(F[0]-F[2]-deta[3])*(F[0]-F[2]-deta[3]);
	Right=0.5*deta[3]*(F[0]-F[3]);

	if(F[3]<F[0]) N1=true;
	  else N1=false;
	if(Left<Right) N2=true;
	  else N2=false;

	N3=N1&N2;
	return (N3);   

}

long   GetFileSize(char   *chFileName)   
{
	  struct stat buf;   
  
	  if(stat(chFileName, &buf)   <   0)   
	  {
		  return   -1;   
	  }   
	   return   buf.st_size;   
}   

⌨️ 快捷键说明

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