#include <stdio.h>
int main ()
{
double x;
double x1,x2;
double xmin,xmax;
double k1,k2,m1,m2,p1,p2;//k=a-x,m=b-nx,p=m^n≈m^2,这里约取n=2
double a1,b1,a2,b2;//这四个符号对应书上的a1,b1,a2,b2
double y,y0,y1,y2;//y1,y2=k*p=(a-x)*(b-2*x)^2;y,y0=y1-y2
int s=0;
a1=8.9289; b1=1.0711; a2=3.8605; b2=1.1395;//默认a1<a2的情况
x1=0; x2=b1;//x1设为0,x2设为b1,作为初始区间(0,b1),另外取x2=b2不影响结果
//这里取x2为b1是因为a比b大,实际上结果得到的x是公式里的“2x”
//如果b比a大,应该取x2=a1或a2,并把下面的0.5*xmin、xmax前面的0。5*去掉,在后面的m=b-x改成m=b-2*x;
while(s<100)//循环100次,但实际上大概20次之前结果就已经出来了
{
s=s+1;
x=(x1+x2)/2;
xmin=(x1+x)/2;xmax=(x2+x)/2;
k1=a1-0.5*xmin;m1=b1-xmin;p1=m1*m1;y1=k1*p1;//取公式中的n为2
k2=a2-0.5*xmin;m2=b2-xmin;p2=m2*m2;y2=k2*p2;
y=y1-y2;
k1=a1-0.5*xmax;m1=b1-xmax;p1=m1*m1;y1=k1*p1;
k2=a2-0.5*xmax;m2=b2-xmax;p2=m2*m2;y2=k2*p2;
y0=y1-y2;
printf("%f %f %f %f %f %f %f %d\n",y1,y2,y,y0,x,x1,x2,s);
if(y*y>y0*y0) x1=x;
if(y*y<y0*y0) x2=x;
}
//试求y=(a1-x)*(b1-nx)^n-(a2-x)*(b2-nx)^n=0在(0,a1)上的解
//对于区间(x1,x2),取x为x1与x2平均值,再分别取xmin、xmax为x与x1、x2的平均值
//分别求xmin与xmax对应的y=(a1-x)*(b1-nx)^n-(a2-x)*(b2-nx)的绝对值更小
//并把对应的x换成x1或者x2
//例如,如果用xmin算出来的y绝对值更小,就把x换成x2,(x1,x2)→(x1,x)(即(x1,1/2(x1+x2))
//因为xmin算出来的y绝对值更小说明解x0应该落在(x1,x)这半边
printf("%f",x);
return 0;
}