一、黄金分割法Gamma校正
二、二次插值法
三、最速下降法(阶梯法)
四、变尺度法
五、鲍威尔法
一、黄金分割法
#include<stdio。h>
#include<math。h〉
#define r 0。618
#define f(x) x*x+2*x
golden(float,float,float);
main()
{
float a,b,e;
printf(”\n请输入区间和收敛精度:a,b,e\n"); scanf("%f,%f,%f",&a,&b,&e);
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);
printf(”黄金分割法的搜索过程:");王的男人 李俊基
do
{ printf(”\n %d a=%f,b=%f,a1=%f,a2=%f,y1=%f,y2=%f”,n,a,b,a1,a2,y1,y2);
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);
611aa y1=f(a1);
}
n++;
}while(fabs((b—a)/b)>=e||fabs((y2-y1)/y2)>=e);
A=(a+b)/2;
Y=f(A);
printf(”\n %d a=%f,b=%f,a1=%f,a2=%f",n,a,b,a1,a2);
printf("\n结果:\n极值点及其函数值:A=%f,Y=%f\n”, A,Y); }
二、二次插值法
#include"stdio。h”
#include"math.h"
#include"conio。h”
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<f2)
{ 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〈a2)
{ if(fr>f2)
{ a1=ar; f1=fr; }
else if(fr〈f2)
{ a3=a2; f3=f2;
a2=ar; f2=fr; }
else
{ 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〈fr)
{ ar=a2; fr=f2; }
printf(”\nx=%f\nf(x*)=%f”,ar,fr);
}
巴洛特利养母
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)〈acc)
p=p/2;rf2.0
else
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 〈stdio。h〉
#include 〈math。h〉
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(”The min is %f",y);
}
四、DFP变尺度法
#include<stdio。h>
#include〈stdlib.h>
#include<math.h>
#include<conio.h>
#define tt 0。01
#define ff 1。0e-6
#define ac 1。0e—6
#define ad 1。0e-6
#define n 2
double ia;
double fny(double *x)
{
double x1=x[0],x2=x[1];
double f;
f=x1*x1+2*x2*x2—4*x1-2*x1*x2;