黄金分割法与进退法的C语言程序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
A2=a+0.618*(b-a); Y2=f(A2);
do {
n++;
wk.baidu.com
if (!(Y1<Y2))
{
a=A1;
A1=A2;
Y1=Y2;
A2=a+0.618*(b-a);
Y2=f(A2);
}
else
{
b=A2;
A2=A1;
Y2=Y1;
A1=b+0.382*(b-a);
Y1=f(A1);
}
}
while ((a-b)>=e||(a-b)<=-e);
int n; printf("x1="); scanf("%lf",&x1); printf("h="); scanf("%lf",&h); f1=f(x1); x2=x1+h; f2=f(x2); if(f1==f2) a=x1<(x1+h)?x1:x1+h; b=x1>(x1+h)?x1:x1+h; if(f2>f1) { h=-h; temp=x1; x1=x2; x2=temp; temp=f1; f1=f2; f2=temp; x3=x2+h; f3=f(x3); }
值互换。转(3)向后探测; (c)如 y1=y2,极小点在 a1 和 a1+h 之间。 (3)产生新的探测点 a3=a1+h,y3=f(a3); (4) 比较函数值 y2 与 y3: (b)如 y2>y3, 加大步长 h=2 h ,a1=a2,
a2=a3,转(3)继续探测。 (a)如 y2<y3, 则初始区间得到:
InputData() //数据输入函数的名称要和倒数第四行的一起改,要同时改成同一名称 { printf("x,y,z=?"); //这里提示输入方程的系数,提示语句 x,y,z=?改成你自己的 scanf("%lf,%lf,%lf",&m,&n,&p); printf("e=?"); //这里提示输入黄金分割的精度,提示语句 e=?改成你自己的 scanf("%lf",&e); }
}
main() { InputData(); //数据输入 JTF(); //进退法 HJFGF(); //黄金分割法 }
A=(a+b)*0.5;
printf("A = %lf\n",A);
printf("f(A) = %lf\n", f(A));
printf("n = %d\n",n);
printf("a=%f,b=%f",a,b);
getch();
}
陈文斌
#include<stdio.h>
double m,n,p,e,a,b; double F(double x) { return m*x*x+n*x+p; }
HJFGF() //黄金分割法的名称要和倒数第二行一起改 { double x1,x2,f1,f2; x1=a+0.382*(b-a); x2=a+0.618*(b-a); do { if(F(x1)<F(x2)) {b=x2;x2=x1;f2=f1;x1=a+0.382*(b-a);f1=F(x1);} else{a=x1;x1=x2;f1=f2;x2=a+0.618*(b-a);f2=F(x2);} }while(!((a-b>0?a-b:b-a)<e)); printf("a=%lf,b=%lf\n",a,b); printf("x=%lf\n",0.5*(a+b)); printf("F(x)=%lf\n",F(0.5*(a+b)));
a=min[a1,a3], b=max[a3,a1],函数最小值所在的区间为[a, b] 。
我编的修改
#include<math.h> #include<stdio.h> #define f(x) 3*x*x*x-4*x+2 main() { double f1,f2,f3,temp,x1,x2,x3,h,a,b,Y1,Y2,A,A1,A2,e=0.2;
else if(f2<f1) { h=2*h;
x3=x2+h; f3=f(x3); }
while(f2>f3)
{ x1=x2;
x2=x3;
f2=f(x3);
x3=x2+h;
f3=f(x3);
}
a=x1<x3?x1:x3;
b=x1>x3?x1:x3;
printf("[%f,%f]\n",a,b);
A1=b+0.328*(b-a); Y1=f(A1);
JTF() //进退法的名称要和倒数第三行一起改 { double x1,x2,x3,f1,f2,f3,t,h; printf("x0,h=?"); //这里提示输入进退法的初始点和步长,提示语句 x0,h=?改成你自己的 scanf("%lf,%lf",&x1,&h); f1=F(x1);x2=x1+h;f2=F(x2); if(f1<f2) { h=-h; t=x1;x1=x2;x2=t; t=f1;f1=f2;f2=t; } else { h=2*h; } x3=x2+h; f3=F(x3); while(!(f2<f3)) { x1=x2;x2=x3;f2=f3;x3=x2+h;f3=F(x3); } if(x1>x3) {a=x3;b=x1;} else{a=x1;b=x3;} printf("[%lf,%lf]\n",a,b); }
基本思想:
对 f(x)任选一个初始点 a1 及初始步长 h, 通过比较这两点函数值的大小,确定 第三点位置,比较这三点的函数值大小,确定是否为 “高—低—高” 形态。 (1)选定初始点 a, 初始步长 h=h0,计算 y1=f(a1),
y2=f(a1+h)。 (2)比较 y1 和 y2。
(a)如 y1>y2, 向右前进;加大步长 h=2 h ,转(3)向前; (b)如 y1<y2, 向左后退;h=- h0, 将 a1 与 a2,y1 与 y2 的