该问题的根的搜索空间是,[0.31
Pressanyheytocontinuc_
2.用对分法求解
min(t)二t(t2)
已知初始单谷区间[a,b]"-3,5],要求按精度;=0.3,;=0.001分别计算.
对分法迭代的计算步骤:
(1)确定初始搜索区间[a,b],要求飞厂:
:
0,:
'(b)0。
1
(2)计算[a,b]的中点c(ab).
2
(3)若‘(c):
:
:
0,则a=c,转⑷;若‘(c)=0,则t^c,转⑸;若'(c)0,则
b=c,转⑷.
⑷若|a-b卜:
;,则t^2(ab),转⑸;否则转
(2).
⑸打印t*,结束
对分法的计算框图
程序清单
对分法程序见附录2
实验结果
运行结果为
3.用Newton法求解
min「⑴二t3-2t1已知初始单谷区间[a,b]二【°,1】,要求精度;=0.01.
Newton法的计算步骤
(1)确定初始搜索区间
[a,b],要求
'(a):
0,
'(b).0
⑵选定to
⑶计算t=t°-「'(t。
)/「"(to)
⑷若|t-tol-;,则to=t,转(3);否则转(5)
⑸打印匕建),结束.
Newton法的计算框图
程序清单
Newton法程序见附录3
实验结果
运行结果为:
'13regramFiles(K8&]\Micro^oftVisualStudia\M'/Propsets
|求解的结果是;=0.劭砧P丄匕时f=-0.0886621
Pressanvtocontinue
项目二一维搜索算法
(二)
[实验目的]
编写黄金分割法、抛物线插值法的程序。
[实验准备]
1.掌握黄金分割法的思想及迭代步骤;
2.掌握抛物线插值法的思想及迭代步骤。
[实验内容及步骤]
编程解决以下问题:
1.用黄金分割法求解
min(t)=t(t2)
已知初始单谷区间[a,b]=[-3,5],要求精度•;:
=0.001.
黄金分割法迭代步骤:
(1)确定:
(t)的初始搜索区间[a,b].
(2)计算t^a0.382(b-a)
(3)计算t|=a0.618(b-a)
*t+to
(4)若|ti-t2F;,则打印t12,结束;否则转⑸.
2
(5)判别是否满足_2:
若满足,则置a=t2,2=£,2=1
然后转⑶;否则,置
b二,1讥,1二2,2「「(b-a),2二住2)
然后转⑷.
黄金分割法的计算框图:
程序清单
黄金分割法程序见附录4
实验结果
运行结果为:
▼'D:
\ProgramFiles(x86)\MicrosoftVisualStudio\MyProject5\zuiyou\Debug\ziyuan.exe*
to功厂迭代次数为0]迭代结里为root=0-056函数值逬似为:
f=0.115136
Pressanvkeytocontinue.
2.用抛物线插值法求解
minf(x)=8x3-2x2-7x3
已知初始单谷区间[a,b]=[°,2].
:
=0.001
抛物线插值法的计算步骤:
(1)(t)<(to),所以相对to来说t是好点,故划掉区间[t°,t2],保留[ti,to]为新区
间,故置t2=to,(t2)":
(to),to二t,(t)="to),ti保持不变;
(2):
(t)(to),所以相对t来说to是好点,故划掉区间[t^t],保留[t,t2]为新区间,
故置t^t,(t)匚:
(tj,to与t2保持不变;
程序清单
抛物线插值法程序见附录5
实验结果
运行结果为:
■'D:
\ProgrannFiles(xS6)\MicrosoftVisualStudio\MyProject5\zu
迭代第黑
近似?
R:
0>630061
函数植近似为:
-0-203424^essanykeytocantinue
项目三常用无约束最优化方法
(一)
[实验目的]
编写最速下降法、Newton法(修正Newton法)的程序[实验准备]
1.掌握最速下降法的思想及迭代步骤。
2.掌握Newton法的思想及迭代步骤;
3.掌握修正Newton法的思想及迭代步骤。
[实验内容及步骤]
编程解决以下问题:
1.用最速下降法求
minf(X)25x;,X°=[2,2]T,二0.01
最速下降法计算步骤
(1)取初始点X(0),容许误差(精度);0,令k=0
(2)计算p(k)-八f(X(k))
(3)检验p(k)空;?
若是迭代终止,取X"=X(k),否则转4°
(4)求最优步长k:
minf(X(k)•'p(k))=f(X(k)•'kp(k))(—维搜索)
>:
-0
令X(k1)=x(k)「kP⑹,令k-k1,转2°
最速下降法的计算框图
程序清单
最速下降法程序见附录6
实验结果
运行结果为:
2.用Newton法求
minf(X)=60「10人「4x2Xx|-x1x2初始点X0=[0,0]丁,;=0・01.
Newton
法的计算步骤
(1)
给定初始点x),及精度;•°,令k=0;
(2)
(3)
'f(X)亠-,停止,极小点为x(k),否则转步骤(3);计算了2f(X(k))F令S(k)=—[H(X(k))],Vf(X(k));
令x(f=x(k)+s(k),k=k+1,转步骤
(2)。
程序清单
Newton法程序见附录7
实验结果
运行结果为
Anvkeytccantinus
3.用修正Newton求
minf(X)=4(X11)22(x2一1)2为x?
10初始点X0=[0,0]丁,疋r。
01.
修正Newton的计算步骤
(1)给定初始点x®,及精度;V,令k=0;
(2)若'丿I,停止,极小点为x(k),否则转步骤(3);
(3)计算FPF',令s(k—[H(X(k))e(X(k));
使得f(X(k「kSk()=)minfXk(J:
_0
程序清单
修正Newton程序见附录8
实验结果
运行结果为
项目四常用无约束最优化方法
(二)
实验目的
编写共轭梯度法、变尺度法(DFP法和BFGS法)程序。
实验准备
1.掌握共轭方向法的思路及迭代过程;
2.掌握共轭梯度法的思想及迭代步骤;
3.掌握DFP法和BFGS法的思想及迭代步骤。
实验内容及步骤
编程解决以下问题:
1.用共轭梯度法求得min(x「4x;),取初始点X。
二【1,1「,;=0.01.
共轭梯度法算法步骤
(4)。
程序清单
共轭梯度法程序见附录9
实验结果
运行结果为
D:
\ProgramFiles(x86J\MicrosciftVisualStudio\MyProjerts\zu|y°ebug\z>yn
请输入函数的元数值”2请输入初始值:
1
1
Ml=-«i_0Pf1flW2,5(2=-H.ap2=»_aiawwi
(a.b]-1-4.SeRHBB^lV5MHHHI
pl=0•E凶电M■说F*KeHHH0.t=0.-17-1238
Ml—0H@S0@@@*m2=0■BBQaO0Pi>i=O<000898.p2=-0.0B3B05U^bJ»[-4B5Se000UJ580OB8]
^1-0.066600,p2—B・60QBO5.t-0・020810
Mtt^zDx1"-0■000800>x2—8・000860
厳终的凿數値为曾-SB@00BPreasanykeytocuniti.nu.cH
■22
2.用共轭梯度法求minf(X)=2Xi•X2-皿2,自定初始点,;=0.01.
程序清单
共轭梯度法程序见附录9
实验结果
运行结果为
3.用DFP法求minf(X)=4(Xi-5)(X2-6),初始点X。
珂8,9]丁,=°.°1
DFP法的具体迭代步骤如下
(1)给定初始点一:
迭代精度己,维数n
(2)置0tk,单位矩阵,计算席炉
(3)计算搜索方向-
(4)进行一维搜索求1,使
/M叫卅評)亠呻気0护)
得迭代新点-/-■'-■:
-
(5)检验是否满足迭代终止条件H‘11?
若满足,停止迭代,输出最优解
-二,-:
>'■:
;否则进行下一步。
(6)检查迭代次数,若k=n,则置..'',转向步骤
(2);若k步。
(7)计算:
DFP法的计算框图
程序清单
DFP法程序见附录10
实验结果
运行结果为:
DFF^
函錚=4(Xl-5>^2t*2.的极小点为if=0砥荐根小点为自变量取值为|
xd=5
x2=6
卩尸耳貝盂Rrnub:
Ftijnnrif:
~im[iiE_
项目五常用约束最优化方法
[实验目的]
编写外点罚函数法、外点罚函数法的程序
[实验准备]
1•掌握外点罚函数法的思想及迭代步骤;
2.掌握内点罚函数法的思想及迭代步骤。
[实验内容及步骤]
编程解决以下问题:
1.用外点罚函数法编程计算
minf(X)二-x2,
Q(X)=InX2A0,
st.丿h(X)=捲+x2—1=0,
精度;=101
外点法的计算步骤:
(1)给定初始点X(0),初始罚因子■⑴,
放大系数c>1;允许误差e>0,设置k=1;
(2)以x(k-1)作为搜索初始点,求解无约束规划问题
minf(xp■P(x),令x(k)为所求极小点。
(3)当P(x(k)):
:
e,则停止计算,得到点x(k);否则,令’(kT)=c'(k),返回
(2)执行。
程序清单
外点罚函数法程序见附录11
实验结果
实验结果为
2.用内点罚函数法编程计算
3
min3(x11)
X2
st.
Xi-■1一0,x2—0.
初始点取为X。
心4r,
初始障碍因子取Ui=10缩小系数取c=0.1.
内点罚步骤
障碍参数⑴,缩小系数b•(0,1),置k=1;
(2)以x(k①为初始点,求解下列规划问题
令x(k)为所求极小点
minf(x)(k)B(x)
s.t.xS
(3)如果(k)B(x(k)):
:
:
e,则停止计算,得到结果x(k),
(4)否则令(k1)=b(k),置k=k+1,返回
(2)。
内点罚计算框图
程序清单
内点罚函数法程序见附录12
实验结果
运行结果为
附录1
#include#include#defineMAX20480doublefun(doublex){
returnx*x*x-2*x+1;
}
doubleMax_Num(doublea,doubleb)
{
if(a>b)
returna;
else
returnb;
}
doubleMin_Num(doublea,doubleb){
if(a
returna;
else
returnb;
}
voidStepAdding_Search(double&a,double&b)
{
doublet[MAX]={0};
doubleh[MAX]={0};
doublef[MAX]={0};
doubleresult=0;
doublep=2;
t[0]=0;
h[0]=1;
f[0]=fun(t[0]);
for(intk=0;k{
t[k+1]=t[k]+h[k];
f[k+1]=fun(t[k+1]);
if(f[k+1]vf[k])
{
h[k+1]=p*h[k];
result=t[k];
t[k]=t[k+1];
f[k]=f[k+1];
}
elseif(k==0)
{
h[k]=-h[k];
result=t[k+1];
}
else{
a=Min_Num(result,t[k+1]);b=Max_Num(result,t[k+1]);
}
}
}
intmain()
{
doublea=0.0;
doubleb=0.0;
StepAdding_Search(a,b);
「vvaCOUt«"该问题的根的搜索空间是
return0;
}
附录2
#include
#include
#defineeps0.001
doublefun(doublex)
{
returnx*x+2*x;
}
doublediff_fun(doublex)
{
return2*x+2;
}
doubledichotomy(doublea,doubleb)
{
doublec=0.0;
if((diff_fun(a)<0)&&(diff_fun(b)>0))
{
while(true)
{
c=(a+b)/2;
if(diff_fun(c)<0)
{
a=c;
if(fabs((a-b)){
return(a+b)/2;
}
}
elseif(diff_fun(c)==0)
{
returnc;
}
else
{
b=c;
if(fabs((a-b)){
return(a+b)/2;
}}}}}
intmain()
{
doublea=-3.0;
doubleb=5.0;
doubleresult=dichotomy(a,b);
coutvv"求解的结果是:
"vvresultvvendl;
return0;
}
附录3
#includeviostream.h>
#includevmath.h>
#defineeps0.01
doublefun(doublex)
{
returnx*x*x-2*x+1;
}
doublediff_fun(doublex)
{
return3*x*x-2;
}
doublediff_2_fun(doublex)
{
return6*x;
}
doublenewton(doublea,doubleb)
{
doubleresult=(a+b)/2;
doublet=0.0;
while(true)
{
t=result-(diff_fun(result)/diff_2_fun(result));
if(fabs((t-result))veps)
{
returnresult;
}
else
{
result=t;
}
}
}
intmain()
{
doublea=0.0;
doubleb=3.0;
doublex=newton(a,b);
coutvv"求解的结果是x="vvxvvendl;
coutvv"此时f(x)="vvfun(x)vvendl;
return0;
}
附录4
#includeviostream>
#includevmath.h>
usingnamespacestd;
doublefun(doublet)
{
return(t*t+2*t);
}
voidGoldensection(double(*pfun)(doublet))
{
intmaxflag=1000,k=1;
doublea=-3,b=5,err=0.001,t,t1,t2;
do
{
t1=a+0.618*(b-a);
t2=b-0.618*(b-a);
if(t1=t2){a=t2;b=t1;}
else{if(t1vt2){a=t2;}
else{b=t1;}}
k++;
}while(fabs(a-b)>err&&kvmaxflag);
if(k>=maxflag)
coutvvendlvv"黄金分割法迭代失败!
迭代次数为k="vvkvvendl;else
{
t=(a+b)/2;
coutvvendlvv"黄金分割法迭代成功!
迭代次数为k="vvk-1vvendl;
:
f(root)="vvfun(t)vvendl;}
coutvv"迭代结果:
近似根为root="vvtvvendl;coutvv"函数值近似为
}
intmain()
{
Goldensection(fun);
return0;
}
附录5
#include
#include
usingnamespacestd;
doublefun(doublex)
{
return(8*x*x*x-2*x*x-7*x+3);
}
doublemax(doublea,doubleb)
{
if(a>b)returna;
elsereturnb;
}
doublemin(doublea,doubleb)
{
if(a>b)returnb;
elsereturna;
}
voidParainterpolation(double(*pfun)(doublex)){
doublea=0,b=2,err=0.001,x=0,x0=1,f,f0;
do
{
x=((x0*x0-b*b)*fun(a)+(b*b-a*a)*fun(x0)+(a*a-x0*x0)*fun(b))/(2*((x0-b)*fun(a)+(b-a)*fun(x0)+(a-x0)*f
un(b)));
f0=fun(x0);
f=fun(x);
if(f=f0){a=min(x,x0);b=max(x,x0);x0=(a+b)/2;}
else{
if((fun(x)-f0)*(x-x0)>0)
{
b=max(x,x0);x0=min(x,x0);
}
else
{
a=min(x,x0);x0=max(x,x0);
}
}
}while(fabs(x-x0)>err);
x=(x+x0)/2;
coutvv"迭代结果:
"wendl;
"]X*[|jER=[|JdIO】x*[o]耳乙=【0】dh]b*pwE|+[|Jx=[|Jx!
[o]6¥piue|+[o]x=[o]x!
(e161x)epLue|=piue|}(00乙=>辭头(【116JL]6+[o]6¥[o]6)lJbs)9|!
i|M!
|pus»;noo!
o=!
h】d-=[|Jb!
[o]d-=[o]6堆17】e+【0】x*[乙]e+[|jx*[订耳乙)=[|Jd乂【£]e+【|Jx*[乙]e+[o]x*[o]耳乙)=[0】d!
[i]e«uio(++!
!
9>!
:
0=!
)JOj!
|pu9»H:
[g]e、[朋、[£旧、⑵e、[圧[ole:
诲翌阴诲國Y嗨逖羽舆..»inoo
!
|pu9»11[g]e+sx[i7]e+以[£旧+乙xjxNe+乙xrx[订盼|,x^x[o]e=(x)j华莎沁..»inoo!
u=[|,]x!
iu=[o]x!
u«uio!
iu«uio!
|PU9»uu\:
旬阴[|JxTo]xu»inoo
0VVUQ!
|PU9»H9固耿Y嗨舆u»inoo:
0=!
iuitu'iu'A'o'[乙]b'[乙]dsiqnopl9】E'【£]x'piUE|©iqnop!
|pus»;noolPU9»u番孫马吴自畐搦W窖搦$蚩劉丄堪窖u»inoo
}OuiblupioA{!
sujn;sj!
(^bus)/21UB|-=s!
s9|qnop!
((21de)/v\od+(21[oK[o]B)Mod)-=2iue|
堆lJx*[|Jx*©[|jE)/v\od+[o]x*[o]x*(y[o】E)Mod)=MH:
3iue|£|,iue|令iqnop}([s]b°|qnop'[乙]d°|qnop'[乙]x°|qnop)wpiUE|令|qnop9pnQU!
#9pnQU!
#9沓朗
{:
0ujn;sj!
(unj)uo!
;e|odj9;u!
ejec|
}OujBiuM
{!
|pu9»(x)un»,,:
■沏必旬滋国..»inoo!
|pu9»x»H:
制沏必„»inoo
g【o]=-P【o】;
g【i]=-P【i];
i++;
coutvv'
I******************************************I
'vvendl;
coutvv"第"vvivv"次迭代结果:
"vvendl;
cout<<"p的模为:
"vvsqrt(g[0]*g[0]+g[1]*g[1])vvendl;
coutvv'x的值"vvx[0]