注册 登录
编程论坛 VB6论坛

求教VB黄金分割法求最值,不知道哪里出问题了 大神帮帮忙看看谢谢

lukiss 发布于 2013-05-29 13:08, 655 次点击
程序代码:

Public Function f(x As Long) As Long              '定义程序f
i = Val(Text2.Text)
f = (0.8 - ((1 + Sqr(i * x)) / (0.97 * x * (i + Sqr(i * x)))) ^ (1 / 3) * x) ^ 2
End Function

Private Sub Command1_Click()

Dim m As Long, n As Long, a As Long, b As Long, fm As Long, c As Long
Dim fa As Long, fb As Long, q As Long
a = 1#                                       '一级和二级传动比的比值取1~1.7
b = 1.7
q = 0.259
m = 1.2674
n = 1.4326
Do While (q > 0.01)                            '精度要求为0.01
    m = a + 0.382 * (b - a)
    n = a + 0.618 * (b - a)
    q = (n - m) / (b - a)
    If fm >= fn Then                            '新的搜索区间
       a = a
       b = n
    ElseIf fm < fn Then                         '新的搜索区间
       a = n
       b = b
    End If
    Loop
    c = (a + b) / 2                       '取中点值
   Text1.Text = c
End Sub


这是用黄金分割法求解X的值使得函数f(x)的值最小,其中i是变量(i=15~40),i是输入值
这个程序我求处理无论i是多少结果都是X=2,是错误的。
求各位大神帮看看 拜谢了!!!在线等
只有本站会员才能查看附件,请 登录
5 回复
#2
lukiss2013-05-29 13:10
只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

有图说明分别是i=15 20 25 30 35 40的图 是单峰函数在区间[1,.1.7]里
或者大神门有其他方法求? 麻烦了
#3
lukiss2013-05-29 13:27
有图说明i=15 20 25 30 35 40时 是单峰函数在区间[1,.1.7]里
或者大神门有其他方法求? 麻烦了
#4
bczgvip2013-05-29 19:14
囧啊囧,带小数点却用 Long ?是疏忽还是没经验?看来是后者了。
dim m as double
m = 1.2674 '你确定类型没错么?
#5
lukiss2013-05-29 22:49
回复 4楼 bczgvip
是没经验。。
我毕业设计要用VB编软件。。自己看书弄的
这个是看人家的一个例子改的
把Long改成Double 也出错了。。结果是1
引用的函数都没用到 没输入i结果也出来
#6
lukiss2013-05-29 22:59
回复 4楼 bczgvip
程序代码:
Public Function f(ByVal x As Double, ByVal i As Long) As Double               '定义程序f
i = Val(Text1.Text)
f = (0.8 - ((1 + Sqr(i * x)) / (0.97 * x * (i + Sqr(i * x)))) ^ (1 / 3) * x) ^ 2
End Function

Private Sub Command1_Click()

Dim m As Double, n As Double, a As Double, b As Double, fm As Double, c As Double, q As Double
a = 1#                                       '一级和二级传动比的比值取1~1.7
b = 1.7

Do While (q > 0.01)                            '精度要求为0.01
    m = a + 0.382 * (b - a)
    n = a + 0.618 * (b - a)
    q = (n - m) / (b - a)
    If fm >= fn Then                            '新的搜索区间
       a = a
       b = n
    ElseIf fm < fn Then                         '新的搜索区间
       a = n
       b = b
    End If
    Loop
    c = (a + b) / 2                       '取中点值
   Text2.Text = c
End Sub

还是引用不上前面定义的函数 哪里又出问题了 见笑了!谢谢
1