下面是我根据流程图编写的一段代码,但是运行程序无响应,不知道哪里的错误?我是学机械的,编程能力有限,还请大神们多多帮忙,帮我看一下逻辑上有什么错误吗?跪谢!
Dim Dw0 As Double, dm0 As Double, Z0 As Double, Dw1 As Double, dm1 As Double, z1 As Double, t As Double, fc As Double
Dim Dwmin As Double, dmmin As Double, Zmin As Double, Dwmax As Double, dmmax As Double, Zmax As Double
Dim wj As Double, nj As Double, kd As Double, e1 As Double, e2 As Double, p2 As Double, p1 As Double, g As Double
Dim I As Long, str1 As String, str2 As String, str3 As String, SS As Double, f1 As Double, f0 As Double
Dim FF0 As Double, FF1 As Double, tj1 As Double, tj2 As Double
wj = CDbl(Text3.Text)
nj = CDbl(Text2.Text)
kd = CDbl(Text4.Text)
'计算变量的最小值
Dwmin = 0.3 * (wj - nj)
dmmin = 0.5 * (wj + nj)
e1 = Dwmin / dmmin
g = Round(e1, 2)
p1 = (Atn(e1 / Sqr(-e1 * e1 + 1))) * 180 / 3.1415926
Zmin = (180 / 2 / p1) + 1
'计算变量的最大值
Dwmax = 0.6 * (wj - nj)
dmmax = 0.515 * (wj + nj)
e2 = Dwmin / dmmin
p2 = (Atn(e2 / Sqr(-e2 * e2 + 1))) * 180 / 3.1415926
Zmax = (186 / 2 / p2) + 1
'给三个变量赋初值
Dw0 = Dwmin
dm0 = dmmin
Z0 = Zmax
'选取载荷系数fc
Call openRs("select [fc] from zhxs_fc where [bz] = " & Round(e1, 2))
fc = rs.Fields(0)
rs.Close
'Do
I = 0
str1 =Grad_unit_1(Dw0, dm0, Z0, fc, t)
Dw1 = CDbl(Left(str1, InStrRev(str1, "%") - 1))
dm1 = Mid(str1, InStrRev(str1, "%") + 1, InStrRev(str1, "@") - InStrRev(str1, "%") - 1)
z1 = Right(str1, Len(str1) - InStrRev(str1, "@"))
SS = S(Dw1, dm1, z1, Dwmin, dmmin, Zmin, Dwmax, dmmax, Zmax)
'判断是否满足第一个收敛条件
If SS > 0.0001 Then
Do
I = I + 1
Dw0 = Dw1
dm0 = dm1
Z0 = z1
t = 0.4 * t
str2 = Grad_S(Dw0, dm0, Z0, Dwmin, dmmin, Zmin, Dwmax, dmmax, Zmax, t)
Dw1 = CDbl(Left(str2, InStrRev(str2, "%") - 1))
dm1 = Mid(str2, InStrRev(str2, "%") + 1, InStrRev(str2, "@") - InStrRev(str2, "%") - 1)
z1 = Right(str2, Len(str2) - InStrRev(str2, "@"))
If I = 1 Then
t = 0.8
str3 = Grad_unit_1(Dw0, dm0, Z0, fc, t)
Dw1 = CDbl(Left(str3, InStrRev(str3, "%") - 1))
dm1 = Mid(str3, InStrRev(str3, "%") + 1, InStrRev(str3, "@") - InStrRev(str3, "%") - 1)
z1 = Right(str3, Len(str3) - InStrRev(str3, "@"))
SS = S(Dw1, dm1, z1, Dwmin, dmmin, Zmin, Dwmax, dmmax, Zmax)
Else
SS = S(Dw1, dm1, z1, Dwmin, dmmin, Zmin, Dwmax, dmmax, Zmax)
End If
Loop Until SS <= 0.0001
f0 = f(Dw0, Z0, fc)
f1 = f(Dw1, z1, fc)
Else
f0 = f(Dw0, Z0, fc)
f1 = f(Dw1, z1, fc)
End If
tj1 = f1 - f0
'判断是否满足第二个收敛条件
If tj1 >= 10 ^ (-8) Then
FF0 = FF(Dw0, Z0, fc)
FF1 = FF(Dw1, z1, fc)
If FF1 < FF0 Then
tj2 = Sqr((Dw1 - Dw0) ^ 2 + (dm1 - dm0) ^ 2 + (Z0 - z1) ^ 2)
If tj2 <= t Then
t = (2 * t + tj2) / 3
Else
t = 0.98 * t
End If
Else
t = 0.5 * t
End If
Else
Text6.Text = Str(Dw1)
Text7.Text = Str(dm1)
Text8.Text = Str(z1)
Text9.Text = FF(Dw1, z1, fc)
End If
Loop Until tj1 < 10 ^ (-8)
End Sub
框图如下:
Dim Dw0 As Double, dm0 As Double, Z0 As Double, Dw1 As Double, dm1 As Double, z1 As Double, t As Double, fc As Double
Dim Dwmin As Double, dmmin As Double, Zmin As Double, Dwmax As Double, dmmax As Double, Zmax As Double
Dim wj As Double, nj As Double, kd As Double, e1 As Double, e2 As Double, p2 As Double, p1 As Double, g As Double
Dim I As Long, str1 As String, str2 As String, str3 As String, SS As Double, f1 As Double, f0 As Double
Dim FF0 As Double, FF1 As Double, tj1 As Double, tj2 As Double
wj = CDbl(Text3.Text)
nj = CDbl(Text2.Text)
kd = CDbl(Text4.Text)
'计算变量的最小值
Dwmin = 0.3 * (wj - nj)
dmmin = 0.5 * (wj + nj)
e1 = Dwmin / dmmin
g = Round(e1, 2)
p1 = (Atn(e1 / Sqr(-e1 * e1 + 1))) * 180 / 3.1415926
Zmin = (180 / 2 / p1) + 1
'计算变量的最大值
Dwmax = 0.6 * (wj - nj)
dmmax = 0.515 * (wj + nj)
e2 = Dwmin / dmmin
p2 = (Atn(e2 / Sqr(-e2 * e2 + 1))) * 180 / 3.1415926
Zmax = (186 / 2 / p2) + 1
'给三个变量赋初值
Dw0 = Dwmin
dm0 = dmmin
Z0 = Zmax
'选取载荷系数fc
Call openRs("select [fc] from zhxs_fc where [bz] = " & Round(e1, 2))
fc = rs.Fields(0)
rs.Close
'Do
I = 0
str1 =Grad_unit_1(Dw0, dm0, Z0, fc, t)
Dw1 = CDbl(Left(str1, InStrRev(str1, "%") - 1))
dm1 = Mid(str1, InStrRev(str1, "%") + 1, InStrRev(str1, "@") - InStrRev(str1, "%") - 1)
z1 = Right(str1, Len(str1) - InStrRev(str1, "@"))
SS = S(Dw1, dm1, z1, Dwmin, dmmin, Zmin, Dwmax, dmmax, Zmax)
'判断是否满足第一个收敛条件
If SS > 0.0001 Then
Do
I = I + 1
Dw0 = Dw1
dm0 = dm1
Z0 = z1
t = 0.4 * t
str2 = Grad_S(Dw0, dm0, Z0, Dwmin, dmmin, Zmin, Dwmax, dmmax, Zmax, t)
Dw1 = CDbl(Left(str2, InStrRev(str2, "%") - 1))
dm1 = Mid(str2, InStrRev(str2, "%") + 1, InStrRev(str2, "@") - InStrRev(str2, "%") - 1)
z1 = Right(str2, Len(str2) - InStrRev(str2, "@"))
If I = 1 Then
t = 0.8
str3 = Grad_unit_1(Dw0, dm0, Z0, fc, t)
Dw1 = CDbl(Left(str3, InStrRev(str3, "%") - 1))
dm1 = Mid(str3, InStrRev(str3, "%") + 1, InStrRev(str3, "@") - InStrRev(str3, "%") - 1)
z1 = Right(str3, Len(str3) - InStrRev(str3, "@"))
SS = S(Dw1, dm1, z1, Dwmin, dmmin, Zmin, Dwmax, dmmax, Zmax)
Else
SS = S(Dw1, dm1, z1, Dwmin, dmmin, Zmin, Dwmax, dmmax, Zmax)
End If
Loop Until SS <= 0.0001
f0 = f(Dw0, Z0, fc)
f1 = f(Dw1, z1, fc)
Else
f0 = f(Dw0, Z0, fc)
f1 = f(Dw1, z1, fc)
End If
tj1 = f1 - f0
'判断是否满足第二个收敛条件
If tj1 >= 10 ^ (-8) Then
FF0 = FF(Dw0, Z0, fc)
FF1 = FF(Dw1, z1, fc)
If FF1 < FF0 Then
tj2 = Sqr((Dw1 - Dw0) ^ 2 + (dm1 - dm0) ^ 2 + (Z0 - z1) ^ 2)
If tj2 <= t Then
t = (2 * t + tj2) / 3
Else
t = 0.98 * t
End If
Else
t = 0.5 * t
End If
Else
Text6.Text = Str(Dw1)
Text7.Text = Str(dm1)
Text8.Text = Str(z1)
Text9.Text = FF(Dw1, z1, fc)
End If
Loop Until tj1 < 10 ^ (-8)
End Sub
框图如下:
如果是死循环,要么输入值不正确、要么是代码错误,这要靠你自己去发现。
如果仅仅是循环时间长了点,如#2所言加DoEvents。按下面的方式,界面的计数器始终在刷新。
'顺便在窗体上加个 Label,假定叫 lblLoopCount'
Dim iLoopCount As Long '定义一个循环计数变量'Do
iLoopCount = iLoopCount + 1
lblLoopCount = iLoopCount
DoEvents '<- 加上这几句'
...
Loop Until ...