如题,解决后马上结贴。

解决方案 »

  1.   

    只有个C的,看看是不是这个?,改写成vb还简单的吧全选主元高斯-约当消去法#include "stdlib.h"
      #include "math.h"
      #include "stdio.h"
      int agjdn(a,b,n,m)
      int n,m;
      double a[],b[];
      { int *js,l,k,i,j,is,p,q;
        double d,t;
        js=malloc(n*sizeof(int));
        l=1;
        for (k=0;k<=n-1;k++)
          { d=0.0;
            for (i=k;i<=n-1;i++)
              for (j=k;j<=n-1;j++)
                { t=fabs(a[i*n+j]);
                  if (t>d) { d=t; js[k]=j; is=i;}
                }
            if (d+1.0==1.0) l=0;
            else
              { if (js[k]!=k)
                  for (i=0;i<=n-1;i++)
                    { p=i*n+k; q=i*n+js[k];
                      t=a[p]; a[p]=a[q]; a[q]=t;
                    }
                if (is!=k)
                  { for (j=k;j<=n-1;j++)
                      { p=k*n+j; q=is*n+j;
                        t=a[p]; a[p]=a[q]; a[q]=t;
                      }
                    for (j=0;j<=m-1;j++)
                      { p=k*m+j; q=is*m+j;
                        t=b[p]; b[p]=b[q]; b[q]=t;
                      }
                  }
              }
            if (l==0)
              { free(js); printf("fail\n");
                return(0);
              }
            d=a[k*n+k];
            for (j=k+1;j<=n-1;j++)
              { p=k*n+j; a[p]=a[p]/d;}
            for (j=0;j<=m-1;j++)
              { p=k*m+j; b[p]=b[p]/d;}
            for (j=k+1;j<=n-1;j++)
              for (i=0;i<=n-1;i++)
                { p=i*n+j;
                  if (i!=k)
                    a[p]=a[p]-a[i*n+k]*a[k*n+j];
                }
            for (j=0;j<=m-1;j++)
            for (i=0;i<=n-1;i++)
              { p=i*m+j;
                if (i!=k)
                  b[p]=b[p]-a[i*n+k]*b[k*m+j];
              }
          }
        for (k=n-1;k>=0;k--)
          if (js[k]!=k)
            for (j=0;j<=m-1;j++)
              { p=k*m+j; q=js[k]*m+j;
                t=b[p]; b[p]=b[q]; b[q]=t;
              }
        free(js);
        return(1);
      }
      

  2.   

    不好意思,发错了
    实矩阵求逆的全选主元高斯-约当法
    #include "stdlib.h"
      #include "math.h"
      #include "stdio.h"
      int brinv(a,n)
      int n;
      double a[];
      { int *is,*js,i,j,k,l,u,v;
        double d,p;
        is=malloc(n*sizeof(int));
        js=malloc(n*sizeof(int));
        for (k=0; k<=n-1; k++)
          { d=0.0;
            for (i=k; i<=n-1; i++)
            for (j=k; j<=n-1; j++)
              { l=i*n+j; p=fabs(a[l]);
                if (p>d) { d=p; is[k]=i; js[k]=j;}
              }
            if (d+1.0==1.0)
              { free(is); free(js); printf("err**not inv\n");
                return(0);
              }
            if (is[k]!=k)
              for (j=0; j<=n-1; j++)
                { u=k*n+j; v=is[k]*n+j;
                  p=a[u]; a[u]=a[v]; a[v]=p;
                }
            if (js[k]!=k)
              for (i=0; i<=n-1; i++)
                { u=i*n+k; v=i*n+js[k];
                  p=a[u]; a[u]=a[v]; a[v]=p;
                }
            l=k*n+k;
            a[l]=1.0/a[l];
            for (j=0; j<=n-1; j++)
              if (j!=k)
                { u=k*n+j; a[u]=a[u]*a[l];}
            for (i=0; i<=n-1; i++)
              if (i!=k)
                for (j=0; j<=n-1; j++)
                  if (j!=k)
                    { u=i*n+j;
                      a[u]=a[u]-a[i*n+k]*a[k*n+j];
                    }
            for (i=0; i<=n-1; i++)
              if (i!=k)
                { u=i*n+k; a[u]=-a[u]*a[l];}
          }
        for (k=n-1; k>=0; k--)
          { if (js[k]!=k)
              for (j=0; j<=n-1; j++)
                { u=k*n+j; v=js[k]*n+j;
                  p=a[u]; a[u]=a[v]; a[v]=p;
                }
            if (is[k]!=k)
              for (i=0; i<=n-1; i++)
                { u=i*n+k; v=i*n+is[k];
                  p=a[u]; a[u]=a[v]; a[v]=p;
                }
          }
        free(is); free(js);
        return(1);
      }
      

  3.   

    做什么用我也看不懂,只有这些算法
    都是做数组运算,改写成vb应该没什么问题复矩阵求逆的全选主元高斯-约当法
     #include "stdlib.h"
      #include "stdio.h"
      int bcinv(ar,ai,n)
      int n;
      double ar[],ai[];
      { int *is,*js,i,j,k,l,u,v,w;
        double p,q,s,t,d,b;
        is=malloc(n*sizeof(int));
        js=malloc(n*sizeof(int));
        for (k=0; k<=n-1; k++)
          { d=0.0;
            for (i=k; i<=n-1; i++)
            for (j=k; j<=n-1; j++)
              { u=i*n+j;
                p=ar[u]*ar[u]+ai[u]*ai[u];
                if (p>d) { d=p; is[k]=i; js[k]=j;}
              }
            if (d+1.0==1.0)
              { free(is); free(js); printf("err**not inv\n");
                return(0);
              }
            if (is[k]!=k)
              for (j=0; j<=n-1; j++)
                { u=k*n+j; v=is[k]*n+j;
                  t=ar[u]; ar[u]=ar[v]; ar[v]=t;
                  t=ai[u]; ai[u]=ai[v]; ai[v]=t;
                }
            if (js[k]!=k)
              for (i=0; i<=n-1; i++)
                { u=i*n+k; v=i*n+js[k];
                  t=ar[u]; ar[u]=ar[v]; ar[v]=t;
                  t=ai[u]; ai[u]=ai[v]; ai[v]=t;
                }
            l=k*n+k;
            ar[l]=ar[l]/d; ai[l]=-ai[l]/d;
            for (j=0; j<=n-1; j++)
              if (j!=k)
                { u=k*n+j;
                  p=ar[u]*ar[l]; q=ai[u]*ai[l];
                  s=(ar[u]+ai[u])*(ar[l]+ai[l]);
                  ar[u]=p-q; ai[u]=s-p-q;
                }
            for (i=0; i<=n-1; i++)
              if (i!=k)
                { v=i*n+k;
                  for (j=0; j<=n-1; j++)
                    if (j!=k)
                      { u=k*n+j;  w=i*n+j;
                        p=ar[u]*ar[v]; q=ai[u]*ai[v];
                        s=(ar[u]+ai[u])*(ar[v]+ai[v]);
                        t=p-q; b=s-p-q;
                        ar[w]=ar[w]-t;
                        ai[w]=ai[w]-b;
                      }
                }
            for (i=0; i<=n-1; i++)
              if (i!=k)
                { u=i*n+k;
                  p=ar[u]*ar[l]; q=ai[u]*ai[l];
                  s=(ar[u]+ai[u])*(ar[l]+ai[l]);
                  ar[u]=q-p; ai[u]=p+q-s;
                }
          }
        for (k=n-1; k>=0; k--)
          { if (js[k]!=k)
              for (j=0; j<=n-1; j++)
                { u=k*n+j; v=js[k]*n+j;
                  t=ar[u]; ar[u]=ar[v]; ar[v]=t;
                  t=ai[u]; ai[u]=ai[v]; ai[v]=t;
                }
            if (is[k]!=k)
              for (i=0; i<=n-1; i++)
                { u=i*n+k; v=i*n+is[k];
                  t=ar[u]; ar[u]=ar[v]; ar[v]=t;
                  t=ai[u]; ai[u]=ai[v]; ai[v]=t;
                }
          }
        free(is); free(js);
        return(1);
      }
      

  4.   

    哎呀,不行呀,偶不懂C呀,只要VB的,哪位大哥帮忙找一下呀!
      

  5.   

    下面是:实矩阵求逆的全选主元高斯-约当法
    '**********************************************************************************
    '**模 块 名:Gauss_AX
    '**功    能:计算形如A[XY]=[BI]矩阵,本方法为:全主元高斯--约当消去法
    '**说    明:[email protected]
    '**创 建 人: 来源Fortran ;本人转化为vb
    '**日    期:2004-06-18 15:00:00
    '**修 改 人:
    '**日    期:
    '**描    述:
    '**参    数:A为实型数组;输入、输出参数,输入时按列存放实方阵A,计算结束时输出逆矩阵A-1;
    '**参    数:N为整形变量,输入参数,矩阵A的阶数;
    '**参    数:B为实型数组;输入、输出参数,输入时按列存放实方阵A,计算结束时输出解A-1 B。
    '**********************************************************************************
    Public Function Gauss_AX(ByRef A() As Double, ByVal N As Long, ByRef B() As Double) As Boolean
    Dim IA(), IR(), IC()
    Dim iRow As Long, iCol As Long
    Dim lMax As Single
    Dim I, J, K, L, LL, lTemp, pIV
    ReDim IA(1 To N)
    ReDim IR(1 To N)
    ReDim IC(1 To N)
    Gauss_AX = True
    For J = 1 To N
      IA(J) = 0
    Next
    For I = 1 To N
      lMax = 0#
      For J = 1 To N
         If IA(J) <> 1 Then
            For K = 1 To N
              If IA(K) = 0 Then
                If Abs(A(J, K)) >= lMax Then
                  lMax = Abs(A(J, K))
                  iRow = J
                  iCol = K
                End If
              ElseIf IA(K) > 1 Then
                Gauss_AX = False '计算失败
                Exit Function
              End If
            Next
         End If
       Next
       IA(iCol) = IA(iCol) + 1
       If iRow <> iCol Then
         For L = 1 To N
           lTemp = A(iRow, L)
           A(iRow, L) = A(iCol, L)
           A(iCol, L) = lTemp
         Next
         lTemp = B(iRow)
         B(iRow) = B(iCol)
         B(iCol) = lTemp
       End If
       IR(I) = iRow
       IC(I) = iCol
       If A(iCol, iCol) = 0 Then
         Gauss_AX = False '计算失败
         Exit Function
       End If
       pIV = 1# / A(iCol, iCol)
       A(iCol, iCol) = 1#
       For L = 1 To N
         A(iCol, L) = A(iCol, L) * pIV
       Next
       B(iCol) = B(iCol) * pIV
       For LL = 1 To N
         If LL <> iCol Then
           lTemp = A(LL, iCol)
           A(LL, iCol) = 0#
           For L = 1 To N
             A(LL, L) = A(LL, L) - A(iCol, L) * lTemp
           Next
           B(LL) = B(LL) - B(iCol) * lTemp
         End If
       Next
       For L = N To 1 Step -1
         If IR(L) <> IC(L) Then
           For K = 1 To N
             lTemp = A(K, IR(L))
             A(K, IR(L)) = A(K, IC(L))
             A(K, IC(L)) = lTemp
           Next
         End If
       Next
    Next
    Erase IA, IR, IC
    End Function