解方程组的通用VC程序.docx
《解方程组的通用VC程序.docx》由会员分享,可在线阅读,更多相关《解方程组的通用VC程序.docx(15页珍藏版)》请在冰豆网上搜索。
![解方程组的通用VC程序.docx](https://file1.bdocx.com/fileroot1/2022-10/28/1eb04581-14fb-462e-a689-a322d441aaf3/1eb04581-14fb-462e-a689-a322d441aaf31.gif)
解方程组的通用VC程序
本文中通过,直接解方程和迭代解方程两种方法实现了对方程组的求解,实现了对唯一解合最小二乘解的求法,并通过了实例验证。
给出了程序源码。
最终实现函数:
VoidWeiYiJie()//唯一解的实例
{
//方程形式:
ax1+bx2+cx3=d,a、b、c、d为向量
inti=0;
doubleHEADL[3][4]={
{1.0000000,3.0000000,4.0000000,6.0000000},
{2.0000000,1.0000000,4.0000000,3.0000000},
{5.0000000,6.0000000,2.0000000,1.0000000}};
CMatrixMethodsloveR;
intm=3,n=3;
doublea[10]={0};
intnn=0;
doublee[20]={0};
for(i=0;i<10;i++)
{
a[i]=1;
}
//hhhe
SolveResultDieDai(&HEADL[0][0],a,m,n,nn,e);
TRACE(L"\n");
for(i=0;i{
TRACE(L"%0.8f\n",a[i]);
}
TRACE(L"\n");
}
运行结果:
直接解:
-1.29629630
0.85185185
1.18518519
迭代解:
-1.29629630
0.85185185
1.18518519
VoidWeiYiJie()//超定方程的最小二乘解实例
{////方程形式:
ax1+bx2=c,a、b、c为向量
inti=0;
doubleHEADL1[12][3]={
{0.0000000,0.0000000,0.0000000},
{1.2505800,62.466469,49.950000},
{2.4917458,248.97524,99.920000},
{3.7416651,561.06268,149.95000},
{4.9912442,997.74971,199.90000},
{6.2235389,1555.0134,249.86000},
{11.159454,5016.8443,449.56000},
{12.390666,6190.3765,499.60000},
{13.622296,7486.1327,549.55000},
{14.847737,8901.9607,599.55000},
{16.074345,10440.126,649.49000},
{17.285916,12090.807,699.46000}};
CMatrixMethodsloveR;
m=12,n=2;
memset(a,0,sizeof(a));
for(i=0;i<10;i++)
{
a[i]=1;
}
//hhhe
SolveResultDieDai(&HEADL1[0][0],a,m,n,nn,e);
TRACE(L"\n");
for(i=0;i{
TRACE(L"%0.10f\n",a[i]);
}
TRACE(L"\n");
}
直接解:
39.9585718081
0.0007080380
迭代解:
39.9585718081
0.0007080380
///////////////////////////////////////////////////////////////////////////////////////////////////
//函数SolveResult:
解方程
//pRelativeCMatrix:
方程系数增广矩阵例如:
对于方程组a1*x1+a2*x2+a3*x3=c则pRelative=[a1,a2,a3,c]
//pResult:
为方程的解,若:
pRelative=[a1,a2,a3,c]则pResult=[x1,x2,x3];
//m:
为方程个数
//n:
为未知数个数
//返回值:
:
方程组有唯一解1:
无穷多解2:
方程组无解-1:
最小二乘解
///////////////////////////////////////////////////////////////////////////////////////////////
intCDataFit:
:
SolveResult(double*pRelativeCMatrix,double*pResult,intm,intn)
{
inti=0,j=0,t=0,k=0;
intnnNum=m*(n+1);
double*ju_zhen1=newdouble[nnNum];//求解会改变pRelative的值,因此新建一个
memcpy(ju_zhen1,pRelativeCMatrix,sizeof(double)*nnNum);
//把矩阵阶梯化
inttt=0;
for(intl=0;l{
for(inth=tt;h{
if(ju_zhen1[h*(n+1)+l]==0)
{
continue;
}
if(ju_zhen1[h*(n+1)+l]!
=0&&h>tt)
{
doublea=0;
for(inti=0;i{
a=-1*ju_zhen1[h*(n+1)+i];
ju_zhen1[h*(n+1)+i]=ju_zhen1[tt*(n+1)+i];
ju_zhen1[tt*(n+1)+i]=a;
}
}
for(inti=tt+1;i{
if(ju_zhen1[i*(n+1)+l]!
=0)
{
for(intt=n;t>l;t--)
{
ju_zhen1[i*(n+1)+t]=ju_zhen1[i*(n+1)+t]-ju_zhen1[i*(n+1)+l]*ju_zhen1[tt*(n+1)+t]/ju_zhen1[tt*(n+1)+l];
}
ju_zhen1[i*(n+1)+l]=0;
}
}
tt=tt+1;
}
}
//以下是找出系数矩阵与增广矩阵的秩,比较大小判断解的情况
intxishu_zhi=0,zengguang_zhi=0;
//求系数矩阵秩
intm1=0;
if(m>n)
{
m1=n;
}
for(inti=0;i{
for(intj=i;j{
if(ju_zhen1[i*(n+1)+j]!
=0)
{
xishu_zhi=xishu_zhi+1;
break;
}
}
}
//求增广矩阵秩
if(m>n+1)
{
m1=n+1;
}
for(inti=0;i{
for(intj=i;j{
if(ju_zhen1[i*(n+1)+j]!
=0)
{
zengguang_zhi=zengguang_zhi+1;
break;
}
}
}
if(xishu_zhi{
if(xishu_zhi==n)//超定方程求唯一最小二乘解
{
for(i=0;i{
for(j=0;j{
ju_zhen1[i*(n+1)+j]=0.0;
}
}
for(i=0;i{
for(j=0;j{
for(k=0;k{
ju_zhen1[i*(n+1)+j]+=(pRelativeCMatrix[k*(n+1)+j]*pRelativeCMatrix[k*(n+1)+i]);
}
}
}
//把矩阵阶梯化
inttt=0;
for(intl=0;l{
for(inth=tt;h{
if(ju_zhen1[h*(n+1)+l]==0)
{
continue;
}
if(ju_zhen1[h*(n+1)+l]!
=0&&h>tt)
{
doublea=0;
for(inti=0;i{
a=-1*ju_zhen1[h*(n+1)+i];
ju_zhen1[h*(n+1)+i]=ju_zhen1[tt*(n+1)+i];
ju_zhen1[tt*(n+1)+i]=a;
}
}
for(inti=tt+1;i{
if(ju_zhen1[i*(n+1)+l]!
=0)
{
for(intt=n;t>l;t--)
{
ju_zhen1[i*(n+1)+t]=ju_zhen1[i*(n+1)+t]-ju_zhen1[i*(n+1)+l]*ju_zhen1[tt*(n+1)+t]/ju_zhen1[tt*(n+1)+l];
}
ju_zhen1[i*(n+1)+l]=0;
}
}
tt=tt+1;
}
}
//还原回阶梯化后的值,为解最小二乘的转换方程做准备
memcpy(pRelativeCMatrix,ju_zhen1,sizeof(double)*nnNum);
for(t=0;t{
//每次都先恢复系数矩阵
memcpy(ju_zhen1,pRelativeCMatrix,sizeof(double)*nnNum);
for(k=0;k{
ju_zhen1[k*(n+1)+t]=pRelativeCMatrix[k*(n+1)+n];//再把常数列赋值给某一列
}
//求行列式的值
inttt=0;
for(intl=0;l{
for(inth=tt;h