搜索附件  
头雁微网 附件中心 技术应用 情报信息 发布一款矩阵求解器: MatrixSolve.dll
板块导航
附件中心&附件聚合2.0
For Discuz! X3.5 © hgcad.com

发布一款矩阵求解器: MatrixSolve.dll

 

发布一款矩阵求解器:
本帖最后由 kerbcurb 于 2010-12-21 13:15 编辑

阵求解器
0
用于求解M s = b这样的线性方程组,row表示方阵M的阶数。数据类型双精度。矩阵可以ROW X ROW存储即多行多列存储,也可以1 X ROW^2也就是1行多列存储。
void Solvef ( float * * M, int row, float *b, float * & s );
//------------------------------------------------------------------------------------------------------------------------------
void Solved ( double * * M, int row,double * b, double * & s );
//------------------------------------------------------------------------------------------------------------------------------
void Solveld ( long double * * M, int row,long double * b, double * & s );
//------------------------------------------------------------------------------------------------------------------------------
void Solvedl ( double * M, int row,double * b, double * & s );
//----------------------------------------------------------------------------------------------------------------------------
1
工程文件需要包含:#include "windows.h",然后把MatrixSolve.dll文件复制到你的工程文件夹下。在需要使用求解器的地方写上:

typedef void ( *TSolve) ( double*, int, double*, double *& );

HINSTANCE handle;
FARPROC lpFarProc;
TSolve Solve;
handle= LoadLibrary( "MatrixSolve.dll");
if( handle == NULL )
{
FreeLibrary ( handle );
}
else
{
lpFarProc = GetProcAddress ( handle, "Solvedl" );
//使用Solvedl还是Solved或者其他的,看你的矩阵存储类型
Solve = TSolve ( lpFarProc );
// A X = B方阵A的阶数是ROWX是待求未知数
Solve( A, ROW, B, X );
FreeLibrary ( handle );
}
2
如果生成文件时提示fatal   error   LNK1107:…….
FAT32系统分区的问题,如果你的硬盘式用NTFS就没有问题。。。解决方法:项目à项目属性à配置属性à清单工具à使用FAT32解决方法为
3
我一般使用多行多列存储系数矩阵,这里的例子使用1行多列存储,似乎二者并不影响求解时间。我感觉多行多列存储系数矩阵稍微快一点,但是有的人的说法与我恰好相反,不知道他们使用的是什么求解器。

{:7_1257:}
本帖最后由 kerbcurb 于 2010-12-20 11:09 编辑

我的空间里面的:http://www.mwtee.com/home-space-uid-18294-do-blog-id-1203.html 介绍过另一种求解器,比这个慢70倍左右。以下是他的代码
  1. //--------------------------------------------------------------
  2. int Gauss ( double a[], double b[], int n )
  3. {
  4.     int *js, l, k, i, j, is, p, q;
  5.     double d, t;
  6.     js = ( int* ) malloc ( n * sizeof ( int ) );
  7.     l = 1;
  8.     for ( k = 0; k <= n - 2; k++ )
  9.     {
  10.         d = 0.0;
  11.         for ( i = k; i <= n - 1; i++ )
  12.             for ( j = k; j <= n - 1; j++ )
  13.             {
  14.                 t = fabs ( a[i*n+j] );
  15.                 if ( t > d )
  16.                 {
  17.                     d = t;
  18.                     js[k] = j;
  19.                     is = i;
  20.                 }
  21.             }
  22.         if ( d + 1.0 == 1.0 ) l = 0;
  23.         else
  24.         {
  25.             if ( js[k] != k )
  26.                 for ( i = 0; i <= n - 1; i++ )
  27.                 {
  28.                     p = i * n + k;
  29.                     q = i * n + js[k];
  30.                     t = a[p];
  31.                     a[p] = a[q];
  32.                     a[q] = t;
  33.                 }
  34.             if ( is != k )
  35.             {
  36.                 for ( j = k; j <= n - 1; j++ )
  37.                 {
  38.                     p = k * n + j;
  39.                     q = is * n + j;
  40.                     t = a[p];
  41.                     a[p] = a[q];
  42.                     a[q] = t;
  43.                 }
  44.                 t = b[k];
  45.                 b[k] = b[is];
  46.                 b[is] = t;
  47.             }
  48.         }
  49.         if ( l == 0 )
  50.         {
  51.             free ( js );
  52.             printf ( "Gauss funtion failed 1...\n" );
  53.             return ( 0 );
  54.         }
  55.         d = a[k*n+k];
  56.         for ( j = k + 1; j <= n - 1; j++ )
  57.         {
  58.             p = k * n + j;
  59.             a[p] = a[p] / d;
  60.         }
  61.         b[k] = b[k] / d;
  62.         for ( i = k + 1; i <= n - 1; i++ )
  63.         {
  64.             for ( j = k + 1; j <= n - 1; j++ )
  65.             {
  66.                 p = i * n + j;
  67.                 if ( a[i*n+k] != 0 && a[k*n+j] != 0 )
  68.                     a[p] -= a[i*n+k] * a[k*n+j];
  69.             }
  70.             if ( a[i*n+k] != 0 && b[k] != 0 )
  71.                 b[i] -= a[i*n+k] * b[k];
  72.         }
  73.     }
  74.     d = a[ ( n-1 ) *n+n-1];
  75.     if ( fabs ( d ) + 1.0 == 1.0 )
  76.     {
  77.         free ( js );
  78.         printf ( "Gauss funtion failed 2...\n" );
  79.         return ( 0 );
  80.     }
  81.     b[n-1] = b[n-1] / d;
  82.     for ( i = n - 2; i >= 0; i-- )
  83.     {
  84.         t = 0.0;
  85.         for ( j = i + 1; j <= n - 1; j++ )
  86.             if ( a[i*n+j] != 0 && b[j] != 0 )
  87.                 t += a[i*n+j] * b[j];
  88.         b[i] = b[i] - t;
  89.     }
  90.     js[n-1] = n - 1;
  91.     for ( k = n - 1; k >= 0; k-- )
  92.         if ( js[k] != k )
  93.         {
  94.             t = b[k];
  95.             b[k] = b[js[k]];
  96.             b[js[k]] = t;
  97.         }
  98.     free ( js );
  99.     return ( 1 );
  100. }
