📄 zouyaoxian.txt
字号:
#include<stdio.h>
#include<math.h>
#define AF 0.618033988
float *p;
float f(float x)
{
float y;
y=p[0]*x*x*x*x*x+p[1]*x*x*x*x+p[2]*x*x*x+p[3]*x*x+p[4]*x+p[5];
return y;
}
float daoshu(float x) /*对函数求一阶导数*/
{
float y;
y=(f(x+x*10e-6)-f(x))/(x*10e-6);
return y;
}
float daoshu2(float x)/*对函数求二阶导数*/
{
float y;
y=20*p[0]*x*x*x+12*p[1]*x*x+6*p[2]*x+2*p[3];
return y;
}
float fun1(float a,float b,float e) /*利用二分法*/
{
float x;
int n=1; /*n用于统计循环次数*/
x=(a+b)/2;
while(fabs(daoshu(x))>e)
{
if(daoshu(x)<0)
a=x;
else if(daoshu(x)>0)
b=x;
if(fabs(b-a))
x=(a+b)/2;
n++;
}
printf("%d\n",n);
return x;
}
float fun2(float a,float b,float e) /* 利用黄金分割法求*/
{
float x,y,fai1,fai2;
int n=1; /*n用于统计循环次数*/
x=a+(1-AF)*(b-a);
y=a+AF*(b-a) ;
fai1=f(x) ;
fai1=f(y);
while(fabs(b-a)>e)
{
if(fai1<=fai2)
{
b=y; y=x; fai2=fai1; x=a+b-y; fai1=f(x);
}
else
{
a=x; x=y; fai1=fai2; y=a+b-x; fai2=f(y);
}
n++;
}
printf("%d\n",n);
x=(a+b)/2;
return x;
}
float fun3(float a,float b,float e)
{
float x0=b,x1;
int n=1;
x1=x0-daoshu(x0)/daoshu2(x0);
while(fabs((x1-x0)/x0)>e)
{
x0=x1;
x1=x0-daoshu(x0)/daoshu2(x0);
n++;
}
printf("%d\n",n);
return x1;
}
int Fib(int n)
{ int y;
if(n==0||n==1)
y=1;
else
y=Fib(n-1)+Fib(n-2);
return y;
}
float fun4(float a,float b,float e) /*Fibonacci法*/
{
int n,i;
float t,tp,z;
n=0;
while(Fib(n)<1/e)
n++;
printf("%d\n",n);
for(i=n;i>1;i++)
{
t=b+Fib(n-1)*(a-b)/Fib(n);
tp=a+Fib(n-1)*(b-a)/Fib(n);
if(f(t)<f(tp))
{
b=tp;
tp=t;
t=b+Fib(n-2)*(a-b)/Fib(n-1);
}
if(f(t)>f(tp))
{
a=t;
t=tp;
t=b+Fib(n-2)*(a-b)/Fib(n-1);
}
}
t=(a+b)/2;
tp=a+(0.5+e/8)*(b-a);
if(f(t)<f(tp))
{
z=f(t);t=(t+b)/2;
printf("the min result is:x=%f",t);
printf(" y=%f\n",z);
}
else
{
z=f(tp);t=(a+tp)/2;
printf("the min result is:x=%f",t);
printf(" y=%f\n",z);
}
return t;
}
main()
{
float x,y,z,w,a,b,e;
int i;
printf(" please enter six number stand for the number of f(x):\n");
for(i=0;i<6;i++)
scanf("%f",&p[i]);
printf("f(x)=%6.3fx*x*x*x*x+%6.3fx*x*x*x+%6.3fx*x*x+%6.3fx*x+%6.3fx+%6.3f\n",p[0],p[1],p[2],p[3],p[4],p[5]);
scanf("%f %f %f",&a,&b,&e);
printf("\n");
x=fun1(a,b,e);
printf("the min result is:x=%f y=%f\n",x,f(x));
y=fun2(a,b,e);
printf("the min result is:x=%f y=%f\n",y,f(y));
z=fun3(a,b,e);
printf("the min result is:x=%f y=%f\n",z,f(z));
w=fun4(a,b,e);
getchar();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -