![計算機程序?qū)嵺`報告_第1頁](http://file4.renrendoc.com/view7/M02/10/3A/wKhkGWb0Sp6AFCUvAACDMv4n2AM575.jpg)
![計算機程序?qū)嵺`報告_第2頁](http://file4.renrendoc.com/view7/M02/10/3A/wKhkGWb0Sp6AFCUvAACDMv4n2AM5752.jpg)
![計算機程序?qū)嵺`報告_第3頁](http://file4.renrendoc.com/view7/M02/10/3A/wKhkGWb0Sp6AFCUvAACDMv4n2AM5753.jpg)
![計算機程序?qū)嵺`報告_第4頁](http://file4.renrendoc.com/view7/M02/10/3A/wKhkGWb0Sp6AFCUvAACDMv4n2AM5754.jpg)
![計算機程序?qū)嵺`報告_第5頁](http://file4.renrendoc.com/view7/M02/10/3A/wKhkGWb0Sp6AFCUvAACDMv4n2AM5755.jpg)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
計算機程序設計
實踐報告
學院:資源加工與生物工程學院
班級:生物工程類1001班
指導教師:楊英杰
學號:_______0306100103_______
姓名:_________王蕾________
完成日期:2011年6月24日
1某選礦車間某班取樣化驗數(shù)據(jù)如表1,利用礦量平衡和金屬平衡可以列
出含四個方程的線性方程組,請利用行線性變換編程求出各精礦及尾礦的
理論產(chǎn)率,并填入表1相應位置。
表1各礦流的化驗品位
礦產(chǎn)化驗品位%
率
流%PbZnS
原礦100.003.0811.9214.58
鉛精礦X157.164.0821.19
鋅精礦X20.7956.5621.71
硫精礦
X32.062.9040.24
尾礦X40.250.734.93
解題思路:首先,本題主要的就是設計一個求解線性方程組的程序,而求解
線性方程組主要是通過矩陣的線性行變換來求解。由系數(shù)矩陣與常數(shù)項向量組成
增廣矩陣,通過線性行變換,當系數(shù)矩陣變?yōu)閱挝痪仃嚂r,那么變化后對應的常
數(shù)量就是對應的方程組地解。所以,解線性方程組的解法布驟歸結(jié)起來就是矩陣
的線性行變換。程序運行成功后,將其添加到界面程序中。
利用礦量和三種組分的進出平衡可列出四個線性方程組:
X1+x=100
x2+x3+4
57.16xi+0.79x2+2.06X3+0.25x4=3.08
4.08xi+56.56X2+2.90x3+0.73x4=11.92
21.19xt+31.17X2+40.24x3+4.93x4=14.58
獨立方程個數(shù)多于未知數(shù)個數(shù)
X=X]D=1111Y=100
x257.160.792.060.253.08
2.90
X34.0856.560.7311.92
xt21.1931.1740.244.9314.58
則方程組可以用矩陣方程表示為:
D*X=Y
程序如下:
#include<iostream.h>
classMatrix
(
intRowMax,ColMax;
public:
float**Mat;
Matrix(intrm,intcm)〃構(gòu)造函數(shù)
(
RowMax=rm;
ColMax=cm;
Mat=newfloat*[rm];
for(inti=0;i<rm;i++)
Mat[i]=newfloat[cm];
)
~Matrix(){}〃析構(gòu)函數(shù)
voidInput()〃輸入
(
cout?〃請輸入矩陣:\n〃;
for(inti=0;i<RowMax;i++)
for(intj=0;j<ColMax;j++)
cin?Mat[i][j];
}
intGetRowMaxO{returnRowMax;}〃取矩陣的行數(shù)
intGetColMaxO{returnColMax;}//取矩陣的列數(shù)
voidMatrix::GetRow(constintn)〃取矩陣某一行的全部元素
{
cout〈〈〃Matrix(:,”<<n<X〃)=\n"<<'\t’;
for(inti=0;i<ColMax;i++)
cout<<Mat[n-l][i]?,\t9;
cout?,\n';
}
voidMatrix::GetCol(constintn)〃取矩陣某一列的全部元素
(
cout?”Matrix(:,”<<n<<")=\n";
for(inti=0;KRowMax;i++)
cout?,\tf?Mat[i][n-l]<<,\n;
)
voidPrint()〃顯示矩陣
cout?z,Matrix=\n,z;
for(inti=0;i<RowMax;i++)
for(intj=0;j<ColMax;j++)
cout?Mat[i][j]<<,\tJ;
cout<<,\n,;
)
)
Matrixoperator*(Matrix&m)//矩陣乘法;可直接寫Matrix
tl(2,3),t2(3,2),t3(2,2);t3=tl*t2
(
Matrixt(RowMax,m.ColMax);
for(inti=0;i<RowMax;i++)
for(intj=0;j<m.ColMax;j++)
(
floatsum=0;
for(intk=0;k<ColMax;k++)
sum+=Mat[i]Mat[k][j];
t.Mat[i][j]=sum;
)
returnt;
)
MatrixTrans();〃矩陣轉(zhuǎn)置
MatrixInv();〃矩陣求逆
};
MatrixMatrix::Trans()
(
constintrm=RowMax;
constintcm=ColMax;
Matrixtmat(cm,rm);
for(inti=0;i<cm;i++)
for(intj=0;j<rm;j++)
tmat.Mat[i][j]=Mat[j][i];
cout??zMatrix,二、n〃;
for(i=0;i<cm;i++)
(
cout?,\V;
for(intj=0;j<rm;j++)
cout?tmat.Mat[i][j]\t*;
cout?,\n';
}
returntmat;
MatrixMatrix::Inv()
(
constintrm=RowMax;
constintcm=ColMax;
Matriximat(rm,cm);
Matrixmat(rm,cm);
for(inti=0;i<rm;i++)
for(intj=0;j<rm;j++)
mat.Mat[i][j]=Mat[i][j];
for(i=0;i<rm;i++)
for(intj=0;j<rm;j++)
imat.Mat[i][j]=0;
for(i=0;i<rm;i++)
imat.Mat[i][i]=l;
for(i=0;i<rm;i++)
(
〃若對角線上元素為0,則進行換行運算,使得對
角線上元素非零
(
intnpi;〃最大值的行下標
for(intj=0;j〈rm;j++)〃找到最大值的下標
if(mat.Mat[j][i]>mat.Mat[m][i])
(
m=j;
)
for(j=0;j<rm;j++)
(
floatn,x;
n=mat.Mat[i][j];
x=imat.Mat[i][j];
mat.Mat[i][j]=mat.Mat[m][j];
mat.Mat[m][j]=n;
imat.Mat[i][j]=imat.Mat[m][j];
imat.Mat[m][j]=x;
}
)
if(mat.[i]!=1)
(
floatt=mat.Mat[i][i];
for(intj=0;j<rm;j++)
mat.Mat[i][j]=mat.Mat[i][j]/t;
imat.Mat[i][j]=imat.Mat[i][j]/t;
)
)
for(intj=0;j<rm;j++)
(
if(i!=j)
(
floatt=mat.Mat[j][i]/mat.Mat[i][i];
for(intk=0;k<rm;k++)
(
mat.Mat[j][k]-=mat.Mat[i][k]*t;
imat.Mat[j][k]-=imat.Mat[i][k]*t;
)
)
)
}
cout?,,Matrix=\nzz;
for(i=0;i<rm;i++)
(
for(intj=0;j<rm;j++)
cout?mat.Mat[i][j]?>\tf;
cout?J\n;
)
cout?,zInverse=\n,z;
for(i=0;i<rm;i++)
(
for(intj=0;j<rm;j++)
cout?imat.Mat[i][j]<<'\t';
cout?,\n';
)
returnimat;
)
voidmain()//main函數(shù)中可自行更改自己想寫的程序段,我這邊寫出部分只是為了舉例
(
Matrixmatl(4,4),mat2(4,1),mat3(4,4);
matl.Input();
mat2.Input();
mat3=matl.Inv()*mat2;
mat3.Print();
)
運行結(jié)果截圖:
2因變量y是自變量x的非線性函數(shù),已得到實測數(shù)據(jù)見表2,假定y可
以用x的3次多項式近似表示,即y對x的多項式回歸模型為
23
y=bo+b?x+b2x+b3x
請求出模型蠶數(shù)b。、h、bz和b3,計算模型值ym與相對誤差r%并填入表2
中。
表2實測數(shù)據(jù)
xyymr%
-4-210
-2-20
01.1
250
5590
解題思路:將表2中實測數(shù)據(jù)帶入三次多項式,得出包含4個未知數(shù)的線性方程組:
b0+b|(-4)+b2(-4)~+b3(-4)=-210即1-4匕+16b2-64b3=-210
bo+b](_2)+ba(12)~+b(-2)*=—20-_=-
3bo2b|+4b28b320
b+b,O+bO2+bO3=l.1
o23b0=1.1
b+b2+b22+b23=50
0I23bo+2bi+4b2+8b3=5O
bo+M+b^+bj'=590鳳+5片25b2+125b:;=590
只有4個未知數(shù),而有5個獨立方程,顯然這是一個矛盾方程組,
令b=b0D=1-4-64Y=-210
bi4I-8-20
ba0I01.1
ba24850
1525125590
b稱為模型參數(shù)向量,D稱為結(jié)構(gòu)矩陣,Y稱為觀測值向量,則線性方程組可以用矩陣
方程表示為:
Db=Y
這個矛盾方程組可以用最小二乘法求出最小二乘解。
程序設計:
#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<〈〃請輸入實測數(shù)據(jù)(矩陣形式):\n〃;
for(inti=0;i<RowMax;i++)
for(intj=0;j<ColMax;j++)
cin?Mat[i][j];
intGetRowMaxO{returnRowMax;}
intGetColMaxO(returnColMax;}
voidMatrix::GetRow(constintn)
(
cout?z*\nMatrix=\nz,;
for(inti=0;i<ColMax;i++)
cout?Mat[n-l][i]?,\tf;
cout?,\n';
)
voidMatrix::GetCol(constintn)
(
constintrm=RowMax;
constintcm=0;
Matrixmatl(rm,cm);
for(inti=0;i<rm;i++)
matl.Mat[i][0]=Mat[i][n-1];
cout?/znMatrix=\n/,;
for(int1=0;KRowMax;1++)
(
cout?matl.Mat[1][0]<<?\tJ;
cout?,\n;
)
)
voidPrint()
(
cout?〃Matrix=\n〃;
for(inti=0;i〈RowMax;i++)
(
for(intj=0;j<ColMax;j++)
cout?Mat[i][j]<<,\t';
cout<<,\n;
)
)
Matrixoperator+(Matrix&m)
(
Matrixt(RowMax,ColMax);
for(inti=0;i<RowMax;i++)
for(intj=0;j<ColMax;j++)
t.Mat[i][j]=Mat[i][j]+m.Mat[i][j];
returnt;
)
Matrixoperator-(Matrix&m)
(
Matrixt(RowMax,ColMax);
for(inti=0;i<RowMax;i++)
for(intj=0;j<ColMax;j++)
t.Mat[i][j]=Mat[i]Mat[i][j];
returnt;
}
Matrixoperator*(Matrix&m)
(
Matrixt(RowMax,m.ColMax);
for(inti=0;i<RowMax;i++)
for(intj=0;j<m.ColMax;j++)
(
floatsum=0;
for(intk=0;k<ColMax;k++)
sum+=Mat[i][k]*m.Mat[k][j];
t.Mat[i][j]=sum;
)
returnt;
)
MatrixTrans();
MatrixInv();
};
MatrixMatrix::Trans()
(
constintrm=RowMax;
constintcm=ColMax;
Matrixtmat(cm-l,rm);
for(inti=0;i<cm-l;i++)
for(intj=0;j<rm;j++)
tmat.Mat[i][j]=Mat[j][i];
cout?,,Matrix,=\n〃;
for(i=0;i<cm-l;i++)
(
cout?,\tJ;
for(intj=0;j<rm;j++)
cout?tmat.Mat[i][j]<<,\t,;
cout?,\n';
}
returntmat;
MatrixMatrix::Inv()
(
constintrm=RowMax;
constintcm=ColMax;
Matriximat(rm,cm-l);
Matrixmat(rm,cm);
Matrixmatl(rm,cm);
for(inti=0;i<rm;i++)
for(intj=0;j<rm;j++)
mat.Mat[i][j]=Mat[i][j];
for(int1=0;Krm;l++)
matl.Mat[1][0]=Mat[1][cm-1];
for(i=0;i<rm;i++)
for(intj=0;j<rm;j++)
imat.Mat[i][j]=0;
for(i=0;i<rm;i++)
imat.Mat[i][i]=l;
inth,p,q,j,k;
floattemp,temp2;
for(i=0;i<rm;i++)
(
for(k=i;k<rm;k++)
(
if(mat.Mat[k][i]!=0)
(
h=k;
k=rm;
)
)
if(k==rm)
(
cout<<〃該矩陣沒有相應的逆矩陣。〃Gendl;
i=rm;
)
else
(
if(h!=i)
(
for(j=0;j<rm;j++)
mat.Mat[i][j]=mat.Mat[i][j]+mat.Mat[h][j];
matl.Mat[i][j]=matl.Mat[i][j]+matl.Mat[h][j];
imat.Mat[i][j]=imat.Mat[i][j]+imat.Mat[h][j];
)
)
temp=mat.Mat[i][i];
for(j=0;j<rm;j++)
(
mat.Mat[i][j]=mat.Mat[i][j]/temp;
matl.Mat[i][j]=matl.Mat[i][j]/temp;
imat.Mat[i][j]=imat.Mat[i][j]/temp;
}
for(p=0;p<rm;p++)
(
if(i!=p)
(
temp2=mat.Mat[p][i];
for(q=0;q<rm;q++)
(
mat.Mat[p][q]=mat.Mat[p][q]-temp2*mat.Mat[i][q];
matl.Mat[p][q]=matl.Mat[p][q]-temp2*matl.Mat[i][q];
imat.Mat[p][q]=imat.Mat[p][q]-temp2*imat.Mat[i][q];
)
)
)
}
)
if(k!=rm)
(
cout?/zanswer=\n,z;
for(l=0;l<rm;l++)
(
cout?matl.Mat[1][0]?>\t';
cout?,\n;
)
)
returnimat;
)
voidmain()
{floatbO,bl,b2,b3;
inti,j;
floatym[5],r[5];
Matrixmatl(6,2),mat3(4,6),mat4(4,4),mat5(4,5),mat6(4,1),mat7(4,1),mat8(5,5);
matl.Input();
for(i=0;i<5;i++)
(
mat8.Mat[i][0]=l;
mat8.Mat[i][l]=matl.Mat[i][0];
mat8.Mat[i][2]=matl.Mat[i][0]*matl.Mat[i][0];
mat8.Mat[i][3]=matl.Mat[i][0]*matl.Mat[i][0]*matl.Mat[i][0];
mat8.Mat[i][4]=matl.Mat[i][1];
)
cout<<“變換后:"<<endl;
for(i=0;i<5;i++)
(
for(j=0;j<4;j++)
cout<<mat8.Mat[i][j]?>W;
cout?>\n';
)
mat3=mat8.Trans();
mat5=mat3*mat8;
for(i=0;i<4;i++)
(
mat6.Mat[i][0]=mat5.Mat[i][4];
)
mat4=mat5.Inv();
mat7=mat4*mat6;
b0=mat7.Mat[0][0];
bl=mat7.Mat[1][0];
b2=mat7.Mat[2][0];
b3=mat7.Mat[3][0];
cout<〈〃回歸模型是:y=〃?b(K<〃+〃<<bl<<〃*x+〃<Xb2<<〃*x2+〃<<b3<<〃*x3〃〈<endl;
ym[0]=bO+bl*mat8.Mat[0][l]+b2*mat8.Mat[0][2]+b3*mat8.Mat[0][3];
ym[1]=bO+b1*mat8.Mat[1][1]+b2*mat8.Mat[1][2]+b3*mat8.[3];
ym[2]=bO+b1*mat8.Mat[2][l]+b2*mat8.Mat[2][2]+b3*mat8.Mat[2][3];
ym[3]=b0+bl*mat8.Mat[3][1]+b2*mat8.Mat[3][2]+b3*mat8.Mat[3][3];
ym[4]=b0+bl*mat8.Mat[4][1]+b2*mat8.Mat[4][2]+b3*mat8.Mat[4][3];
cout<<“模型值"<<endl;
for(i=0;i<4;i++)
(
cout?,/ym/,<<(i+l)?,,=z/<<ym[i]<<endl;
)
cout<<"相對誤差"<<endl;
for(i=0;i<4;i++)
rLiJ=(ymLiJ_matl.MatLiJLU)/matl.MatLiJLU;
(i+1)?/,=w?r[i]<<endl;
)
cout<<“回歸模型合理"<<endl;
)
運行結(jié)果截圖:
*E:\swl00103\T2\Debug\T2.exe*日回口
▲
1-416-64
1-24-8
1000
1248
1525125
Matrixj=
11111
-4-2025
1640425
-64-808125
answer=
1.817
1.4884
3.18194
4.01003
回歸模型是:y=l-81699+1.48845*x+3.18193*x2+4.01002*x3
模型推
yml=-209.867
yn2=-20.5124
yn3=1.81699
ym4=49.6018
相對誤差
rl=-0.000631496
r2=0.0256183
r3=0.651807
r4=-0.00796394
回歸模型合理
Pressanykeytocontinue
3請用行線性變換求下面三元一次線性方程組的解和系數(shù)矩陣的逆矩陣。
-x1+x2+x3=13
x1-x2+x3=9
x1+x2-x3=1
解題思路:本題可利用矩陣的行線性變換求解該線性方程組與逆矩陣。已知當用線性
變換把系數(shù)矩陣變換成單位矩陣時,放常數(shù)項向量的列就是方程組的解,放單位矩陣
的位置就是系數(shù)矩陣的逆矩陣。
本題中令X=X1A=-111B=13
Xz1-119
X311-11
X稱為未知數(shù)向量,A稱為系數(shù)矩陣,B稱為常數(shù)項向量。
則線性方程組可以用矩陣方程表示為:
A*X=B
用A的逆矩陣A'左乘上面矩陣方程兩邊,左邊的就變換成了單位矩陣和解的乘積,
故有
X=A'B
所以,X是方程組的解,A)是該系數(shù)矩陣的逆矩陣。
此題根據(jù)類運算做出,最先定義了一個矩陣類,然后根據(jù)其中定義的Input,Print,
相乘,矩陣求逆等函數(shù)書寫主函數(shù),先輸入系數(shù)矩陣matl,再輸入等式右邊的矩陣mat3,
將matl求逆賦予mat2再左乘mat3,即得到所要求的值xl,x2,x3.同時輸出matl的逆
矩陣mat2.
程序如下:
#include<iostream.h>
classMatrix
(
intRowMax,ColMax;
public:
float**Mat;
Matrix(intrm,intcm)〃構(gòu)造函數(shù)
(
RowMax=rm;
ColMax=cm;
Mat二newfloat*[rm];
for(inti=0;i<rm;i++)
Mat⑴=newfloat[cm];
)
~Matrix(){}〃析構(gòu)函數(shù)
voidInput()〃輸入
(
coutG〃請輸入矩陣:\n〃;
for(inti=0;i<RowMax;i++)
for(intj=0;j<ColMax;j++)
cin?Mat[i][j];
)
intGetRowMaxO{returnRowMax;}〃取矩陣的行數(shù)
intGetColMaxO{returnColMax;}//取矩陣的列數(shù)
voidMatrix::GetRow(constintn)〃取矩陣某一行的全部元素
(
cout?,zMatrix(:,/,<<n<<,/)=\n,,?,\t';
for(inti=0;i<ColMax;i++)
cout?Mat[n-l][i]?,\t);
cout?,\n;
}
voidMatrix::GetCol(constintn)〃取矩陣某一列的全部元素
cout<X"Matrix(:,”<<n<<")=\n";
for(inti=0;i<RowMax;i++)
cout<<J\t*?Mat[i][n-l]<<,\n;
)
voidPrint()〃顯示矩陣
(
cout?〃Matrix=\n〃;
for(inti=0;i<RowMax;i++)
(
for(intj=0;j<ColMax;j++)
cout?Mat[i][j]<<?\t*;
cout<<,\n';
}
)
Matrixoperator*(Matrix&m)〃矩陣乘法;可直接寫Matrix11(2,3),t2(3,2),t3(2,2);t3=tl*t2
(
Matrixt(RowMax,m.ColMax);
for(inti=0;i<RowMax;i++)
for(intj=0;j<m.ColMax;j++)
(
floatsum=0;
for(intk=0;k<ColMax;k++)
sum+=Mat[i][k]*m.Mat[k][j];
t.Mat[i][j]=sum;
}
returnt;
)
MatrixTrans();〃矩陣轉(zhuǎn)置
MatrixInv();〃矩陣求逆
};
MatrixMatrix::Trans()
(
constintrm=RowMax;
constintcm=ColMax;
Matrixtmat(cm,rm);
for(inti=0;i<cm;i++)
for(intj=0;j<rm;j++)
tmat.Mat[i][j]=Mat[j][i];
cout?/zMatrix,=\n〃;
for(i=0;i<cm;i++)
cout?,\t?;
for(intj=0;j<rm;j++)
cout<<tmat.Mat[i][j]?,\tJ;
cout?,\n;
}
returntmat;
)
MatrixMatrix::Inv()
(
constintrm=RowMax;
constintcm=ColMax;
Matriximat(rm,cm);
Matrixmat(rm,cm);
for(inti=0;i<rm;i++)
for(intj=0;j<rm;j++)
mat.Mat[i][j];
for(i=O;i<rm;i++)
for(intj=0;j<rm;j++)
imat.Mat[i][j]=0;
for(i=0;i<rm;i++)
imat.Mat[i][i]=l;
for(i=0;i<rm;i++)
(
1£(0=1^1.\^江月[H)〃若對角線上元素為0,則進行換行運算,使得對角線上
元素非零
(
intm二i;〃最大值的行下標
for(intj=0;j++)〃找到最大值的下標
if(mat.Mat[j][i]>mat.Mat[m][i])
(
m=j;
)
for(j=0;j<rm;j++)
(
floatn,x;
n二mat.Mat[i][j];
x=imat.Mat[i][j];
mat.Mat[i][j]=mat.Mat[m][j];
mat.Mat[m][j]=n;
imat.Mat[i][j]=imat.Mat[m][j];
imat.Mat[m][j]=x;
if(mat.Mat[i][i]!=1)
floatt=mat.Mat[i][i];
for(intj=0;j<rm;j++)
(
mat.Mat[i][j]=mat.Mat[i]
imat.Mat[i][Mat[i]
)
)
for(intj=0;j<rm;j++)
(
if(i!=j)
(
floatt=mat.Mat[j][i]/mat.Mat[i][i];
for(intk=0;k<rm;k++)
(
mat.Mat[j][k]-=mat.Mat[i][k]*t;
imat.Mat[j][k]-=imat.Mat[i]
)
)
)
)
cout?/zMatrix=\n,z;
for(i=0;i<rm;i++)
(
for(intj=0;j<rm;j++)
cout?mat.Mat[i][j]\tf;
cout?,\n;
)
cout<<〃Inverse=\n〃;
for(i=0;i<rm;i++)
(
for(intj=0;j<rm;j++)
cout?imat.Mat[i][j]?,\tf;
cout?,\n;
)
returnimat;
)
voidmain()〃main函數(shù)中可自行更改自己想寫的程序段,我這邊寫出部分只是為了舉例
{
Matrixmatl(3,3),mat2(3,3),mat3(3,1),mat4(3,3);
matl.Input();
mat3.Input();
mat2=matl.Inv();
mat4=mat2:4:mat3;
mat2.Print();
mat4.Print();
運行結(jié)果界面截圖
4在表1中增加兩種組分的化驗品位如表3,可以列出六個線性方程,顯
然是矛盾的方程組,請用最小二乘法求精/尾礦產(chǎn)率的最小二乘解,并填
入表3相應位置。(礦物專業(yè)必做,生物專業(yè)可選)
表3各礦流的化驗品位
礦產(chǎn)化驗品位%
率
流%PbZnSFeCd
原礦100.003.0811.9214.589.320.0162
鉛精礦Xi57.164.0821.1910.260.0075
鋅精礦
X20.7956.5631.174.750.0880
硫精礦
X32.062.9040.2441.230.0045
尾礦X40.250.734.935.190.0004
解題思路:利用礦量和五種組分的進出平衡可列出六個線性方程組:
X1+X+X+
23x4=100
57.16xt+0.79X2+2.06X3+0.25x4=3.08
4.08x,+56.56x2+2.90X3+0.73x4=11.92
21.19xt+31.17X2+40.24x3+4.93x.,=14.58
10.26xi+4.75x2+41.23x3+5.19X4=9.32
0.0075xi+0.0880x2+0.0045x3+0.0004x,,=0.0162
由于獨立方程個數(shù)多于未知數(shù)個數(shù),屬于矛盾方程組,
令
X=XiD=1111Y=100
X257.160.792.060.253.08
X34.0856.562.900.7311.92
X421.1931.1740.244.9314.58
10.264.7541.235.199.32
0.00750.08800.00450.00040.0162
X是未知數(shù)向量,D是系數(shù)矩陣,Y是常數(shù)項向量(它們的元素則用帶下標的對應小寫
字母
表示),則方程組可以用矩陣方程表示為:
D*X=Y
當獨立方程個數(shù)多于未知數(shù)時,就構(gòu)成矛盾方程組,矛盾方程組是無解的。
用最小二乘法可以合理地解決這類矛盾方程組的求解問題。最小二乘法的原理是
尋
找一組合適的解,使得方程組等號兩邊差值的平方之和達到最小值,這組解稱為最小
乘解,最小二乘解是唯一的。
對于一般的含有p未知數(shù)n個線性方程的矛盾方程組,可以構(gòu)造平方和函數(shù)Q如
nP
Q(xi,x2,...,Xp)=£(y-dZdij+Xj))~2
i=lj=l
平方和Q是未知數(shù)x“X2,...,Xp的函數(shù),若Q有極小值,則它對Xi,X2,...,X),的p
個偏導數(shù)應該等于零,由此得出的p個線性方程就能確定一組唯一的解,即矛盾方程
組的最小二乘解。
用D'表示D的轉(zhuǎn)置矩陣,令A=D'*D和B=D'*Y,最小二乘解X滿足下面的矩陣方
程:
A*X=B
這是有唯一解的線性方程組,可以用前面介紹過的線性方程組求解方法求解。A稱為
信
息矩陣,是個pxp的方陣,行列數(shù)等于未知數(shù)的個數(shù)。A的逆矩陣稱為相關矩陣,相
關矩
陣在回歸分析中檢驗各因子的顯著性時是很有用的。
矩陣A=D'*D和B=D'*Y可按式計算
n
==
aij=Xdki*dkj(il>???,P>jl,??-,p)
k=l
n
bi=£dki*yk(i=l,...,p)
k=l
程序如下:
#include<iostream.h>
classMatrix
(
intRowMax,ColMax;
public:
float**Mat;
Matrix(intrm,intcm)〃構(gòu)造函數(shù)
(
RowMax=rm;
ColMax=cm;
Mat=newfloat*[rm];
for(inti=0;i<rm;i++)
Mat[i]=newfloat[cm];
)
'Matrix(){}〃析構(gòu)函數(shù)
voidInput()〃輸入
(
cout<<〃請輸入矩陣:\n〃;
for(inti=0;KRowMax;i++)
for(intj=0;j<ColMax;j++)
cin?Mat[i][j];
)
intGetRowMaxO{returnRowMax;}〃取矩陣的行數(shù)
intGetColMaxO(returnColMax;}//取矩陣的列數(shù)
voidMatrix::GetRow(constintn)//取矩陣某一行的全部元素
cout?"Matrix(:,”<<n<<")=\n"<<'\t’;
for(inti=0;i<ColMax;i++)
cout<<Mat[n-l][i]?,\tJ;
cout?,\n';
)
voidMatrix::GetCol(constintn)〃取矩陣某一列的全部元素
(
cout<<"Matrix(:,"<<n<<")=\n";
for(inti=0;i<RowMax;i++)
cout?,\t*?Mat[i][n-l]<<,\n;
)
voidPrint()〃顯示矩陣
(
cout<X〃Matrix=\n”;
for(inti=0;KRowMax;i++)
(
for(intj=0;j<ColMax;j++)
cout?Mat[i][j]?>\t*;
cout<<,\n;
}
}
Matrixoperator*(Matrix&m)〃矩陣乘法;可直寫Matrix
tl(2,3),t2(3,2),t3⑵2);t3=tl*t2
(
Matrixt(RowMax,m.ColMax);
for(inti=0;i<RowMax;i++)
for(intj=0;j<m.ColMax;j++)
(
floatsum=0;
for(intkz:0;k<ColMax;k++)
sum+=Mat[i][k]*m.Mat[k][j];
t.Mat[i][j]=sum;
}
returnt;
)
MatrixTrans();〃矩陣轉(zhuǎn)置
MatrixInv();〃矩陣求逆
);
MatrixMatrix::Trans()
{
constintrm=RowMax;
constintcm=ColMax;
Matrixtmat(cm,rm);
for(inti=0;i<cm;i++)
for(intj=0;j<rm;j++)
tmat.Mat[i][j]=Mat[j][i];
cout?,,Matrix,=\n〃;
for(i=0;i<cm;i++)
(
cout?,\t*;
for(intj=0;j<rm;j++)
cout<<tmat.Mat[i][j]?'\t';
cout?,\n,;
)
returntmat;
)
MatrixMatrix::Inv()
(
constintrm=RowMax;
constintcm=ColMax;
Matriximat(rm,cm);
Matrixmat(rm,cm);
for(inti=0;i<rm;i++)
for(intj=0;j<rm;j++)
mat.Mat[i][j]=Mat[i][j];
for(i=0;i<rm;i++)
for(intj=0;j<rm;j++)
imat.Mat[i][j]=0;
for(i=0;i<rm;i++)
imat.Mat[i][i]=l;
for(i=0;i<rm;i++)
(
for(intj=0;j<rm;j++)
(
if(i!=j)
(
floatt=mat.Mat[j][i]/mat.Mat[i][i];
for(intk=0;k<rm;k++)
(
mat.Mat[j][k]-=mat.Mat[i][k]*t;
imat.Mat[j][k]-=imat.Mat[i][k]*t;
}
}
}
)
for(i=0;i<rm;i++)
if(mat.Mat[i][i]!=1)
(
floatt=mat.Mat[i][i];
for(intj=0;j<rm;j++)
(
mat.Mat[i][j]=mat.Mat[i][j]/t;
imat.[j]=imat.Mat[i][j]/t;
)
)
cout?,zMatrix=\nz/;
for(i=0;i<rm;i++)
(
for(intj=0;j<rm;j++)
cout?mat.Mat[i][j]<<,\t);
cout?,\n;
)
cout?〃Inverse=\n〃;
for(i=0;i<rm;i++)
(
for(intj=0;j<rm;j++)
cout<<imat.Mat[i][j]?>\t);
cout?,\n;
)
returnimat;
)
voidmain()〃main函數(shù)中可.自行更改自己想寫的程序段,我這邊寫出部分只是為了舉例
(
Matrixmatl(6,4),mat2(4,6),mat3(4,4),mat4(6,1),mat5(4,1),mat6(4,1);
matl.Input();
mat4.Input();
mat2=matl.Trans();
mat3=mat2*matl;
mat5=mat2*mat4;
mat6=mat3.Inv()*mat5;
mat6.Print();
}
運行結(jié)果界面截圖:
不"D:\s"100103\T4\Debug\I4.exe"
k0.264.7541.235.19
e.00750.00800.00450.0004
情輸入矩陣:
1003081192:L4589321.62
Matrix*=
157.164.0821.1910.260.0075
10.7956.5631.714.750.008
12.062.940.2441.230.0045
10.250.734.935.190.0004
f!atrix=
bl1.30491e-009-1.04254e-0095.54498e-012
b.91?19e-0081-6.68624e-0089.95294e-012
b.96474e-0073.18114e-00?1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電子產(chǎn)品行業(yè)科技發(fā)展趨勢及市場預測
- 2025年中國零戶統(tǒng)計管理軟件行業(yè)市場發(fā)展前景及發(fā)展趨勢與投資戰(zhàn)略研究報告
- 2025年水性塑涂料項目可行性研究報告
- 矩陣管理法在企業(yè)管理中的應用與實踐
- 水熱耦合對農(nóng)田土壤硝化微生物群落的影響
- 地方機關運行保障法律機制構(gòu)建研究
- 42CrMo4鋼熱成形中夾雜及基體的損傷研究
- 基于深度學習的多模態(tài)肺結(jié)節(jié)數(shù)據(jù)分析及預測建模
- 知識產(chǎn)權轉(zhuǎn)讓中的價值挖掘與保護策略
- 解構(gòu)主義在現(xiàn)當代粉彩繪畫創(chuàng)作中的應用研究
- 2025版大學食堂冷鏈食材配送服務合同模板3篇
- 《中醫(yī)體重管理臨床指南》
- 廣西壯族自治區(qū)公路發(fā)展中心2025年面向社會公開招聘657名工作人員高頻重點提升(共500題)附帶答案詳解
- 《中國的宗教》課件
- 2025年山東魯商集團有限公司招聘筆試參考題庫含答案解析
- 大型活動中的風險管理與安全保障
- 課題申報書:個體衰老差異視角下社區(qū)交往空間特征識別與優(yōu)化
- 江蘇省招標中心有限公司招聘筆試沖刺題2025
- 2024年防盜門銷售合同范本
- 綜采工作面過空巷安全技術措施
- 云南省麗江市2025屆高三上學期復習統(tǒng)一檢測試題 物理 含解析
評論
0/150
提交評論