}
}
//////////////////////////////////////////////////////////////////////
double**jzcj(double**a,intm,intn,double**b,intp,intq>//矩阵乘积
{
inti,j。
double**c。
c=newdouble*[m]。
for(i=0。
ii++>
c[i]=newdouble[q]。
for(i=0。
ii++>
{
for(j=0。
jj++>
{
c[i][j]=0。
for(intx=0。
xx++>
{
c[i][j]=c[i][j]+a[i][x]*b[x][j]。
}
}
}
Print(c,m,q>。
returnc。
}
///////////////////////////////////////////////
double**jzdn(double**a,intm,intn>//矩阵的逆
{
inti,j,k。
doublec,**b,**t。
b=newdouble*[m]。
//动态分配空间
for(i=0。
ii++>
b[i]=newdouble[m]。
t=newdouble*[m]。
//动态分配空间
for(i=0。
ii++>
t[i]=newdouble[m]。
/////////////////////////////////////////矩阵求逆
/////////////////////////////////合并构成增广矩阵
for(i=0。
ii++>
{
for(j=0。
jj++>
{
b[i][j]=a[i][j]。
}
for(j=m。
j<2*n。
j++>
{
if(i+m==j>
b[i][j]=1。
else
b[i][j]=0。
}
}
cout<<"___________________________________求逆过程______________________________"<for(i=0。
ii++>//输出增广矩阵
{
for(j=0。
j<2*m。
j++>
cout<<cout<}
cout<<"\n"。
/////////////////初等行变化求逆
for(i=0。
ii++>
{
c=b[i][i]。
for(j=i。
jj++>
b[i][j]/=c。
for(j=i+1。
jj++>
{
c=b[j][i]。
for(k=i。
kk++>
b[j][k]=b[j][k]-c*b[i][k]。
}
}
for(i=0。
ii++>
{
for(j=0。
j<2*m。
j++>
cout<<cout<}
cout<<"\n"。
for(i=m-1。
i>=0。
i-->
{
c=b[i][i]。
for(j=i-1。
j>=0。
j-->
{
c=b[j][i]。
for(k=i。
kk++>
b[j][k]=b[j][k]-c*b[i][k]。
}
}
for(i=0。
ii++>
{
for(j=0。
j<2*m。
j++>
cout<<cout<}
for(i=0。
ii++>
{
for(j=m。
jj++>
t[i][j-m]=b[i][j]。
cout<<cout<}
returnt。
}
//////////////////////////////////////////////
double**jzzz(double**a,intm,intn>//矩阵转置
{
inti,j。
double**c。
c=newdouble*[n]。
for(i=0。
ii++>
c[i]=newdouble[m]。
for(j=0。
jj++>//矩阵的转置
{
for(intk=0。
kk++>
{
c[k][j]=a[j][k]。
}
}
Print(c,n,m>。
returnc。
}
voidmain(>
{
double**a,**b,**d,**e,**f,**g,**h。
inti,j,m,n,p,q。
cout<<"请输入矩阵a的行和列:
\n"。
cin>>m>>n。
a=newdouble*[m]。
for(i=0。
ii++>
a[i]=newdouble[m]。
cout<<"请输入矩阵a的数据:
\n"。
for(i=0。
ii++>
{
for(j=0。
jj++>
cin>>a[i][j]。
}//完成了对矩阵a的初始赋值
cout<<"请输入矩阵b的行和列:
\n"。
cin>>p>>q。
b=newdouble*[p]。
for(i=0。
i
i++>
b[i]=newdouble[p]。
cout<<"请输入矩阵b的数据:
\n"。
for(i=0。
i
i++>
{
for(j=0。
jj++>
cin>>b[i][j]。
}//完成了对矩阵b的初始赋值
cout<<"_________________原始矩阵_______________"<Print(a,m,n>。
//输出系数矩阵
cout<<"\n"。
Print(b,p,q>。
//输出常数矩阵
cout<<"系数矩阵a的转置矩阵1\n"。
d=jzzz(a,m,n>。
cout<<"系数矩阵a的转置矩阵与系数矩阵a的乘积所得矩阵2\n"。
e=jzcj(d,n,m,a,m,n>。
cout<<"系数矩阵a与其转置矩阵的乘积的逆矩阵3\n"。
f=jzdn(e,n,n>。
cout<<"矩阵的逆\n"。
Print(f,n,n>。
cout<<"系数矩阵a的转置矩阵与常数矩阵b的乘积所得矩阵4\n"。
g=jzcj(d,n,m,b,p,q>。
cout<<"最小二乘解x,y\n5"。
h=jzcj(f,n,n,g,n,q>。
}
3.2模块设计
3.2.1非线性方程的迭代解法
针对每一个模块给出主要的界面和代码
1、一般迭代法:
doubleFYiban(doublex>
{
returnpow((x+1>/2,1.0/3>。
}
voidYiban(>
{
x0=1.5。
t=1。
cout<<"一般线性迭代过程为:
"<while(t>=0.00001>
{
x1=FYiban(x0>。
t=x0-x1。
x0=x1。
printf("%.5lf\n",x0>。
}
printf("一般线性迭代结果为:
%.5lf\n\n",x0>。
}
2、牛顿迭代法:
doubleFNewton(doublex>
{
returnx-f(x>/(6*pow(x,2>-1>。
}
voidNewton(>
{
x0=1.5。
t=1。
cout<<"用Newton迭代过程为:
"<while(t>=0.00001>
{
x1=FNewton(x0>。
t=x0-x1。
x0=x1。
printf("%.5lf\n",x0>。
}
printf("用Newton迭代结果为:
%.5lf\n\n",x0>。
}
3、弦截法
doubleFXuanjie(doubleq,doubler>
{
returnq-f(q>*(q-r>/(f(q>-f(r>>。
}
voidXuanjie(>
{
x0=1.5。
x1=1.4。
t=1。
cout<<"用弦截法迭代过程为:
"<while(t>=0.00001>
{
x2=FXuanjie(x1,x0>。
t=x1-x2。
x0=x1。
x1=x2。
printf("%.5lf\n",x0>。
}
printf("用弦截法迭代结果为:
%.5lf\n\n",x0>。
}
4、主函数模块:
voidmain(>
{
cout<<"&&+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n**\t\t\t\t\t\t\t\t&&"<cout<<"&&\t选择用一般迭代法、牛顿法、弦截法求解方程:
2*x^3-x-1=0\t&&"<cout<<"&&\t\ta:
一般迭代法\t\t\t\t\t&&"<cout<<"&&\t\tb:
牛顿法\t\t\t\t\t&&"<cout<<"&&\t\tc:
弦截法\t\t\t\t\t&&"<cout<<"&&\t\td:
三种方法<以供比较)\t\t\t\t&&"<cout<<"&&+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&&"<charc=getchar(>。
switch(c>
{
case'a':
Yiban(>。
break。
case'b':
Newton(>。
break。
case'c':
Xuanjie(>。
break。
case'd':
Yiban(>。
Newton(>。
Xuanjie(>。
}
}
针对每一个模块给出主要的界面和代码
3.2.2最小二乘法
1、输入矩阵a和b
cout<<"请输入矩阵a的数据:
\n"。
for(i=0。
ii++>
{
for(j=0。
jj++>
cin>>a[i][j]。
}//完成了对矩阵a的初始赋值
cout<<"请输入矩阵b的行和列:
\n"。
cin>>p>>q。
b=newdouble*[p]。
for(i=0。
i
i++>
b[i]=newdouble[p]。
cout<<"请输入矩阵b的数据:
\n"。
for(i=0。
i
i++>
{
for(j=0。
jj++>
cin>>b[i][j]。
}//完成了对矩阵b的初始赋值
cout<<"_________________原始矩阵_______________"<Print(a,m,n>。
//输出系数矩阵
cout<<"\n"。
Print(b,p,q>。
//输出常数矩阵
2、系数矩阵a的转置矩阵1,系数矩阵a的转置矩阵与系数矩阵a的乘积所得矩阵2:
//////////////////////////////////////////////
double**jzzz(double**a,intm,intn>//矩阵转置
{
inti,j。
double**c。
c=newdouble*[n]。
for(i=0。
ii++>
c[i]=newdouble[m]。
for(j=0。
jj++>//矩阵的转置
{
for(intk=0。
kk++>
{
c[k][j]=a[j][k]。
}
}
Print(c,n,m>。
returnc。
}
3、系数矩阵a与其转置矩阵的乘积的逆矩阵3:
double**jzdn(double**a,intm,intn>//矩阵的逆
{
inti,j,k。
doublec,**b,**t。
b=newdouble*[m]。
//动态分配空间
for(i=0。
ii++>
b[i]=newdouble[m]。
t=newdouble*[m]。
//动态分配空间
for(i=0。
ii++>
t[i]=newdouble[m]。
/////////////////////////////////////////矩阵求逆
///////////