复制代码


我只能飘过了,呵呵
学习啦,敢问楼主用什么方法求解的啊?
这要顶起!{:7_1234:}
博客介绍是主高斯消元法?这个没有这么快速度啊
本帖最后由 kerbcurb 于 2010-12-20 23:46 编辑

回复 cem-uestc 的帖子

与那个代码有很大区别,他的那个代码在本主题帖子上面也贴出来了,他的代码应该有很多地方可以优化
本帖最后由 kerbcurb 于 2010-12-20 23:11 编辑

这里发布的DLL偏重于求解满阵存储的稀疏矩阵,如果满阵里面0元素少的话,要慢一些.这里发布的是去年许诺给一个朋友,说是给他做一个动态链接库,因为我感觉我的代码速度还不错,他用的是Fortran语言,结果做好后忘了给他。
DLL使用的方法与博客里面有限元那里贴出的代码不一样。
希望见到用fortran的朋友的反馈结果,因为fortran对数组的存储方式与c/c++不一样。
测试过的,请给出参考意见,以及与其他求解器的比较结果等。目前还没做好写一个稀疏矩阵存储以及求解的方案,筹划中...
你这个和我们搞计算电磁学的差距应该是很大的,用高斯消元之类的算法,效率太低了。楼主你试试解一个100000*100000的矩阵看看效率如何?
回复 二月的风 的帖子

你说的很对,希望见到有人发布更高效的
回复 kerbcurb 的帖子

呵呵,我们做计算电磁学的人,都是每人负责一块的,就是有人专门研究求解器的,所以效率高点,其实国外有很多开源库的,已经做得很好的,如果好好找找就会发现……
实不相瞒,我发现了很多,总感觉那是别人的东西用起来没有那么理直气壮,仿佛别人家的东西挺好,总不能偷偷拿来用吧。当然拿来用大部分时候也不会引起什么,只是不喜欢。
回复 kerbcurb 的帖子

呵呵,这个不是偷偷的问题,这个就是术业有专攻的问题。人家就是研究这个的东西的,况且这个是开源,不存在版权问题。如果你什么东西都自己编,那你的代码效率肯定不会很高,毕竟你要把各部分都做好是不可能的事情。
如果什么都用别人的,估计什么也做不好!现在好的东西太多了,未见几个在这些好的基础上做出什么更好的成绩,国内计算电磁学界有多少不是在重复外人做过的东西呢,课题重复也没有什么,是不是比原先的更先进?
客服中心 搜索
关于我们
关于我们
关注我们
联系我们
帮助中心
资讯中心
企业生态
社区论坛
服务支持
资源下载
售后服务
推广服务
关注我们
官方微博
官方空间
官方微信
返回顶部