广东工业大学实验报告.docx

上传人:b****8 文档编号:10342282 上传时间:2023-02-10 格式:DOCX 页数:15 大小:410.72KB
下载 相关 举报
广东工业大学实验报告.docx_第1页
第1页 / 共15页
广东工业大学实验报告.docx_第2页
第2页 / 共15页
广东工业大学实验报告.docx_第3页
第3页 / 共15页
广东工业大学实验报告.docx_第4页
第4页 / 共15页
广东工业大学实验报告.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

广东工业大学实验报告.docx

《广东工业大学实验报告.docx》由会员分享,可在线阅读,更多相关《广东工业大学实验报告.docx(15页珍藏版)》请在冰豆网上搜索。

广东工业大学实验报告.docx

广东工业大学实验报告

广东工业大学实验报告

应用数学学院09信息计算专业

(2)班成绩评定_______

学号3109008538姓名刘艳明教师签名_______

实验题目P150E9第9周星期五第1—2节

编写:

用牛顿、平分、成功—失败法、黄金分割法和进退法求函数f(x)的极小点的计算程序,并求解

1.牛顿法:

#include

usingnamespacestd;

classNewton

{

doublex;

doublef;

doublee;

public:

Newton(doublex1,doublee1)

{

x=x1;

e=e1;

f=x*x*x*x+-16*x*x*x+30*x*x+-24*x+8;

}

voidset(doublex1,doublee1)

{

x=x1;

e=e1;

f=3*x*x*x*x-16*x*x*x+30*x*x-24*x+8;

}

 

doublegetfirstf(doublex)

{

return(12*x*x*x-48*x*x+60*x-24);

}

doublegetsecondf(doublex)

{

return(36*x*x-96*x+60);

}

 

};

intmain()

{

doublex0=3;

inti=0;

Newtona=Newton(x0,0.01);

doublef1=a.getfirstf(x0);

doublef2=a.getsecondf(x0);

doublex1=x0-f1/f2;

while((x1-x0)>0.01||(x0-x1)>0.01)

{

i++;

x0=x1;

a.set(x0,0.01);

f1=a.getfirstf(x0);

f2=a.getsecondf(x0);

cout<<"thex0is:

"<

cout<<"thex1is:

"<

x1=x0-f1/f2;

}

cout<<"eeeeeeeeeeeeeeeeeeee"<

cout<<"thelastx0is:

"<

cout<<"thelastx1is:

"<

cout<<"迭代次数为:

"<

return0;

}

 

 

2.平分法:

 

#include

usingnamespacestd;

doublef2(doublel,doubleo,doublev,doublee);

doublea,b,eps,sita;

intmaxstep=30;

doublex[30];

intmain(){

cout<<"Pleaseentertheinitial区间左端点a:

";

cin>>a;

cout<

cout<<"Pleaseentertheinitial区间左端点b:

";

cin>>b;

cout<

cout<<"entertheeps:

";

cin>>eps;

cout<

cout<<"enterthemin|b-a|:

";

cin>>sita;

cout<

f2(a,b,eps,sita);

return0;

}

doublef2(doublel,doubleo,doublev,doublee)

{

for(inti=0;i

x[i]=(a+b)/2;

cout<<"["<

"<

doubledf1=5*x[i]*x[i]*x[i]*x[i]+8*x[i]*x[i]*x[i]-12*x[i]*x[i]+2*x[i]+1;

if(df1>0)

b=x[i];

else

a=x[i];

while(abs(df1)

cout<

return0;

}

}

}

 

3.成功—失败法

#include

usingnamespacestd;

doublefuntion1(doubleb,doubleu,doubleg);

doublefuntion2(doublex);

doublechong;

doubleh;

doubleeps;

doublemaxstep=30;

intmain(){

cout<<"Pleaseentertheinitialvaluex0:

";

cin>>chong;

cout<

cout<<"enterthesteplong(h>0):

";

cin>>h;

cout<

cout<<"andentertheeps(>0):

";

cin>>eps;

cout<

funtion1(chong,h,eps);

return0;}

