只有个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); }
不好意思,发错了 实矩阵求逆的全选主元高斯-约当法 #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); }
做什么用我也看不懂,只有这些算法 都是做数组运算,改写成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); }
哎呀,不行呀,偶不懂C呀,只要VB的,哪位大哥帮忙找一下呀!
下面是:实矩阵求逆的全选主元高斯-约当法 '********************************************************************************** '**模 块 名: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
#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);
}
实矩阵求逆的全选主元高斯-约当法
#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);
}
都是做数组运算,改写成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);
}
'**********************************************************************************
'**模 块 名: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