c++关于矩阵的计算题Word文档格式.docx
- 文档编号:7913171
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:16
- 大小:17.98KB
c++关于矩阵的计算题Word文档格式.docx
《c++关于矩阵的计算题Word文档格式.docx》由会员分享,可在线阅读,更多相关《c++关于矩阵的计算题Word文档格式.docx(16页珍藏版)》请在冰点文库上搜索。
表3比叶重、气孔密度、叶绿素含量与光合速率实测数据
-------------------------------------------------------------------
品种比叶重气孔密度叶绿素含量光合速率模型值相对误差
编号x1x2x3yymr%
12.0212.53.4311.22
21.9910.84.9911.08
31.7810.73.016.37
41.978.84.319.40
51.9410.24.409.84
5因变量y是自变量x的非线性函数,已得到实测数据见表2,假定y可以用x的3次多项式近似表示,即y对x的多项式回归模型为
y=b0+b1x+b2x2+b3x3
请求出模型蚕数b0、b1、b2和b3,计算模型值ym与相对误差r%并填入表2中。
表2实测数据
------------------------------
xyymr%
06.22
15.46
24.70
33.85
42.48
50.70
-------------------------------
6请以SAMPLE记事本程序为基础,复制一个副本来修改,把前面完成的解题程序修改后添加到记事本程序中,使得可以在记事本中通过下拉菜单操作完成全部解题过程。
解答:
#include<
iostream.h>
classMatrix
{
intRowMax,ColMax;
public:
float**Mat;
Matrix(intrm,intcm)//构造函数
RowMax=rm;
ColMax=cm;
Mat=newfloat*[rm];
for(inti=0;
i<
rm;
i++)
Mat[i]=newfloat[cm];
}
~Matrix(){}//析构函数
voidInput()//输入
{
cout<
<
"
请输入矩阵:
\n"
;
RowMax;
for(intj=0;
j<
ColMax;
j++)
cin>
>
Mat[i][j];
intGetRowMax(){returnRowMax;
}//取矩阵的行数
intGetColMax(){returnColMax;
}//取矩阵的列数
voidMatrix:
:
GetRow(constintn)//取矩阵某一行的全部元素
Matrix(:
"
n<
)=\n"
'
\t'
i++)
Mat[n-1][i]<
\n'
MatrixMatrix:
GetCol(constintn)//取矩阵某一列的全部元素
constintrm=RowMax;
constintcm=0;
Matrixmat1(rm,cm);
mat1.Mat[i][0]=Mat[i][n-1];
for(intl=0;
l<
l++)
{
mat1.Mat[l][0]<
returnmat1;
voidPrint()//显示矩阵
Matrix=\n"
Mat[i][j]<
}
Matrixoperator+(Matrix&
m)//矩阵加法;
可直接写Matrixt1(2,2),t2(2,2),t3(2,2);
t3=t1+t2
Matrixt(RowMax,ColMax);
t.Mat[i][j]=Mat[i][j]+m.Mat[i][j];
returnt;
Matrixoperator-(Matrix&
m)//矩阵减法;
t3=t1-t2
t.Mat[i][j]=Mat[i][j]-m.Mat[i][j];
Matrixoperator*(Matrix&
m)//矩阵乘法;
可直接写Matrixt1(2,3),t2(3,2),t3(2,2);
t3=t1*t2
Matrixt(RowMax,m.ColMax);
m.ColMax;
floatsum=0;
for(intk=0;
k<
k++)
sum+=Mat[i][k]*m.Mat[k][j];
t.Mat[i][j]=sum;
MatrixTrans();
//矩阵转置
MatrixInv();
//矩阵求逆
};
Trans()
constintrm=RowMax;
constintcm=ColMax;
Matrixtmat(cm-1,rm);
for(inti=0;
cm-1;
tmat.Mat[i][j]=Mat[j][i];
cout<
Matrix'
=\n"
for(i=0;
tmat.Mat[i][j]<
}returntmat;
Inv()
Matriximat(rm,cm-1);
Matrixmat(rm,cm);
mat.Mat[i][j]=Mat[i][j];
for(intl=0;
mat1.Mat[l][0]=Mat[l][cm-1];
imat.Mat[i][j]=0;
imat.Mat[i][i]=1;
inth,p,q,j,k;
floattemp,temp2;
i++)//i为列
for(k=i;
k++)//k为行
{if(mat.Mat[k][i]!
=0)
h=k;
//h记住每列中从对角线起第一个非零的元素所在行数
k=rm;
//一经发现每列中第一个元素不为零,则改变k值,k=rm了,则跳内出循环,返回到外循环
}//内循环结束
if(k==rm)
您输入的矩阵没有逆!
!
endl;
i=rm;
else
if(h!
=i)//对角线元素为零,就是说在一列中找到的那个第一个非零的元素不在对角线上
for(j=0;
mat.Mat[i][j]=mat.Mat[i][j]+mat.Mat[h][j];
mat1.Mat[i][j]=mat1.Mat[i][j]+mat1.Mat[h][j];
imat.Mat[i][j]=imat.Mat[i][j]+imat.Mat[h][j];
}//则对角线元素不为零了
temp=mat.Mat[i][i];
for(j=0;
mat.Mat[i][j]=mat.Mat[i][j]/temp;
//把对角上的数单位化
mat1.Mat[i][j]=mat1.Mat[i][j]/temp;
imat.Mat[i][j]=imat.Mat[i][j]/temp;
for(p=0;
p<
p++)
if(i!
=p)//此行不用动
temp2=mat.Mat[p][i];
//非对角线元素
for(q=0;
q<
q++)
mat.Mat[p][q]=mat.Mat[p][q]-temp2*mat.Mat[i][q];
mat1.Mat[p][q]=mat1.Mat[p][q]-temp2*mat1.Mat[i][q];
imat.Mat[p][q]=imat.Mat[p][q]-temp2*imat.Mat[i][q];
}//外循环结束
if(k!
=rm)
{
Inverse=\n"
imat.Mat[i][j]<
answer=\n"
for(l=0;
returnimat;
}voidmain()
{intmenu;
1求方程组的解和系数矩阵的逆矩阵\n"
2求各精矿及尾矿的理论产率\n"
3求矛盾线性方程组的相关矩阵和解\n"
4求多元线性回归的相关矩阵和模型参数\n"
5求多项式回归的相关矩阵和模型参数\n"
6退出\n"
请选择功能(1-6):
menu;
switch(menu)
{case1:
Matrixmat1(3,4);
mat1.Input();
mat1.Inv();
break;
case2:
Matrixmat1(4,5);
}
case3:
Matrixmat1(6,5),mat2(4,6),mat3(4,5);
mat2=mat1.Trans();
mat3=mat1*mat2;
mat3.Inv();
case4:
{floatb0,b1,b2,b3;
inti;
floatym[5],r[5];
Matrixmat1(5,5),mat2(4,5),mat3(4,5),mat4(4,4),mat5(4,1),mat7(4,1);
mat3=mat1.Trans();
mat2=mat3*mat1;
for(i=0;
4;
mat5.Mat[i][0]=mat2.Mat[i][4];
mat4=mat2.Inv();
mat7=mat4*mat5;
b0=mat7.Mat[0][0];
b1=mat7.Mat[1][0];
b2=mat7.Mat[2][0];
b3=mat7.Mat[3][0];
回归模型是:
y="
b0<
+"
b1<
*x1+"
b2<
*x2+"
b3<
*x3"
ym[0]=b0+b1*mat1.Mat[0][1]+b2*mat1.Mat[0][2]+b3*mat1.Mat[0][3];
ym[1]=b0+b1*mat1.Mat[1][1]+b2*mat1.Mat[1][2]+b3*mat1.Mat[1][3];
ym[2]=b0+b1*mat1.Mat[2][1]+b2*mat1.Mat[2][2]+b3*mat1.Mat[2][3];
ym[3]=b0+b1*mat1.Mat[3][1]+b2*mat1.Mat[3][2]+b3*mat1.Mat[3][3];
ym[4]=b0+b1*mat1.Mat[4][1]+b2*mat1.Mat[4][2]+b3*mat1.Mat[4][3];
模型值"
5;
ym"
(i+1)<
="
ym[i]<
"
相对误差"
r[i]=(ym[i]-mat5.Mat[i][0])/mat5.Mat[i][0];
r"
r[i]<
回归模型合理"
}break;
case5:
{floatb0,b1,b2,b3;
inti,j;
floatym[6],r[6];
Matrixmat1(6,2),mat3(4,6),mat4(4,4),mat5(4,5),mat6(4,1),mat7(4,1),mat8(6,5);
mat1.Input();
6;
mat8.Mat[i][0]=1;
mat8.Mat[i][1]=mat1.Mat[i][0];
mat8.Mat[i][2]=mat1.Mat[i][0]*mat1.Mat[i][0];
mat8.Mat[i][3]=mat1.Mat[i][0]*mat1.Mat[i][0]*mat1.Mat[i][0];
mat8.Mat[i][4]=mat1.Mat[i][1];
变换后:
for(j=0;
mat8.Mat[i][j]<
mat3=mat8.Trans();
mat5=mat3*mat8;
mat6.Mat[i][0]=mat5.Mat[i][4];
mat4=mat5.Inv();
mat7=mat4*mat6;
b0=mat7.Mat[0][0];
b1=mat7.Mat[1][0];
b2=mat7.Mat[2][0];
b3=mat7.Mat[3][0];
*x+"
ym[0]=b0+b1*mat8.Mat[0][1]+b2*mat8.Mat[0][2]+b3*mat8.Mat[0][3];
ym[1]=b0+b1*mat8.Mat[1][1]+b2*mat8.Mat[1][2]+b3*mat8.Mat[1][3];
ym[2]=b0+b1*mat8.Mat[2][1]+b2*mat8.Mat[2][2]+b3*mat8.Mat[2][3];
ym[3]=b0+b1*mat8.Mat[3][1]+b2*mat8.Mat[3][2]+b3*mat8.Mat[3][3];
ym[4]=b0+b1*mat8.Mat[4][1]+b2*mat8.Mat[4][2]+b3*mat8.Mat[4][3];
ym[5]=b0+b1*mat8.Mat[5][1]+b2*mat8.Mat[5][2]+b3*mat8.Mat[5][3];
r[i]=(ym[i]-mat1.Mat[i][1])/mat1.Mat[i][1];
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c+ 关于 矩阵 算题