doublefuntion1(doubleb,doubleu,doubleg){

doublex0=chong;

doublef0=funtion2(x0);

for(inti=0;i

doublef1=funtion2(x0+h);

//cout<<"h="<

cout<

if(f1

x0=x0+h;

f0=f1;

h=2*h;

}

else{

if(abs(h)

{

cout<<"chongchong:

theansweristhatyouwant0.0x*="<

return0;

}

else

h=-0.25*h;}

}

}

doublefuntion2(doublex){

doublef2=x*x*x*x*x+2*x*x*x*x-4*x*x*x+x*x+x+2;

returnf2;

}

 

4.黄金分割

#include

usingnamespacestd;

doublegoldivide(doublec,doubleh,doubleo);

doublef(doublex);

doublea[30];

doubleb[30];

doubleu[30];

doublev[30];

doubleeps;

intmaxstep=30;

intmain(){

cout<<"Pleaseentertheinitial区间左端点a:

";

cin>>a[0];

cout<<"andentertheinitial区间左端点b:

";

cin>>b[0];

cout<<"thelastentertheeps:

";

cin>>eps;

goldivide(a[0],b[0],eps);

return0;

}

doublegoldivide(doublec,doubleh,doubleo){

u[0]=a[0]+(1-0.618)*(b[0]-a[0]);

v[0]=a[0]+0.618*(b[0]-a[0]);

for(intk=0;k

cout<<"a["<

if((b[k]-a[k])

doublex0=0.5*(b[k]+a[k]);

cout<

cout<<"f(x0)="<

return0;

}

elseif(f(u[k])>f(v[k])){

a[k+1]=u[k];

b[k+1]=b[k];

u[k+1]=v[k];

v[k+1]=a[k+1]+0.618*(b[k+1]-a[k+1]);

f(v[k+1]);

}

else{

a[k+1]=a[k];

b[k+1]=v[k];

v[k+1]=u[k];

u[k+1]=a[k+1]+(1-0.618)*(b[k+1]-a[k+1]);

f(u[k+1]);}}}

doublef(doublex){

doublef1=x*x*x*x*x+2*x*x*x*x-4*x*x*x+x*x+x+2;

returnf1;

}

 

 

5.不确定精度一维搜索

#include

doublef(doublex1,doublex2);

doublef1(doublex1,doublex2);

doublef2(doublex1,doublex2);

intxk[2]={-1,1};

intsk[2]={1,1};

doublexk1[2];

doublec1=0.1;

doublec2=0.5;

doublea=0;

doubleb;

doubler=1;

intmain(){

usingnamespacestd;

 

doublefk=f(xk[0],xk[1]);

doublegk[2]={f1(xk[0],xk[1]),f2(xk[0],xk[1])};

doublegkTsk=gk[0]*sk[0]+gk[1]*sk[1];

cout<<"fk="<

cout<<"gkTsk="<

for(;;){

xk1[0]=xk[0]+r*sk[0];

xk1[1]=xk[1]+r*sk[1];

doublefk1=f(xk1[0],xk1[1]);

doublegk1[2]={f1(xk1[0],xk1[1]),f2(xk1[0],xk1[1])};

doublegk1Tsk=gk1[0]*sk[0]+gk1[1]*sk[1];

cout<<"r="<

cout<<"f(k+1)="<

cout<<"g(k+1)Tsk="<

if(fk-fk1>=-c1*r*gkTsk){

if(gk1Tsk>=c2*gkTsk){

doublerk=r;

cout<<"rk=:

"<

cout<<"x(k+1)=:

("<

return0;

}

else

{a=r;r=min(2*r,0.5*(r+b));}

}

else

{b=r;r=0.5*(r+a);}

}

}

doublef(doublex1,doublex2){

doublezf=100*(x2-x1*x1)*(x2-x1*x1)+(1-x1)*(1-x1);

returnzf;

}

doublef1(doublex1,doublex2){

doublezf1=-400*(x2-x1*x1)*x1-2*(1-x1);

returnzf1;

}

doublef2(doublex1,doublex2){

doublezf2=200*(x2-x1*x1);

returnzf2;

}

 

6.进退法

#include

usingnamespacestd;

doubledilemma(doublez,doublec);

doublef(doublex);

doublet[30];

doubleh;

doublea;

doubleb;

intmaxstep=30;

intmain(){

cout<<"Pleaseenterthevaguevaluet0:

";

cin>>t[0];

cout<

";

cin>>h;

dilemma(t[0],h);

return0;

}

doubledilemma(doublez,doublec){

cout<<"f(t[0])="<

t[2]=t[0]+h;

cout<<"f(t[2])="<

if(f(t[2])>f(t[0]))

h=-h;

for(;;){

t[1]=t[0]+h;

f(t[1]);

cout<<"f(t[1])="<

if(f(t[1])<=f(t[0])){

h=2*h;

t[2]=t[0];

t[0]=t[1];

}

else{

cout<<"f(t[1])>f(t[0])theend"<

a=min(t[1],t[2]);

b=max(t[1],t[2]);

break;

}

}

cout<<"it'stheansweryouwant:

êo["<

cout<<"andt[0]="<<0.5*(a+b);

return0;

}

doublef(doublex){

doublef1=x*x*x*x*x+2*x*x*x*x-4*x*x*x+x*x+x+2;

returnf1;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1