| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 431 人关注过本帖
标题:求大神解答 算不出结果 不知道哪错了
只看楼主 加入收藏
ylg146394424
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2014-5-7
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:4 
求大神解答 算不出结果 不知道哪错了
谢谢

[ 本帖最后由 ylg146394424 于 2014-5-27 21:10 编辑 ]
2014-05-08 15:56
chen3523
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:33
帖 子:223
专家分:1165
注 册:2013-2-12
收藏
得分:5 
不知道数学公式原型,看不懂。
'无解,返回
If Abs(d) = 1 = 1 Then   ‘好似VB没这种写法

    legauss = False
   
    Exit Function
   
End If


调试失败3次后,关机睡觉,当醒来时多有收获。
2014-05-08 21:54
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:15 
修改了几处,发现求解成功(不是我看懂了算法,只是根据常识和上下文关联得到的),修改后代码如下(红色部分为修改部分):
图片附件: 游客没有浏览图片的权限,请 登录注册

Sub main()
    Dim n As Integer, nmaxit As Integer
    Dim t As Double, h As Double
    Dim s As String
    '3次方程
    n = 3
    ReDim x(n) As Double
    '初值数组
    x(1) = 1
    x(2) = 1
    x(3) = 1
    '最大迭代次数
    nmaxit = 100
    '增量及控制参数
    t = 0.1
    h = 0.1
    '求解
    If nlnewtonA(n, x, nmaxit, 0.0000001, h, t) Then
        s = ""
        For i = 1 To n
            s = s & "x(" & i & ")=" & x(i) & Chr(13)
        Next i
        MsgBox "求解成功!" & Chr(13) & Chr(13) & s
        Else
        MsgBox "求解失败"
        End If
    End Sub
    Sub func(x() As Double, y() As Double)
        y(1) = x(1) * x(1) + x(2) * x(2) + x(3) * x(3) - 1
        y(2) = 2 * x(1) * x(1) + x(2) * x(2) - 4 * x(3)
        y(3) = 3 * x(1) * x(1) - 4 * x(2) + x(3) * x(3)
    End Sub
    Public Function legauss(n As Integer, dbla() As Double, dblb() As Double) As Boolean
    '局部变量
    Dim i As Integer, j As Integer, k As Integer
    Dim nis As Integer
    ReDim njs(n) As Integer
    Dim d As Double, t As Double
    '开始求解
    For k = 1 To n - 1
        d = 0
        '归一
        For i = k To n
            For j = k To n
            t = Abs(dbla(i, j))
            If t > d Then
                d = t
                njs(k) = j
                nis = i
            End If
        Next j
    Next i
    '无解,返回
    If Abs(d) + 1 = 1 Then      
        legauss = False
        Exit Function
    End If
    '消元
    If njs(k) <> k Then
        For i = 1 To n
            t = dbla(i, k)
            dbla(i, k) = dbla(i, njs(k))
            dbla(i, njs(k)) = t
        Next i
    End If
    If nis <> k Then
        For j = k To n
            t = dbla(k, j)
            dbla(k, j) = dbla(nis, j)
            dbla(nis, j) = t
        Next j
        t = dblb(k)
        dblb(k) = dblb(nis)
        dblb(nis) = t
    End If
    d = dbla(k, k)
    For j = k + 1 To n
        dbla(k, j) = dbla(k, j) / d
    Next j
    dblb(k) = dblb(k) / d
    For i = k + 1 To n
        For j = k + 1 To n
            dbla(i, j) = dbla(i, j) - dbla(i, k) * dbla(k, j)
        Next j
        dblb(i) = dblb(i) - dbla(i, k) * dblb(k)
     Next i
Next k
d = dbla(n, n)
'无解,返回
If Abs(d) + 1 = 1 Then     '这里感谢2楼的提示
    legauss = False
    Exit Function
End If
'回代
dblb(n) = dblb(n) / d
For i = n - 1 To 1 Step -1
    t = 0
    For j = i + 1 To n
        t = t + dbla(i, j) * dblb(j)
    Next j
    dblb(i) = dblb(i) - t
Next i
'调整解的次序
njs(n) = n
For k = n To 1 Step -1
    If njs(k) <> k Then
    t = dblb(k)
    dblb(k) = dblb(njs(k))
    dblb(njs(k)) = t
    End If
Next k
'求解成功
legauss = True
End Function
Function nlnewtonA(n As Integer, x() As Double, nmaxit As Integer, eps As Double, h As Double, t As Double) As Boolean
      Dim i As Integer, j As Integer, l As Integer
      Dim am As Double, z As Double, beta As Double, d As Double
      ReDim y(n) As Double, a(n, n) As Double, b(n) As Double
      l = nmaxit                                 '最大迭代次数
      am = 1 + eps                   '精度控制
      While (am >= eps)                  '迭代求解
      Call func(x, b)                         '函数值
      am = 0
      For i = 1 To n
        z = Abs(b(i))
        If (z > am) Then am = z
        Next i
        If (am >= eps) Then
        l = l - 1
        '达到最大迭代次数,精度未到达要求,求解失败,返回
        If (l = 0) Then
        nlnewtonA = False
        Exit Function
        End If
        For j = 1 To n
        z = x(j)
        x(j) = x(j) + h
        Call func(x, y)
           For i = 1 To n
        a(i, j) = y(i)
            Next i
        x(j) = z
        Next j
        '高斯消元失败,求解失败,返回
        If Not legauss(n, a, b) Then
            nlnewtonA = False
            Exit Function
        End If
        beta = 1
        For i = 1 To n
            beta = beta - b(i)
        Next i
        '方程求解失败,返回
        If (Abs(beta) + 1 = 1) Then
            nlnewtonA = False
            Exit Function
        End If
        d = h / beta
        For i = 1 To n
            x(i) = x(i) - d * b(i)
        Next i
        h = t * h
        End If
    Wend
    '方程求解成功, 返回
    nlnewtonA = True
    End Function


[ 本帖最后由 xzlxzlxzl 于 2014-5-9 09:42 编辑 ]
2014-05-09 09:40
ylg146394424
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2014-5-7
收藏
得分:0 
回复 2 楼 chen3523
数学方程太复杂 我也没看懂 这完全是从书上调用的两个函数 不过还是非常感谢您的回复
2014-05-09 12:57
ylg146394424
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2014-5-7
收藏
得分:0 
回复 3 楼 xzlxzlxzl
谢谢您的回帖  主要vb也不太会 从书上调用的函数 谢谢哈
2014-05-09 13:00
快速回复:求大神解答 算不出结果 不知道哪错了
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012313 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved