资源描述
以f(x)=*x+2*x为例
黄金分割
#include <stdio.h>
#define e 0.001//收敛精度
main(){
float a,b,x1,x2,y1,y2;
float minx,miny;
x1=-3;x2=5;//x1,x2初始化
a=x1;b=x2;//a1,a2初始化
do
{
x1=a+0.382*(b-a);
x2=a+0.618*(b-a);
y1=x1*x1+2*x1;
y2=x2*x2+2*x2;
if(y1>y2) a=x1;
else b=x2;
}
while((b-a)>e);//两个数值小于收敛精度e时终结
minx=(x1+x2)/2;//取两数值平均值
miny=minx*minx+2*minx;
printf("The minx is %f and the miny is %f.\n",minx,miny);//极小值
}
二次插值法
#include<stdio.h>
#include<math.h>
int main(void)
{
double a1,a2,a3,ap,y1,y2,y3,yp,c1,c2,m;
double j[3];
int i,h=1; //取正向搜索(h值为负则为反向搜索)。
void finding(double a[3]);//一维搜索拟定区间。
finding(j);//返回所得旳区间值a1,a2,a3。
a1=j[0]; //以数组j[3]为过渡,衔接搜索区间旳值并赋值给主函数旳a1,a2,a3。
a2=j[1]; //事实上是不会这样用旳,此处是以便衔接一维搜索函数与主函数,后来可类似。
a3=j[2];
m=0.001; //**输入m值,以拟定精确度**。
double f(double x); //方程函数阐明。
y1=f(a1); //初始化。
y2=f(a2);
y3=f(a3);
for(i=1;1>=1;i++)
{
c1=(y3-y1)/(a3-a1);
c2=((y2-y1)/(a2-a1)-c1)/(a2-a3);
ap=0.5*(a1+a3-c1/c2);
yp=f(ap);
if(fabs((y2-yp)/y2)<m)
break;
else if((ap-a2)*h>0)
{
if(y2>=yp){
a1=a2;y1=y2;
a2=ap;y2=yp;}
else{
a3=ap;y3=yp;}
}
else if(y2>=yp){
a3=a2;y3=y2;
a2=ap;y2=yp;}
else{a1=ap;y1=yp;}
}
double x,y; //用x,y储存所得极值点。
if(y2<=yp){
x=a2;y=y2;}
else{
x=ap;y=yp;}
printf("a*=%f\n",x);
printf("y*=%f\n",y);
return 0;
}
//定义方程函数。
double f(double x)
{
double y;
y=x*x-2*x; //**输入方程**。
return y;
}
//拟定区间旳外推法(取步长h=1)。
void finding(double a[3])
{
int h,i;
double y[3];
a[0]=0; //**0周边开始搜索**
h=1; //**输入h值,以拟定步长**。
a[1]=h;
y[0]=f(a[0]);y[1]=f(a[1]); //初始化。
if(y[1]>y[0]) //将逆方向寻找变向。
{
h=-h;
a[2]=a[0];y[2]=y[0];
do{
a[0]=a[1];a[1]=a[2];
y[0]=y[1];y[1]=y[2];
a[2]=a[1]+h;y[2]=f(a[2]);
h=2*h;
}while(y[2]<y[1]);
}
else{ //正方向寻找。
for(i=1;i>=1;i++){
a[2]=a[1]+h;y[2]=f(a[2]);
if(y[2]>=y[1])
break; //寻找成功,打印输出。
h=2*h;
a[0]=a[1];y[0]=y[1];
a[1]=a[2];y[1]=y[2];}
}
return;
}
外推法
#include<stdio.h>
float f(float t)
{ float z;
z=t*t+2*t;
return z;
}
void main()
{float h0=1,h=h0,a1=0,a2=h,y1,y2,a3,y3;
y1=f(a1);
y2=f(a2);
if(y2>y1)
{
h=-h;a3=a1;y3=y1;
a1=a2;y1=y2;a2=a3;y2=y3;
}
a3=a2+h;y3=f(a3);
while(y3<y2)
{
h=2*h;
a1=a2;y1=y2;a2=a3;y2=y3;
a3=a2+h;y3=f(a3);
}
printf("f(%f)=%f\nf(%f)=%f\nf(%f)=%f",a1,y1,a2,y2,a3,y3);
}
展开阅读全文