黄金分割法、二次插值法C语言编程
- 格式:docx
- 大小:14.09 KB
- 文档页数:4
已知:F(x)=x4-4x3-6x2-16x+4,求极小值,极小值点,区间,迭代次数?用进退法确定区间,用黄金分割法求极值。
#include
#include
#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 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 #include #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 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 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 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);}