|
楼主 |
发表于 2004-5-14 08:44:54
|
显示全部楼层
<>/*改进坐标轮换法求多元函数极小值 DIRECT.C */</P><>#include<conio.h></P><>#include<math.h></P><P>#include<stdio.h></P><P>#define N 2</P><P>int j; double x[N];</P><P>double fun(double x[])</P><P>{</P><P>return(cos(x[0]*x[0])+x[0]-x[1]+2.0*x[0]*x[0]+2.0*x[0]*x[1]+x[1]*x[1]+log(1.0+x[1]*x[1]));</P><P>}</P><P>double fx(double y[],double lbt)</P><P>{</P><P>int i;</P><P>for(i=0;i<N;i++) x=y; x[j]=y[j]+lbt;</P><P>return(fun(x));</P><P>}</P><P> <p></p></P><P>double fy(double y[],double lbt)</P><P>{</P><P>int i; double x2[2];</P><P>for(i=0;i<N;i++) x2=x+lbt*y;</P><P>return(fun(x2));</P><P>}</P><P>double ca_min(double a,double b,double eps,double (*fun)(),double y[])</P><P>{</P><P>double c,x1,x2,x3,f1,f2,f3;</P><P>c=(b-a)*0.25; x1=a+c; f1=fun(y,x1);</P><P>x2=x1+c; f2=fun(y,x2); x3=x2+c; f3=fun(y,x3);</P><P>for(;;)</P><P> {</P><P> if(f1<=f2&&f1<f3)</P><P> { b=x2; x2=x1; f2=f1; }</P><P> else if(f3<=f2&&f3<f1)</P><P> { a=x2; x2=x3; f2=f3; }</P><P> else</P><P> { a=x1; b=x3; }</P><P> c=(b-a)*0.25;</P><P> if(fabs(c)<eps)break;</P><P> x1=a+c; f1=fun(y,x1); x3=x2+c; f3=fun(y,x3);</P><P> }</P><P>return(x2);</P><P>}</P><P>int direct(double x0[],double eps)</P><P>{</P><P>int i; unsigned k=0; double lbt,px,x1[N],y[N];</P><P>for(i=0;i<N;i++)y=x0;</P><P>while(k<200)</P><P> {</P><P> for(j=0;j<N;j++)</P><P> {</P><P> lbt=ca_min(-1.0,1.0,eps*0.01,fx,y); y[j]=y[j]+lbt;</P><P> }</P><P> px=0.0;</P><P> for(i=0;i<N;i++)</P><P> {</P><P> x=x1=y; y=x1-x0;</P><P> x0=x1; px+=(y*y);</P><P> }</P><P> if(px<eps)break;</P><P> lbt=ca_min(-2.0,2.0,eps*0.1,fy,y);</P><P> for(i=0;i<N;i++) y=x1+lbt*y;</P><P> k++;</P><P> }</P><P>return(1);</P><P>}</P><P> <p></p></P><P>main()</P><P>{</P><P>int i;</P><P>double x0[N],eps=1.0e-014;</P><P>x0[0]=2.0;x0[1]=3.0;</P><P>direct(x0,eps);</P><P>printf("\nf(X) = %12.10lf ",fun(x0));</P><P> for(i=0;i<N;i++)</P><P> printf("\nx[%d] = %12.10lf ",i,x0);</P><P>}</P> |
|