// Magic Software, Inc.
// http://www.magic-software.com
// http://www.wild-magic.com
// Copyright (c) 2004. All Rights Reserved
//
// The Wild Magic Library (WML) source code is supplied under the terms of
// the license agreement http://www.magic-software.com/License/WildMagic.pdf
// and may not be copied or disclosed except in accordance with the terms of
// that agreement.
#include "WmlLinearSystem.h"
using namespace Wml;
//----------------------------------------------------------------------------
template <class Real>
Real& LinearSystem<Real>::Tolerance ()
{
return ms_fTolerance;
}
//----------------------------------------------------------------------------
template <class Real>
bool LinearSystem<Real>::Solve2 (const Real aafA[2][2], const Real afB[2],
Real afX[2])
{
Real fDet = aafA[0][0]*aafA[1][1]-aafA[0][1]*aafA[1][0];
if ( Math<Real>::FAbs(fDet) < ms_fTolerance )
return false;
Real fInvDet = ((Real)1.0)/fDet;
afX[0] = (aafA[1][1]*afB[0]-aafA[0][1]*afB[1])*fInvDet;
afX[1] = (aafA[0][0]*afB[1]-aafA[1][0]*afB[0])*fInvDet;
return true;
}
//----------------------------------------------------------------------------
template <class Real>
bool LinearSystem<Real>::Solve3 (const Real aafA[3][3], const Real afB[3],
Real afX[3])
{
Real aafAInv[3][3];
aafAInv[0][0] = aafA[1][1]*aafA[2][2]-aafA[1][2]*aafA[2][1];
aafAInv[0][1] = aafA[0][2]*aafA[2][1]-aafA[0][1]*aafA[2][2];
aafAInv[0][2] = aafA[0][1]*aafA[1][2]-aafA[0][2]*aafA[1][1];
aafAInv[1][0] = aafA[1][2]*aafA[2][0]-aafA[1][0]*aafA[2][2];
aafAInv[1][1] = aafA[0][0]*aafA[2][2]-aafA[0][2]*aafA[2][0];
aafAInv[1][2] = aafA[0][2]*aafA[1][0]-aafA[0][0]*aafA[1][2];
aafAInv[2][0] = aafA[1][0]*aafA[2][1]-aafA[1][1]*aafA[2][0];
aafAInv[2][1] = aafA[0][1]*aafA[2][0]-aafA[0][0]*aafA[2][1];
aafAInv[2][2] = aafA[0][0]*aafA[1][1]-aafA[0][1]*aafA[1][0];
Real fDet = aafA[0][0]*aafAInv[0][0] + aafA[0][1]*aafAInv[1][0] +
aafA[0][2]*aafAInv[2][0];
if ( Math<Real>::FAbs(fDet) < ms_fTolerance )
return false;
Real fInvDet = ((Real)1.0)/fDet;
for (int iRow = 0; iRow < 3; iRow++)
{
for (int iCol = 0; iCol < 3; iCol++)
aafAInv[iRow][iCol] *= fInvDet;
}
afX[0] = aafAInv[0][0]*afB[0]+aafAInv[0][1]*afB[1]+aafAInv[0][2]*afB[2];
afX[1] = aafAInv[1][0]*afB[0]+aafAInv[1][1]*afB[1]+aafAInv[1][2]*afB[2];
afX[2] = aafAInv[2][0]*afB[0]+aafAInv[2][1]*afB[1]+aafAInv[2][2]*afB[2];
return true;
}
//----------------------------------------------------------------------------
template <class Real>
bool LinearSystem<Real>::Inverse (const GMatrix<Real>& rkA,
GMatrix<Real>& rkInvA)
{
// computations are performed in-place
assert( rkA.GetRows() == rkA.GetColumns() );
int iSize = rkInvA.GetRows();
rkInvA = rkA;
int* aiColIndex = new int[iSize];
assert( aiColIndex );
int* aiRowIndex = new int[iSize];
assert( aiRowIndex );
bool* abPivoted = new bool[iSize];
assert( abPivoted );
memset(abPivoted,0,iSize*sizeof(bool));
int i1, i2, iRow = 0, iCol = 0;
Real fSave;
// elimination by full pivoting
for (int i0 = 0; i0 < iSize; i0++)
{
// search matrix (excluding pivoted rows) for maximum absolute entry
Real fMax = 0.0f;
for (i1 = 0; i1 < iSize; i1++)
{
if ( !abPivoted[i1] )
{
for (i2 = 0; i2 < iSize; i2++)
{
if ( !abPivoted[i2] )
{
Real fAbs = Math<Real>::FAbs(rkInvA[i1][i2]);
if ( fAbs > fMax )
{
fMax = fAbs;
iRow = i1;
iCol = i2;
}
}
}
}
}
if ( fMax == (Real)0.0 )
{
// matrix is not invertible
delete[] aiColIndex;
delete[] aiRowIndex;
delete[] abPivoted;
return false;
}
abPivoted[iCol] = true;
// swap rows so that A[iCol][iCol] contains the pivot entry
if ( iRow != iCol )
rkInvA.SwapRows(iRow,iCol);
// keep track of the permutations of the rows
aiRowIndex[i0] = iRow;
aiColIndex[i0] = iCol;
// scale the row so that the pivot entry is 1
Real fInv = ((Real)1.0)/rkInvA[iCol][iCol];
rkInvA[iCol][iCol] = (Real)1.0;
for (i2 = 0; i2 < iSize; i2++)
rkInvA[iCol][i2] *= fInv;
// zero out the pivot column locations in the other rows
for (i1 = 0; i1 < iSize; i1++)
{
if ( i1 != iCol )
{
fSave = rkInvA[i1][iCol];
rkInvA[i1][iCol] = (Real)0.0;
for (i2 = 0; i2 < iSize; i2++)
rkInvA[i1][i2] -= rkInvA[iCol][i2]*fSave;
}
}
}
// reorder rows so that A[][] stores the inverse of the original matrix
for (i1 = iSize-1; i1 >= 0; i1--)
{
if ( aiRowIndex[i1] != aiColIndex[i1] )
{
for (i2 = 0; i2 < iSize; i2++)
{
fSave = rkInvA[i2][aiRowIndex[i1]];
rkInvA[i2][aiRowIndex[i1]] = rkInvA[i2][aiColIndex[i1]];
rkInvA[i2][aiColIndex[i1]] = fSave;
}
}
}
delete[] aiColIndex;
delete[] aiRowIndex;
delete[] abPivoted;
return true;
}
//----------------------------------------------------------------------------
template <class Real>
bool LinearSystem<Real>::Solve (const GMatrix<Real>& rkA, const Real* afB,
Real* afX)
{
// computations are performed in-place
int iSize = rkA.GetColumns();
GMatrix<Real> kInvA = rkA;
memcpy(afX,afB,iSize*sizeof(Real));
int* aiColIndex = new int[iSize];
assert( aiColIndex );
int* aiRowIndex = new int[iSize];
assert( aiRowIndex );
bool* abPivoted = new bool[iSize];
assert( abPivoted );
memset(abPivoted,0,iSize*sizeof(bool));
int i1, i2, iRow = 0, iCol = 0;
Real fSave;
// elimination by full pivoting
for (int i0 = 0; i0 < iSize; i0++)
{
// search matrix (excluding pivoted rows) for maximum absolute entry
Real fMax = 0.0f;
for (i1 = 0; i1 < iSize; i1++)
{
if ( !abPivoted[i1] )
{
for (i2 = 0; i2 < iSize; i2++)
{
if ( !abPivoted[i2] )
{
Real fAbs = Math<Real>::FAbs(kInvA[i1][i2]);
if ( fAbs > fMax )
{
fMax = fAbs;
iRow = i1;
iCol = i2;
}
}
}
}
}
if ( fMax == (Real)0.0 )
{
// matrix is not invertible
delete[] aiColIndex;
delete[] aiRowIndex;
delete[] abPivoted;
return false;
}
abPivoted[iCol] = true;
// swap rows so that A[iCol][iCol] contains the pivot entry
if ( iRow != iCol )
{
kInvA.SwapRows(iRow,iCol);
fSave = afX[iRow];
afX[iRow] = afX[iCol];
afX[iCol] = fSave;
}
// keep track of the permutations of the rows
aiRowIndex[i0] = iRow;
aiColIndex[i0] = iCol;
// scale the row so that the pivot entry is 1
Real fInv = ((Real)1.0)/kInvA[iCol][iCol];
kInvA[iCol][iCol] = (Real)1.0;
for (i2 = 0; i2 < iSize; i2++)
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
Wild Magic Library数值计算源码 (159个子文件)
WmlMathLib.h.bak 362B
WmlLinearSystem.cpp 26KB
WmlEigen.cpp 25KB
WmlBisect3.cpp 15KB
WmlCommand.cpp 10KB
WmlSystem.cpp 9KB
WmlMinimize1.cpp 9KB
WmlMinimizeN.cpp 7KB
WmlBisect2.cpp 6KB
WmlIntegrate1.cpp 5KB
WmlPolynomialRoots.cpp 5KB
magicMathUtil.cpp 4KB
WmlOdeRungeKutta4.cpp 3KB
WmlOdeMidpoint.cpp 2KB
WmlBisect1.cpp 2KB
WmlOdeSolver.cpp 2KB
WmlOdeEuler.cpp 2KB
WmlMath.cpp 2KB
WmlVector4.cpp 1KB
WmlMatrix4.cpp 1KB
WmlVector3.cpp 1019B
WmlQuaternion.cpp 923B
WmlMatrix3.cpp 913B
WmlVector2.cpp 847B
WmlMatrix2.cpp 799B
WmlPoint4.cpp 588B
WmlPoint3.cpp 579B
WmlPoint2.cpp 570B
magicmath.dsp 9KB
magicmath.dsw 543B
WmlSystem.h 9KB
WmlMatrix3.h 6KB
WmlLinearSystem.h 6KB
WmlQuaternion.h 6KB
WmlPolynomialRoots.h 6KB
WmlMath.h 6KB
WmlGMatrix.h 5KB
WmlMatrix.h 4KB
WmlEigen.h 4KB
WmlPolynomial1.h 3KB
WmlMatrix2.h 3KB
WmlCommand.h 3KB
WmlBisect3.h 2KB
WmlVector3.h 2KB
WmlVector2.h 2KB
WmlGVector.h 2KB
WmlVector.h 2KB
WmlMatrix4.h 2KB
WmlBisect2.h 2KB
WmlBandedMatrix.h 2KB
WmlMinimizeN.h 2KB
WmlPoint.h 2KB
WmlVector4.h 1KB
WmlOdeSolver.h 1KB
WmlIntegrate1.h 1KB
WmlMinimize1.h 1KB
WmlOdeRungeKutta4.h 1KB
WmlOdeMidpoint.h 1KB
WmlPoint4.h 1KB
WmlOdeEuler.h 1KB
WmlPoint3.h 1KB
WmlPoint2.h 1KB
WmlBisect1.h 898B
WmlTuple.h 885B
WmlMathLib.h 509B
vc60.idb 233KB
vc60.idb 89KB
WmlMatrix3.inl 50KB
WmlQuaternion.inl 25KB
WmlPolynomialRootsDegN.inl 18KB
WmlMath.inl 18KB
WmlGMatrix.inl 18KB
WmlPolynomialRootsDeg4.inl 14KB
WmlMatrix.inl 14KB
WmlPolynomialRootsDeg3.inl 13KB
WmlPolynomial1.inl 13KB
WmlGVector.inl 10KB
WmlMatrix4.inl 9KB
WmlVector.inl 9KB
WmlMatrix2.inl 8KB
WmlBandedMatrix.inl 8KB
WmlVector3.inl 6KB
WmlPoint.inl 5KB
WmlVector2.inl 4KB
WmlVector4.inl 3KB
WmlPoint4.inl 3KB
WmlPoint3.inl 2KB
WmlPoint2.inl 2KB
WmlPolynomialRootsDeg2.inl 2KB
WmlSystem.inl 2KB
WmlTuple.inl 2KB
WmlPolynomialRootsDeg1.inl 1KB
magicmath.lib 964KB
magicmath_d.lib 962KB
magicmath.lib 428KB
WmlSystem.mcr 1014B
magicmath.ncb 929KB
WmlPolynomialRoots.obj 256KB
WmlLinearSystem.obj 151KB
WmlEigen.obj 138KB
共 159 条
- 1
- 2
资源评论
- hookme2011-11-10只有部分, 不完整!
krrrr
- 粉丝: 11
- 资源: 22
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 多机调度问题贪心算法:理论探索与实践应用.zip
- 探索tecreate:软件开发的未来之星.zip
- 打标机项目C#源码连接扫码
- 基于SSM的房屋租赁系统的设计与实现
- xyctf:从入门到精通的实用指南.zip
- mmqrcode1714153659780.png
- Screenshot_2024-04-27-06-08-58-486_com.baidu.xin.aiqicha.jpg
- 基于Javaweb+Tomcat+MySQL的大学生公寓管理系统+sql文件.zip
- 实训作业基于javaweb的订单管理系统源码+数据库+实训报告.zip
- 多机调度问题贪心算法基于最小堆和贪心算法求解多机调度问题.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功