目 录
一、 黄金分割法 二、 二次插值法
三、 最速下降法(阶梯法) 四、 变尺度法 五、 鲍威尔法
一、黄金分割法
#include
#define f(x) x*x+2*x golden(float,float,float); main() {
float a,b,e;
printf(\请输入区间和收敛精度:a,b,e\\n\ scanf(\ golden(a,b,e); }
golden(float a,float b,float e) {
float y1,y2,a1,a2,A,Y; int n=0;
a1=b-r*(b-a); a2=a+r*(b-a); y1=f(a1); y2=f(a2);
printf(\黄金分割法的搜索过程:\ do { printf(\
a=%f,b=%f,a1=%f,a2=%f,y1=%f,y2=%f\
if(y1>=y2) {
a=a1; a1=a2; y1=y2;
a2=a+r*(b-a); y2=f(a2); }
else {
b=a2; a2=a1; y2=y1;
a1=b-r*(b-a); y1=f(a1);
%d
}
n++;
}while(fabs((b-a)/b)>=e||fabs((y2-y1)/y2)>=e); A=(a+b)/2; Y=f(A);
printf(\
printf(\结果:\\n极值点及其函数值:A=%f,Y=%f\\n\}
二、二次插值法
#include\#include\#include\void main() {
float*area(float a1,float p,float a[3]); float f(float x); float ar,fr;
float a1=10,p=0.01,e=0.000001; float pa[3]; area(a1,p,pa); a1=pa[0];
float a2=pa[1]; float a3=pa[2]; float f1=f(a1); float f2=f(a2); float f3=f(a3); do {
ar=((a3*a3-a2*a2)*f1+(a1*a1-a3*a3)*f2+(a2*a2-a1*a1)*f3); ar=ar/2/((a3-a2)*f1+(a1-a3)*f2+(a2-a1)*f3); fr=f(ar); if(ar>a2) { if(fr>f2)
{ a3=ar; f3=fr; } else if(fr { a1=a2; f1=f2; a2=ar; f2=fr; } else { a3=ar; a1=a2; a2=(a1+a3)/2; f1=f2; f3=fr; f2=f(a2); } } else if(ar { if(fr>f2) { a1=ar; f1=fr; } else if(fr { a1=ar; a3=a2; a2=(a1+a3)/2; f1=fr; f3=f2; f2=f(a2); } } if (fabs(a1-a3)<=e) break; } while(1); if(f2 { ar=a2; fr=f2; } printf(\ } float*area(float a1,float p,float a[3]) { float f(float x); float a2,f2,a3,f3,temp; float acc=0.00001; float f1=f(a1); float storep=p; while(1) { a2=a1+p; f2=f(a2); if(f2>=f1) { if(fabs(f2-f1) p=-p; } else break; } while(1) { a3=a2+p; f3=f(a3); if(f2<=f3) break; p=2*p; a1=a2; f1=f2; a2=a3; f2=f3; } if(a1>a3) { temp=a1; a1=a3; a3=temp; } a[0]=a1;a[1]=a2;a[2]=a3; return a; } float f(float x) { float y=pow(fabs(x-1),1.5)+pow(fabs(x-1),2.7); return y; } 三、最速下降法 #include float fun1(float x1,float x2) {float a; a=2*x1; return a; } float fun2(float x1,float x2) {float b; b=50*x2; return b; } float fun3(float x1,float x2) {float y; y=x1*x1+25*x2*x2; return y; } main() { float t, e=0.01, x1=0, x2=1, a, b, y, m; a=fun1(x1,x2); b=fun2(x1,x2); m=sqrt(a*a+b*b); while(m>e) { t=(a*a+b*b)/(2*a*a+50*b*b); x1=x1-a*t; x2=x2-b*t; a=fun1(x1,x2); b=fun2(x1,x2); m=sqrt(a*a+b*b); } y=fun3(x1,x2); printf(\ }