alei 发表于 2006-5-18 09:56

进退法、0.618法、Powell法、罚函数法的程序设计,急!!

<p>RT,《最优化方法》的题目<br/>涉及进退法、0.618法、Powell法、罚函数法的程序设计<br/>可用Matlab或C程序语言编程,需包含这四类算法。<br/>实例已给出如下,编一例类似程序。实在不行,可在此实例上适当修改。<br/>有感兴趣的,完成后可发到本人邮箱:<a href="mailto:aleiho@163.com">aleiho@163.com</a><br/>见回复确认后,立即加分结贴。<br/>p.s.:谢谢,急需。19日16时之前。</p><p><br/>一、进退法、0.618法、Powell法、罚函数法的Matlab程序设计<br/>罚函数法(通用)<br/>function y=ff(x,k)<br/>y=-17.86*0.42*x(1)/(0.8+0.42*x(1))*(1-exp(-2*(0.8+0.42*x(1))/3))*exp(-1.6)*x(2)-22.99*x(1)/(0.8+x(1))*(1-exp(-2*(0.8+x(1))/3))*x(3)+k*(x(2)-(1.22*10^2*(9517.8*exp(-1.6-2*0.42*x(1)/3)*x(2)+19035.6*exp(-2*x(1)/3)*x(3)))/(1.22*10^2+9517.8*exp(-1.6-2*0.42*x(1)/3)*x(2)+19035.6*exp(-2*x(1)/3)*x(3)))^2+k*(x(3)-exp(-0.8-2*x(1)/3)*x(3)-exp(-2.4-2*0.42*x(1)/3)*x(2))^2;<br/>% 主函数,参数包括未知数的个数n,惩罚因子q,惩罚因子增长系数k,初值x0,以及允许的误差r<br/>function G=FHS(x0,q,k,n,r,h,a)&nbsp;&nbsp; <br/>l=1;<br/>while (l)<br/>&nbsp;&nbsp;&nbsp; x=powell(x0,n,q,r(1),h,a);&nbsp; %调用powell函数<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g(1)=ff1(x),g(2)=ff2(x) . . . g(p)=ffp(x);&nbsp; %调用不等式约束函数,将其值<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%存入数组g<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; h(1)=hh1(x),h(2)=hh2(x) . . . h(t)=hht(x);&nbsp; %调用等式约束函数,将其值<br/>%存入数组h<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for i=1:p<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if g(i)&lt;r<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for j=1:t<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if abs(h(j))&lt;r(2)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (i==p)&amp;(j==t)&nbsp;&nbsp; %如果所有约束条件的值都在允许的范围内就结束<br/>%搜索,否则加大惩罚力度继续搜索<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l=0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x0=x;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q=k*q;<br/>&nbsp;&nbsp;&nbsp; end<br/>end<br/>&nbsp;&nbsp; G=x <br/>%powell算法,用于寻找无约束最优值点<br/>&nbsp;function&nbsp; powel=powell(x0,n,q,r,h,a)&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; d=eye(n);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %n个线性无关的初始搜索方向<br/>&nbsp;&nbsp;&nbsp; k=1;<br/>&nbsp;&nbsp;&nbsp; kk=1;<br/>&nbsp;&nbsp;&nbsp; xx(1,1:n)=x0;<br/>&nbsp;&nbsp;&nbsp; while (kk)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y(1,1:n)=xx(k,1:n);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for j=1:n<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s(j)=HJ(y(j,1:n),d(j,1:n),q);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %调用0.618算法<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y(j+1,1:n)=y(j,1:n)+s(j).*d(j,1:n);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d(n+1,1:n)=y(n+1,1:n)-y(1,1:n);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (norm(d(n+1,1:n),2)&lt;r)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; kk=0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ww=0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m=1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for i=1:n<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gg=ff(y(i,1:n),q)-ff(y(i+1,1:n),q);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (gg&gt;=ww)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m=i;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cha=ff(y(1,1:n),q)-2*ff(y(n+1,1:n),q)+ff(2*y(n+1,1:n)-y(1,1:n),q);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cha1=2*(ff(y(m,1:n),q)-ff(y(m+1,1:n),q));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (cha&lt;cha1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s(n+1)=HJ(y(n+1,1:n),h,a,d(n+1,1:n),q)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xx(k+1,1:2)=y(n+1,1:n)+s(n+1).*d(n+1,1:n)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for j=m+1:n<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d(j,1:n)=d(j+1,1:n);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k=k+1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xx(k+1,1:n)=y(n+1,1:n);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k=k+1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; powel=y(n+1,1:n)</p><p>function&nbsp; w=HJ(x0,h,d,dd,q)&nbsp;&nbsp; %0.618算法<br/>&nbsp;=JTF(x0,h,d,dd,q);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %调用进退法算法,确定范围<br/>&nbsp;&nbsp;&nbsp; r=0.618;<br/>&nbsp;&nbsp;&nbsp; r1=a+(1-r)*(b-a);<br/>&nbsp;&nbsp;&nbsp; r2=a+r*(b-a);<br/>&nbsp;&nbsp;&nbsp; y1=ff(x0+r1.*dd,q);<br/>&nbsp;&nbsp;&nbsp; y2=ff(x0+r2.*dd,q);<br/>&nbsp;&nbsp;&nbsp; k=1;<br/>&nbsp;&nbsp;&nbsp; while (abs(r1-r2)&gt;=0.1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if y1&lt;y2<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b=r2;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r2=r1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y2=y1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r1=a+(1-r)*(b-a);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y1=ff(x0+r1.*dd,q);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a=r1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r1=r2;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y1=y2;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r2=a+r*(b-a);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y2=ff(x0+r2.*dd,q);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end<br/>&nbsp;&nbsp;&nbsp; end<br/>&nbsp;&nbsp;&nbsp; w=(r1+r2)/2<br/>%进退法<br/>function =JTF(x0,h,d,dd,q) <br/>&nbsp;r0=0;<br/>&nbsp;&nbsp;&nbsp; y0=ff(x0+r0.*dd,q);<br/>&nbsp;&nbsp;&nbsp; k=0;<br/>&nbsp;&nbsp;&nbsp; l=1;<br/>&nbsp;&nbsp;&nbsp; while (l)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r1=r0+h;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y1=ff(x0+r1.*dd,q);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if y1&lt;y0<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; h=d*h;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r=r0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r0=r1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y0=y1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if k==0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; h=-h;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r=r0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l=0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k=k+1;<br/>&nbsp;&nbsp;&nbsp; end<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a=min(r,r1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b=max(r,r1);<br/>二、进退法、0.618法的C语言程序设计<br/>例1&nbsp; 设f(x)=x^2-2*x+4 ,试确定初始搜索区间,并输出迭代次数</p><p>main()<br/>{int n=0;<br/>float t,h,a,b,c,d,f1,f2;<br/>printf(“t,h:”);<br/>scanf(“%f,%f”,&amp;t,&amp;h);<br/>f1=t*t-2*t+4;<br/>if((t+h)*(t+h)-2*(t+h)+4&lt;=f1)<br/>{c=t+h;f2=c*c-2*c+4;}<br/>else<br/>{h=-h;c=t+h; f2=c*c-2*c+4;}<br/>while(f2&lt;=f1)<br/>{h=2*h;d=t;t=c;f1=f2;c=t+h; f2=c*c-2*c+4;n=n+1;}<br/>if(c&lt;=d)<br/>{a=c;b=d;}<br/>else<br/>{a=d;b=c;}<br/>printf(“=[%.2f,%f]\n”,a,b);<br/>printf(“n=%d\n”,n);<br/>}<br/>运行情况如下:<br/>(1)t,h:0,0.05 <br/>&nbsp;&nbsp;&nbsp;&nbsp; =<br/>&nbsp;&nbsp;&nbsp;&nbsp; n=4<br/>(2) t,h:-1.0,0.02 <br/>&nbsp;&nbsp;&nbsp;&nbsp; =<br/>&nbsp;&nbsp;&nbsp;&nbsp; n=7<br/>(3)t,h:-100,0.01 <br/>&nbsp;&nbsp;&nbsp;&nbsp; =[-59.05,63.83]<br/>&nbsp;&nbsp;&nbsp;&nbsp; n=13<br/>例2&nbsp; 用0.618法求f(x)=8x^3-2*x^2-7*x+3 的局部最优解.允许误差ε=0.0001 ,初始点设为x0=0 ,初始步长h=1 .</p><p>#include“math.h”<br/>float f(x)<br/>float x;<br/>float y;<br/>{y=((8.0*x-2.0)*x-7.0)*x+3.0;<br/>return(y);<br/>}<br/>main()<br/>{int n=0;<br/>float t,h,a,b,c,d,x0,f0,f1,f2,fc,fd;<br/>printf(“t,h:”);<br/>scanf(“%f,%f”,&amp;t,&amp;h);<br/>f1=f(t);<br/>if (f(t+h)&lt;=f1)c=t+h;<br/>else{h=-h;c=t+h;}<br/>f2=f(c);<br/>while(f2&lt;=f1)<br/>{d=t;t=c;f1=f2;c=t+h;f2=f(c);}<br/>if(c&lt;=d){a=c;b=d;}<br/>else{a=d;b=c;}<br/>c=a+0.382*(b-a);fc=f(c);d=a+0.618*(b-a);fd=f(d);<br/>do<br/>{if (fc&gt;=fd) {a=c;c=d;fc=fd;d=a+0.618*(b-a); fd=f(d);}<br/>else {b=d;d=c;fd=fc;c=a+0.382*(b-a);fc=f(c);}<br/>n++;<br/>}<br/>while (b-a&gt;0.0001);<br/>x0=(a+b)/2.0;f0=f(x0);<br/>pintf(“n=%d,x0=%7.4f,f0=%7.4f\n”,n,x0,f0);<br/>}<br/>运行情况如下:<br/>t,h:0,1.0 <br/>n=21,xo=0.6298,f0=-0.2034.</p><p><br/>&nbsp;</p>

zhcf 发表于 2006-7-15 20:03

呵呵~~好长...

powell 发表于 2006-7-15 20:50

函数里面的参数的顺序是不不对啊,需要从新调整

ammon 发表于 2007-5-24 18:56

<p>不太会啊,等待牛人</p>

ammon 发表于 2007-5-24 18:58

确实感觉有些参数不对

zhoyi 发表于 2007-6-14 14:50

有没有c++ 版?<br/><br/>
页: [1]
查看完整版本: 进退法、0.618法、Powell法、罚函数法的程序设计,急!!