下面的内容给你留言时候提示留言太长,只好发到这里了。
下面的是实际使用的拟牛顿法解非线性方程组代码,你应该去掉里面捕捉错误用的自定义例外处理代码,如何你的程序中使用固定的方程组过程,可以不用定义委托,直接把委托的过程放到拟牛顿法解非线性方程组的过程中调用即可。
Public Delegate Sub pnlfsDelegate(ByRef x() As Double, ByRef y() As Double, ByRef xio() As Double)
'定义委托
Public Sub pnlfs(ByVal N As Integer, ByRef x() As Double, ByRef y() As Double, ByVal subguoceng As pnlfsDelegate,
ByVal xio() As Double)
'拟牛顿法解非线性方程组
Dim A(N, N) As Double, p As Double, h As Double, emax As Double
Dim w As Double, eps As Double
Dim i As Integer, i0 As Integer, i1 As Integer, i2 As Integer, j As Integer, k As Integer
Dim yesno As Boolean = True
h = 0.5
w = 0.5
eps = Val(1 / (10 ^ rlmaina.jsjdszBar.Value))
emax = 1.0E+300
Try
Call subguoceng(x, y, xio)
Do
Call subguoceng(x, y, xio)
yesno = True
For i = 1 To N
If System.Math.Abs(y(i)) > eps Then
yesno = False
For i0 = 1 To N
If System.Math.Abs(y(i0)) > emax Then
pgkeyexception.Source = "<错误讯息>:error:gyzcx.pnlfs" + Chr(10)
Throw pgkeyexception
Exit Sub
End If
Next i0
For j = 1 To N
x(j) = x(j) + h
Call subguoceng(x, y, xio)
For k = 1 To N
A(k, j) = y(k)
Next k
x(j) = x(j) - h
Next j
Call subguoceng(x, y, xio)
Call gaussj(A, y, N)
p = 1.0
For i1 = 1 To N
p = p - y(i1)
Next i1
For i2 = 1 To N
x(i2) = x(i2) - y(i2) * h / p
Next i2
h = h * w
Exit For
End If
Next i
Loop While yesno = False
Catch keyException As myException
pgkeyexception.Source = pgkeyexception.Source + "<错误讯息>:error:gyzcx.pnlfs" + Chr(10)
Throw pgkeyexception
End Try
End Sub
Public Sub gaussj(ByRef A(,) As Double, ByRef b() As Double, ByRef n As Integer)
Dim i, j, k, l, ll, irow, icol As Integer
Dim IPIV(n), INDXR(n), INDXC(n) As Integer
Dim big, dum, pivinv As Double
For j = 1 To n
IPIV(j) = 0
Next j
For i = 1 To n
big = 0.0#
For j = 1 To n
If IPIV(j) <> 1 Then
For k = 1 To n
If IPIV(k) = 0 Then
If System.Math.Abs(A(j, k)) >= big Then
big = System.Math.Abs(A(j, k))
irow = j
icol = k
End If
ElseIf IPIV(k) > 1 Then
Exit Sub
End If
Next k
End If
Next j
IPIV(icol) = IPIV(icol) + 1
If irow <> icol Then
For l = 1 To n
dum = A(irow, l)
A(irow, l) = A(icol, l)
A(icol, l) = dum
Next l
dum = b(irow)
b(irow) = b(icol)
b(icol) = dum
End If
INDXR(i) = irow
INDXC(i) = icol
If A(icol, icol) = 0.0# Then
pgkeyexception.Source = "<错误讯息>:error:gyzcx.gaussj" + Chr(10)
Throw pgkeyexception
Exit Sub
End If
pivinv = 1.0# / A(icol, icol)
A(icol, icol) = 1.0#
For l = 1 To n
A(icol, l) = A(icol, l) * pivinv
Next l
b(icol) = b(icol) * pivinv
For ll = 1 To n
If ll <> icol Then
dum = A(ll, icol)
A(ll, icol) = 0.0#
For l = 1 To n
A(ll, l) = A(ll, l) - A(icol, l) * dum
Next l
b(ll) = b(ll) - b(icol) * dum
End If
Next ll
Next i
For l = n To 1 Step -1
If INDXR(l) <> INDXC(l) Then
For k = 1 To n
dum = A(k, INDXR(l))
A(k, INDXR(l)) = A(k, INDXC(l))
A(k, INDXC(l)) = dum
Next k
End If
Next l
End Sub
Public Sub llrswd()
Dim llrswdsub As New gyzcx.pnlfsDelegate(AddressOf llrswdDelegate)
pnlfs(N, x, y, llrswdsub, xio)
end sub
Sub llrswdDelegate(ByRef x() As Double, ByRef y() As Double, ByRef xio() As Double)
'在这里写方程组代码
'y(1)=......
:
:
'y(n)=......