?? daan.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 + -