78 lines
2.4 KiB
Text
78 lines
2.4 KiB
Text
Function determinant(matrix() As Double) As Double
|
|
Dim As long n=Ubound(matrix,1),sign=1
|
|
Dim As Double det=1,s=1
|
|
Dim As Double b(1 To n,1 To n)
|
|
For c As long=1 To n
|
|
For d As long=1 To n
|
|
b(c,d)=matrix(c,d)
|
|
Next d
|
|
Next c
|
|
#macro pivot(num)
|
|
For p1 As long = num To n - 1
|
|
For p2 As long = p1 + 1 To n
|
|
If Abs(b(p1,num))<Abs(b(p2,num)) Then
|
|
sign=-sign
|
|
For g As long=1 To n
|
|
Swap b(p1,g),b(p2,g)
|
|
Next g
|
|
End If
|
|
Next p2
|
|
Next p1
|
|
#endmacro
|
|
For k As long=1 To n-1
|
|
pivot(k)
|
|
For row As long =k To n-1
|
|
If b(row+1,k)=0 Then Exit For
|
|
Var f=b(k,k)/b(row+1,k)
|
|
s=s*f
|
|
For g As long=1 To n
|
|
b((row+1),g)=(b((row+1),g)*f-b(k,g))/f
|
|
Next g
|
|
Next row
|
|
Next k
|
|
For z As long=1 To n
|
|
det=det*b(z,z)
|
|
Next z
|
|
Return sign*det
|
|
End Function
|
|
|
|
'CRAMER COLUMN SWAPS
|
|
Sub swapcolumn(m() As Double,c() As Double,_new() As Double,column As long)
|
|
Redim _new(1 To Ubound(m,1),1 To Ubound(m,1))
|
|
For x As long=1 To Ubound(m,1)
|
|
For y As long=1 To Ubound(m,1)
|
|
_new(x,y)=m(x,y)
|
|
Next y
|
|
Next x
|
|
For z As long=1 To Ubound(m,1)
|
|
_new(z,column)=c(z)
|
|
Next z
|
|
End Sub
|
|
|
|
Sub solve(mat() As Double,rhs() As Double,_out() As Double)
|
|
redim _out(Lbound(mat,1) To Ubound(mat,1))
|
|
Redim As Double result(Lbound(mat,1) To Ubound(mat,1),Lbound(mat,1) To Ubound(mat,1))
|
|
Dim As Double maindeterminant=determinant(mat())
|
|
If Abs(maindeterminant) < 1e-12 Then Print "singular":Exit Sub
|
|
For column As Long=1 To Ubound(mat,1)
|
|
swapcolumn(mat(),rhs(),result(),column)
|
|
_out(column)= determinant(result())/maindeterminant
|
|
Next
|
|
End Sub
|
|
|
|
|
|
|
|
Dim As Double MainMat(1 To ...,1 To ...)={{2,-1,5,1}, _
|
|
{3,2,2,-6}, _
|
|
{1,3,3,-1}, _
|
|
{5,-2,-3,3}}
|
|
|
|
Dim As Double rhs(1 To ...)={-3,-32,-47,49}
|
|
|
|
Redim ans() As Double
|
|
solve(MainMat(),rhs(),ans())
|
|
|
|
For n As Long=1 To Ubound(ans)
|
|
Print Csng(ans(n))
|
|
Next
|
|
Sleep
|