用c语言编写黄金分割法

Python011

用c语言编写黄金分割法,第1张

黄金分割点是指把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比。其比值是一个无理数,用分数表示为(√5-1)/2。黄金分割点(p)的求法,如图:①过点B作BD⊥AB,使BD=1/2AB;②连结AD,以D为圆心,CB为半径作弧,交AD于E, 则有DE=DB;③以A为圆心,AE为半径作弧,交AB于P,则有AP=AE;则点P是线段AB上的一个黄金分割点.为什么点P是线段AB上的一个黄金分割点?事实上,若设AB=2,则BD=BE=1,由作图过程可知AD=√5.则AE=AP=(√5)-1,PB/AP=AP/AB=[(√5)-1]/2。 因此点P是线段AB上的一个黄金分割点.

#include#includefloat getequation(float x)

{

return x*x-2*x+2

}

void main()

{

float a=0

float b=6

float result = 0

do {

float c=a+0.618*(b-a)

float d=a+b-c

if(fabs(getequation(c)) <fabs(getequation(d)))

{

a=d

result = c

}

else

{

b=c

result = d

}

} while(fabs(getequation(result)) >0.01)

printf("f(a)=a*a-7*a+10\n")

printf("a=%f\n",result)

}

扩展资料

C语言编写程序求最大值

#include<stdio.h>

double Max(double*p,int n)

{

double max=*p

for(int i=0i<ni++)

if(*(p+i)>max)

max=*(p+i)

return max

}

double Min(double *p,int n)

{

double min=*p

for(int i=0i<ni++)

if(*(p+i)<min)

min=*(p+i)

return min

}

double Average(double *p,int n)

{

double sum=0

for(int i=0i<ni++)

sum+=*(p+i)

return sum/n

}

int main()

{

double a[10]

printf("请输入10个实数:\n")

for(int i=0i<10i++)

scanf("%f",&a[i])

printf("这10个数中最大值为:%f\n",Max(a,10))

printf("这10个数中最小值为:%f\n",Min(a,10))

printf("这10个数的平均值为:%f\n",Average(a,10))

return 0;

给,已经编译运行确认: #include"math.h" #include"stdio.h" #definef(x)x*x+2*x+1//一元函数,这里按照你的要求写的是:x2+2x+1 //函数功能是用黄金分割法实现求一元函数的最优解 doublehj(double*a,double*b,doublee,int*n) {doublex1,x2,s<br>if(fabs(*b-*a)<=e)<br>s=f((*b+*a)/2)<br>else<br>{x1=*a+0.382*(*b-*a)<br>x2=*a+0.618*(*b-*a)<br>if(f(x1)>f(x2))<br>*a=x1<br>else<br>*b=x2<br>*n=*n+1<br>s=hj(a,b,e,n)<br>} returns} main() {doubles,a,b,e<br>intn=0<br>scanf("%lf%lf%lf",&a,&b,&e)//输入区间[a,b]和精度e的值<br>s=hj(&a,&b,e,&n)//调用hj函数,其中n代表迭代次数<br>printf("a=%lf,b=%lf,s=%lf,n=%d ",a,b,s,n)<br>} 运行时: 输入:0.60.50.1 输出结果为: 0.60.50.1 a=0.600000,b=0.500000,s=2.402500,n=0