二次插值法,黄金分割法
已知:F(x)=x4-4x3-6x2-16x+4,求极小值,极小值点,区间,迭代次数?用进退法确定区间,用黄金分割法求极值。
#include <stdio.h>
#include <math.h>
#define e 0.001
#define tt 0.01
float f(double x)
{
float y=pow(x,4)-4*pow(x,3)-6*pow(x,2)-16*x+4;
return(y);
}
finding(float *p1,float*p2)
{
float x1=0,x2,x3,t,f1,f2,f3,h=tt;
int n=0;
x2=x1+h;f1=f(x1);f2=f(x2);
if(f2>f1) {h=-h;t=x2;x2=x1;x1=t;}
do
{ x3=x2+h;h=2*h;f3=f(x3);n=n+1;}
while(f3<f2);
if(x1>x3) {t=x1;x1=x3;x3=t;}
*p1=x1;*p2=x3;
return(n);
}
gold(float *p)
{
float a,b,x1,x2,f1,f2; int n=0;
finding(&a,&b);
do
{x1=a+0.382*(b-a);
x2=a+0.618*(b-a);f1=f(x1);f2=f(x2);n=n+1;
if(f1>f2) a=x1;
else b=x2;}
while((b-a)>e);
*p=(x1+x2)/2;return(n);
}
main()
{
float a,b,x,min;int n1,n2;
n1=finding(&a,&b);
n2=gold(&x);
min=f(x);
printf("\n The area is %f to %f.",a,b); printf("\n The nunmber 1 is %d.",n1);
printf("\n The min is %f and the result is %f.",x,min);
二次插值法,黄金分割法
printf("\n The nunmber 2 is %d.",n2)
二插法
已知:F(x1,x2)=4*x1-x2的平方-12;求极小值,极小值点,迭代次数?
用复合形法求极值。约束条件:x2>=0; x1>=0; 25-x1的平方-x2的平方>=0; #include <stdio.h>
#include <math.h>
#define EP 0.0001
#define E 0.01
#define fori for(i=0;i<=1;i++)
int i;
float f(float *p)
{
float y;
y=4*p[0]-pow(p[1],2)-12;
return(y);
}
int cons(float *q)
{
int n;
if((pow(q[0],2)+pow(q[1],2)-25<=0)&&(q[0]>=0)&&(q[1]>=0))
n=1;
else
n=0;
return(n);
}
void paixu(float *p1,float *p2,float *p3)
{
float f1,f2,f3;
float L[2],M[2],H[2];
f1=f(p1);
f2=f(p2);
f3=f(p3);
fori { H[i]=p1[i];M[i]=p2[i];L[i]=p3[i];}
if(f1>f2)
{
if(f2<f3) if(f1>f3)
fori { M[i]=p3[i];L[i]=p2[i];}
else
fori { H[i]=p3[i];M[i]=p1[i];L[i]=p2[i];}
} else
if(f2<f3)
fori { H[i]=p3[i];L[i]=p1[i];}
else
二次插值法,黄金分割法
if(f1>f3)
fori { H[i]=p2[i];M[i]=p1[i];L[i]=p3[i];}
else
fori { H[i]=p2[i];M[i]=p3[i];L[i]=p1[i];}
fori { p1[i]=H[i];p2[i]=M[i];p3[i]=L[i];}
}
float r()
{
float rr;
do
rr=rand();
while(rr<=0);
rr=rr/32767;
return(rr);
}
main()
{
float x1[2]={2,1},x2[2]={4,1},x3[2]={3,3};
float XC[2],XR[2],A[2],B[2];
float H=1.3,FH,FR,FC,FL,cha,min,S;
int tf,tf1,tf2;
do
{
do
{
paixu(x1,x2,x3);
/*
fori printf("\n X1%d is %f,X2%d is %f,X3%d is %f.",i,x1[i],i,x2[i],i,x3[i]); */
fori XC[i]=(x2[i]+x3[i])/2;
/*
fori printf("\n XC%d is %f.",i,XC[i]);
*/
tf1=cons(XC);
if(tf1==0)
{
FC=f(XC);
FL=f(x3);
if(FL<FC)
fori { A[i]=x3[i];B[i]=XC[i];}
else
fori { A[i]=XC[i];B[i]=x3[i];}
do
{ S=r();x1[i]=A[i]+S*(B[i]-A[i]);tf2=cons(x1);}
二次插值法,黄金分割法
while(tf2==0);
do
{ S=r();x2[i]=A[i]+S*(B[i]-A[i]);tf2=cons(x2);}
while(tf2==0);
do
{ S=r();x3[i]=A[i]+S*(B[i]-A[i]);tf2=cons(x3);}
while(tf2==0);
}
}
while(tf1==0);
fori XR[i]=XC[i]+H*(XC[i]-x1[i]);
/*
fori printf("\n XR%d is %f.",i,XR[i]);
*/
FH=f(x1);
FR=f(XR);
tf=cons(XR);
if(tf&&(FR<FH))
{
fori x1[i]=XR[i];
/*
printf("\n 1");
*/
}
else
H=H/2;
/*
printf("\n H is %f.",H);
*/
if(H<EP)
fori { x1[i]=x2[i];H=1.3;}
cha=(pow((f(x1)-f(x3)),2)+pow((f(x2)-f(x3)),2))/2; /*
printf("/n Cha is %f.",cha);
*/
}
while(cha>E);
min=f(x3);
printf("\n The Min is %f.",min);
fori printf("\n The X%d is %f.",i,x3[i]);
…… 此处隐藏:899字,全部文档内容请下载后查看。喜欢就下载吧 ……