LS,不是用判断平均值,而是判断最小值
继续提高精度重新计算了一下,最好结果是: best_r1=1.10721999999933710000,best_r2=1.80735000000392380000 best_a=0.59175542934053604000,best_b=0.59175541242309837000
R2/R1=1.6323314246536423407284937948264,倒数是.61262068774555747306577252971875, 并不是黄金分割比例
因为要 求的不是比例,而是绝对极值。 当然,用黄金分割比例0.618已经很接近于最优解了。
至于蛋蛋说的问题,由于V1-V0比V2-V1、V3-V2大很多,总是最大的值,所以V1-V0是不需要考虑的(考虑了也是一样)。
//VC++ 程序如下 // calcr1r2_1.cpp : Defines the entry point for the console application. //
#include "stdafx.h"
long double min(long double x,long double y) { if(x<y) return(x); else return(y); }
int main(int argc, char* argv[]) { long double r1,r2; long double best_r1,best_r2; long double va,vb; long double maxa,maxb; unsigned int i,j;
printf("Hello World!
");
maxa=maxb=0; r1=0.7; r2=1; for(i=0;i<60000;i++) { for(j=0;j<100000;j++) { va=5/(1+r1)-5/(1+r2); vb=5/(1+r1*r2/(r1+r2))-5/(1+r1); if (min(va,vb) >=min(maxa,maxb)) { maxa=va; maxb=vb; best_r1=r1; best_r2=r2; printf ("r1=%1.20lf,r2=%1.20lf Va=%1.20lf,", r1, r2,va); printf ("Vb=%1.20lf maxa=%1.20lf,maxb=%1.20lf
", vb,maxa,maxb); } // printf ("r1=%1.20lf,r2=%1.20lf Va=%1.20lf,", r1, r2,va); // printf ("Vb=%1.20lf maxa=%1.20lf,maxb=%1.20lf
", vb,maxa,maxb); r2 +=0.00001; } r1+=0.00001; r2=r1; } printf ("best_r1=%1.20lf,best_r2=%1.20lf
", best_r1, best_r2); printf ("best_a=%1.20lf,best_b=%1.20lf
",maxa ,maxb ); return 0; }
[#007f00]//本程序由xwj设计的UltraEdit脚本加亮显示,如需要脚本访问我的Blog 或发送邮件至:xwjfile@21cn.com |
|