解方程组的通用VC程序.docx

上传人:b****2 文档编号:2261008 上传时间:2022-10-28 格式:DOCX 页数:15 大小:17.89KB
下载 相关 举报
解方程组的通用VC程序.docx_第1页
第1页 / 共15页
解方程组的通用VC程序.docx_第2页
第2页 / 共15页
解方程组的通用VC程序.docx_第3页
第3页 / 共15页
解方程组的通用VC程序.docx_第4页
第4页 / 共15页
解方程组的通用VC程序.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

解方程组的通用VC程序.docx

《解方程组的通用VC程序.docx》由会员分享,可在线阅读,更多相关《解方程组的通用VC程序.docx(15页珍藏版)》请在冰豆网上搜索。

解方程组的通用VC程序.docx

解方程组的通用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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1