手机版

黄金分割法、二次插值法C语言编程

时间:2025-05-15   来源:未知    
字号:

二次插值法,黄金分割法

已知: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字,全部文档内容请下载后查看。喜欢就下载吧 ……
黄金分割法、二次插值法C语言编程.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
    ×
    二维码
    × 游客快捷下载通道(下载后可以自由复制和排版)
    VIP包月下载
    特价:29 元/月 原价:99元
    低至 0.3 元/份 每月下载150
    全站内容免费自由复制
    VIP包月下载
    特价:29 元/月 原价:99元
    低至 0.3 元/份 每月下载150
    全站内容免费自由复制
    注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
    × 常见问题(客服时间:周一到周五 9:30-18:00)