实验报告35Word下载.docx
《实验报告35Word下载.docx》由会员分享,可在线阅读,更多相关《实验报告35Word下载.docx(16页珍藏版)》请在冰点文库上搜索。
return;
}
if(m_e==0)
请输入精度!
//迭代初值
longn=1;
doubleh=m_b-m_a;
//步长
doubletemp=h*(f(m_a)+f(m_b))/2.0,t;
doublep=m_e+1.0;
//精度控制
doublesum,x;
while(p>
=m_e)
sum=0.0;
for(longk=0;
k<
n;
k++)
x=m_a+(k+0.5)*h;
sum=sum+f(x);
t=(temp+h*sum)/2.0;
//keystep
p=fabs(t-temp);
temp=t;
n=n+n;
h=h/2.0;
m_n.Format("
%d"
n);
m_result.Format("
%lf"
t);
UpdateData(FALSE);
}
2.龙贝格程序代码
doublef1(doublex)
doublecomputerAutoT(doubleaa,doublebb,intn,double&
temp)
doubleh=(bb-aa)/n,t;
doublesum,x,Sn;
x=aa+(k+0.5)*h;
sum=sum+f1(x);
Sn=4/3*t-1/3*temp;
return(Sn);
voidRomberge:
OnOK()
Addextravalidationhere
doubleSn,S2n,S4n,S8n,Cn,C2n,C4n,Rn,R2n,p=m_e+1;
doubletemp=(m_b-m_a)*(f1(m_a)+f1(m_b))/2.0;
intn=1;
Sn=computerAutoT(m_a,m_b,n,temp);
while(p>
=m_e)
n=n+n;
S2n=computerAutoT(m_a,m_b,n,temp);
Cn=16/15*S2n-1/15*Sn;
S4n=computerAutoT(m_a,m_b,n,temp);
C2n=16/15*S4n-1/15*S2n;
Rn=64/63*C2n-1/63*Cn;
S8n=computerAutoT(m_a,m_b,n,temp);
C4n=16/15*S8n-1/15*S4n;
R2n=64/63*C4n-1/63*C2n;
p=fabs(R2n-Rn);
Sn=S2n;
R2n);
实验四源程序
1.改进欧拉法程序代码
doublef2(doublex,doubley)
return(-x*y*y);
doubleEuler(double&
x,doubley,doubleh)
doubleYk;
Yk=y+h/2*(f2(x,y)+f2(x+h,y+h*f2(x,y)));
x=x+h;
y=Yk;
returny;
voidGJEuler:
请输入x取值上下限!
if(m_h==0)
请输入步长!
if(m_y0==0)
请确认y的初值是否为0!
doubley[100],a=m_a;
y[0]=m_y0;
charbuffer[7];
for(inti=0;
i<
(m_b-m_a)/m_h;
i++)
y[i+1]=Euler(a,y[i],m_h);
gcvt(i,7,buffer);
m_Euler.InsertItem(i,buffer);
gcvt(a,7,buffer);
m_Euler.SetItemText(i,1,buffer);
gcvt(y[i+1],7,buffer);
m_Euler.SetItemText(i,2,buffer);
m_Euler.SetRedraw(TRUE);
y[i]);
BOOLGJEuler:
OnInitDialog()
CDialog:
OnInitDialog();
Addextrainitializationhere
m_Euler.InsertColumn(0,"
K"
m_Euler.InsertColumn(1,"
Xi"
m_Euler.InsertColumn(2,"
Yi"
RECTrect;
m_Euler.GetWindowRect(&
rect);
intwid=rect.right-rect.left;
m_Euler.SetColumnWidth(0,wid/3);
m_Euler.SetColumnWidth(1,wid/3);
m_Euler.SetColumnWidth(2,wid/3);
m_Euler.SetExtendedStyle(LVS_EX_FULLROWSELECT);
m_Euler.SetRedraw(FALSE);
returnTRUE;
//returnTRUEunlessyousetthefocustoacontrol
//EXCEPTION:
OCXPropertyPagesshouldreturnFALSE
2.四阶龙格-库塔法程序代码
doublef3(doublex,doubley)
doubleRunge_Kutta1(doublex,doubley,doubleh)
doublek1,k2,k3,k4;
k1=f3(x,y);
k2=f3(x+0.5*h,y+0.5*h*k1);
k3=f3(x+0.5*h,y+0.5*h*k2);
k4=f3(x+h,y+h*k3);
y=y+h/6*(k1+2*k2+2*k3+k4);
return(y);
voidRunge_Kutta:
Addextravalidationhere
if(m_x0==0&
m_xn==0)
doublex=m_x0,y[100];
fabs(x-m_xn)>
=1e-12;
i++,x=x+m_h)
y[i+1]=Runge_Kutta1(x,y[i],m_h);
m_Runge.InsertItem(i,buffer);
gcvt(x+m_h,7,buffer);
m_Runge.SetItemText(i,1,buffer);
m_Runge.SetItemText(i,2,buffer);
m_Runge.SetRedraw(TRUE);
初始化函数中的列表控件的操作同改进欧拉法
实验五源程序
1.高斯—塞德尔迭代法程序代码
数据读入同实验一中的高斯列主消元法
doubleabc(doublea[][10],doublex[],inti,intm)
doubles=0;
intj;
for(j=0;
j<
m;
j++)
if(i==j)
continue;
s+=a[i][j]*x[j];
return(s);
//G-S迭代
for(k1=1;
k1<
=100;
k1++)
doublee=0.0;
for(i=0;
m_m;
{
t=x0[i];
x0[i]=(b[i]-abc(a,x0,i,m_m))/a[i][i];
if(fabs((x0[i]-t)>
e))
e=fabs(x0[i]-t);
}
if(e<
m_E)
break;
//计算结果输出
charbuffer[50];
charstring[100];
charmin[10][15];
gcvt(x0[j],7,buffer);
strcpy(min[j],buffer);
k=0;
for(i=0;
for(j=0;
14&
min[i][j]!
='
\0'
;
string[k]=min[i][j];
k++;
string[k]='
'
k++;
string[k]='
m_k.Format("
k1);
%s"
string);
2.牛顿迭代法程序代码
voidFive_Newton:
if(m_E==0)
AfxMessageBox("
if(m_x0==0)
请确认初值是否为0!
doublexk1,xk0,x;
xk0=m_x0;
for(intk=0;
100;
xk1=xk0-f(xk0)/g(xk0);
if(fabs(xk1-xk0)<
m_E&
fabs(f(xk1))<
m_E)
x=xk1;
else
xk0=xk1;
x);
k);
运行结果
下图分别为
1.进入界面的主对话框
2.变步长梯形法的对话框
3.Romberge对话框
4.改进欧拉法对话框
5.四阶Romge-Kutta对话框
6.高斯-塞德尔对话框
7.牛顿迭代法对话框